一个轻量级、低侵入性的PDF解析工具,支持文本提取、表格识别、OCR等功能。
pdfparser-parent/
├── pdfparser-core # 核心解析模块
├── pdfparser-extension # 扩展功能模块
└── pdfparser-test # 测试demo模块
- 实现PDF解析的核心功能
- 采用构建者模式和工厂模式
- 提供注解支持,实现声明式PDF解析配置
- 支持字段映射、解析规则配置等功能
- 负责格式转换功能
- 支持JSON、XML等多种输出格式
- 可扩展的转换器接口设计
- 主要注解:
@PdfField
@@PdfProcessor
- 主要组件:
PdfReader
: PDF读取接口ParseOptions
: 解析配置类ParseContext
: 解析上下文ParseEventListener
: 事件监听接口PdfProcessor
: 指定处理器Converter
:格式转化器接口
- 提供额外功能扩展
- OCR支持
- 高级表格识别等特性
- 基本文本提取
- 注解支持
- 事件监听机制
- 可拓展的文本处理器
- 可扩展的转换器
- 表格识别与提取
- 元数据提取
- 支持加密PDF
- OCR支持
- 批量处理支持
- 异步处理支持
<dependency>
<groupId>com.example.pdfparser</groupId>
<artifactId>pdfparser-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
// 定义数据模型类
@Data
@PdfProcessor(processor = InvoiceProcessor.class)
public class Invoice {
/**
* 发票号码
*/
@PdfField(pattern = "发票号码:(\\d+)", group = 1)
private String invoiceNumber;
/**
* 开票信息
*/
@PdfField(pattern = "开票日期:([\\d]{4}年[\\d]{2}月[\\d]{2}日)", group = 1)
private String invoiceDate;
/**
* 购买方名称
*/
@PdfField(pattern = "购\\s*名称[::]\\s*(.*?)\\s+销", group = 1)
private String buyerName;
/**
* 购买方统一社会信用代码/纳税人识别号
*/
@PdfField(prefix = "统一社会信用代码/纳税人识别号:", suffix = "信")
private String buyerTaxNumber;
}
//特殊文本处理
public class InvoiceProcessor implements DocumentProcessor<Invoice> {
@Override
public Invoice process(String text, Class<Invoice> targetClass) {
Invoice invoice = createInstance(targetClass);
// 解析基本字段
processBasicFields(invoice, text);
// 解析商品明细
processDetails(invoice, text);
return invoice;
}
}
// 创建解析配置
ParseOptions options = ParseOptions.builder()
.maintainLayout(true) // 保持原始布局
.build();
// 创建解析事件监听器
ParseEventListener listener = new ParseEventListener() {
@Override
public void onBeforeParse(ParseContext context) {
System.out.println("开始解析PDF");
}
@Override
public void onAfterParse(ParseContext context) {
System.out.println("PDF解析完成");
}
@Override
public void onError(Exception e, ParseContext context) {
System.err.println("解析出错: " + e.getMessage());
}
};
// 创建PDF读取器
PdfReader reader = PdfReaderBuilder.builder()
.withListener(listener)
.withOptions(options)
.build();
// 读取PDF文件,(该文件为示例,需使用真正的发票pdf)
File pdfFile = new File("pdfparser-test/src/main/resources/example1.pdf");
List<Invoice> invoices = reader.read(pdfFile, Invoice.class, options);
// 创建PdfData对象
PdfData pdfData = new PdfData();
pdfData.setData(invoices.get(0));
pdfData.setMetadata(reader.getContext().getContext());
pdfData.setText((String) reader.getContext().getAttribute("rawText"));
// 转换为JSON
JsonConverter converter = new JsonConverter();
String json = converter.convert(pdfData);
// 输出结果
System.out.println("解析结果:");
System.out.println(json);