一个轻量级、低侵入性的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);