使用 Java 提取 PDF 中的文字

使用 Java 提取 PDF 中的文字

在日常开发中,我们经常需要从 PDF 文件中提取文本,比如用于文档分析、搜索功能、数据挖掘等。本篇文章将介绍三种常见的方法:

  • Apache PDFBox(适用于大部分 PDF)
  • iText(支持复杂格式 PDF)
  • Tesseract OCR(适用于扫描版 PDF)

1. 使用 Apache PDFBox 提取 PDF 文本

1.1 添加 Maven 依赖

xml 复制代码
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.27</version>
</dependency>

1.2 代码示例

java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.IOException;

public class PDFTextExtractor {
    public static void main(String[] args) {
        String pdfPath = "sample.pdf";  // 替换为你的 PDF 文件路径
        try (PDDocument document = PDDocument.load(new File(pdfPath))) {
            PDFTextStripper pdfStripper = new PDFTextStripper();
            String text = pdfStripper.getText(document);
            System.out.println("提取的文本内容:\n" + text);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1.3 说明

  • PDDocument.load(File):加载 PDF 文件。
  • PDFTextStripper.getText(document):提取文本。
  • 适用于大部分 PDF,但如果 PDF 采用了图片格式(扫描版),无法提取。

2. 使用 iText 提取 PDF 文本

2.1 添加 Maven 依赖

xml 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.1.17</version>
</dependency>

2.2 代码示例

java 复制代码
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import java.io.File;
import java.io.IOException;

public class ITextPDFTextExtractor {
    public static void main(String[] args) {
        String pdfPath = "sample.pdf";  // 替换为你的 PDF 文件路径
        try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfPath))) {
            StringBuilder extractedText = new StringBuilder();
            for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
                extractedText.append(PdfTextExtractor.getTextFromPage(pdfDoc.getPage(i))).append("\n");
            }
            System.out.println("提取的文本内容:\n" + extractedText);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.3 说明

  • PdfReader(pdfPath):加载 PDF 文件。
  • PdfTextExtractor.getTextFromPage(pdfDoc.getPage(i)):逐页提取文本。
  • 适用于大部分 PDF,支持更复杂的文本解析。

3. 使用 Tesseract OCR 处理扫描版 PDF

如果 PDF 是扫描版(仅包含图片),需要 OCR 识别文本。

3.1 添加 Maven 依赖

xml 复制代码
<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>4.5.5</version>
</dependency>

3.2 代码示例

java 复制代码
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class OCRPDFExtractor {
    public static void main(String[] args) throws IOException, TesseractException {
        String pdfPath = "scanned.pdf";  // 替换为你的 PDF 文件路径
        PDDocument document = PDDocument.load(new File(pdfPath));
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        Tesseract tesseract = new Tesseract();
        tesseract.setDatapath("tessdata");  // 设置 Tesseract 训练数据路径
        tesseract.setLanguage("eng");  // 设置语言

        StringBuilder extractedText = new StringBuilder();
        for (int i = 0; i < document.getNumberOfPages(); i++) {
            BufferedImage image = pdfRenderer.renderImage(i);
            extractedText.append(tesseract.doOCR(image)).append("\n");
        }
        document.close();
        System.out.println("OCR 提取的文本内容:\n" + extractedText);
    }
}

3.3 说明

  • PDFRenderer.renderImage(i):将 PDF 页转换为图片。
  • tesseract.doOCR(image):执行 OCR 识别文本。
  • 适用于无可选文本的扫描版 PDF。

4. 总结

方法 适用场景 主要特点
Apache PDFBox 普通 PDF 轻量、易用,适用于大部分 PDF
iText 复杂格式 PDF 功能强大,适合更复杂的文本解析
Tesseract OCR 扫描版 PDF 需要 OCR 识别,适用于无文本层的 PDF

推荐选择:

  • 普通文本 PDF :使用 PDFBoxiText
  • 复杂格式 PDF :推荐 iText
  • 扫描版 PDF :使用 Tesseract OCR 进行识别。

通过上述方法,你可以根据不同的 PDF 类型选择合适的方式来提取文本。如果有任何问题或改进建议,欢迎留言交流!🚀

相关推荐
西瓜本瓜@几秒前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
UFIT几秒前
Python函数与模块笔记
开发语言·python
言之。1 分钟前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
机智的人猿泰山1 分钟前
java kafka
java·开发语言·kafka
Algorithm157631 分钟前
谈谈接口和抽象类有什么区别?
java·开发语言
YiSLWLL32 分钟前
使用Tauri 2.3.1+Leptos 0.7.8开发桌面小程序汇总
python·rust·sqlite·matplotlib·visual studio code
细心的莽夫1 小时前
SpringCloud 微服务复习笔记
java·spring boot·笔记·后端·spring·spring cloud·微服务
花酒锄作田1 小时前
[flask]自定义请求日志
python·flask
264玫瑰资源库2 小时前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏
SsummerC3 小时前
【leetcode100】组合总和Ⅳ
数据结构·python·算法·leetcode·动态规划