PDFBox + Tess4J 从PDF中提取图片OCR识别文字

发布于:2025-07-02 ⋅ 阅读:(17) ⋅ 点赞:(0)

说明

记录一个完整的 Java 示例,展示如何使用 PDFBox + Tess4J 从 PDF 中提取图片,并通过 OCR 识别图片中的文字,当前仅仅支持基础功能。

功能说明

  • 读取一个 PDF 文件
  • 将每一页渲染成图片(高分辨率)
  • 使用 Tess4J 对每一页图片进行 OCR
  • 打印识别结果

maven依赖

<!-- PDFBox -->
<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.30</version>
</dependency>

<!-- Tess4J -->
<dependency>
  <groupId>net.sourceforge.tess4j</groupId>
  <artifactId>tess4j</artifactId>
  <version>5.11.0</version>
</dependency>

示例代码

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PdfOcrExample {

    public static void main(String[] args) {
        String pdfPath = "your.pdf"; // 你的PDF路径
        String tessDataPath = "tessdata"; // OCR语言包路径

        try {
            // 加载 PDF 文档
            PDDocument document = PDDocument.load(new File(pdfPath));
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            int pageCount = document.getNumberOfPages();

            // 初始化 Tesseract OCR
            Tesseract tesseract = new Tesseract();
            tesseract.setDatapath(tessDataPath); // tessdata 文件夹路径
            tesseract.setLanguage("chi_sim");    // 语言设置(chi_sim 为简体中文)

            for (int page = 0; page < pageCount; ++page) {
                // 渲染每一页为高分辨率图像(300 DPI)
                BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300);

                // 可选:保存为中间图片文件
                File imageFile = new File("page_" + page + ".png");
                ImageIO.write(image, "png", imageFile);

                // OCR 识别
                String text = tesseract.doOCR(imageFile);

                // 打印结果
                System.out.println("===== 第 " + (page + 1) + " 页识别结果 =====");
                System.out.println(text);
            }

            document.close();
        } catch (IOException | TesseractException e) {
            e.printStackTrace();
        }
    }
}

说明

  • renderImageWithDPI(…, 300) 建议使用 300 DPI 提高识别精度。
  • chi_sim 为简体中文语言包(chi_sim.traineddata),必须放在 tessdata 目录下。
  • PDF 页数多或内容复杂时,可以加进度显示或分页保存

打印效果:
在这里插入图片描述

语言包下载

https://github.com/tesseract-ocr/tessdata
下载所需 .traineddata 文件(如 chi_sim.traineddata),放到 tessdata/ 目录下

总结

这种java提取方式只是能用,无法完整识别pdf中表格数据将进行结构化抓取,只能作为实验性功能。

如果要更加准确性提取pdf文件中数据需要借助OCR的大模型。
参考: https://github.com/Yuliang-Liu/MonkeyOCR
在线: http://vlrlabmonkey.xyz:7685/


网站公告

今日签到

点亮在社区的每一天
去签到