Skip to content

基于apache pdfbox的轻量级pdf解析器,支持正则匹配/坐标定位,注解声明式配置,自动映射PDF到Java对象,全流程监听机制可自定义监听操作

Notifications You must be signed in to change notification settings

foldn/pdfparser-lite

Repository files navigation

PDF Parser Lite

一个轻量级、低侵入性的PDF解析工具,支持文本提取、表格识别、OCR等功能。

项目架构

pdfparser-parent/
├── pdfparser-core # 核心解析模块
├── pdfparser-extension # 扩展功能模块
└── pdfparser-test # 测试demo模块

核心模块说明

1. pdfparser-core

  • 实现PDF解析的核心功能
  • 采用构建者模式和工厂模式
  • 提供注解支持,实现声明式PDF解析配置
  • 支持字段映射、解析规则配置等功能
  • 负责格式转换功能
  • 支持JSON、XML等多种输出格式
  • 可扩展的转换器接口设计
  • 主要注解:@PdfField @@PdfProcessor
  • 主要组件:
    • PdfReader: PDF读取接口
    • ParseOptions: 解析配置类
    • ParseContext: 解析上下文
    • ParseEventListener: 事件监听接口
    • PdfProcessor: 指定处理器
    • Converter:格式转化器接口

2. pdfparser-extension

  • 提供额外功能扩展
  • OCR支持
  • 高级表格识别等特性

特性

  • 基本文本提取
  • 注解支持
  • 事件监听机制
  • 可拓展的文本处理器
  • 可扩展的转换器
  • 表格识别与提取
  • 元数据提取
  • 支持加密PDF
  • OCR支持
  • 批量处理支持
  • 异步处理支持

快速开始

Maven依赖

<dependency>
<groupId>com.example.pdfparser</groupId>
<artifactId>pdfparser-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>

基本使用(详见pdfparser-test模块)

// 定义数据模型类
@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);

About

基于apache pdfbox的轻量级pdf解析器,支持正则匹配/坐标定位,注解声明式配置,自动映射PDF到Java对象,全流程监听机制可自定义监听操作

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published