使用 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 类型选择合适的方式来提取文本。如果有任何问题或改进建议,欢迎留言交流!🚀

相关推荐
tjc199010053 分钟前
Golang怎么实现分布式定时任务_Golang如何保证集群中定时任务不重复执行【进阶】
jvm·数据库·python
卷心菜狗4 分钟前
Python进阶--网络编程入门
python
人道领域5 分钟前
【LeetCode刷题日记】1047:双栈法与双指针法巧妙消除相邻重复字符
java·算法·leetcode·职场和发展
小脑斧1235 分钟前
Adobe PDF 编辑器 破截一键激火
adobe·pdf
XLYcmy6 分钟前
2026游戏安全技术竞赛-PC客户端安全-初赛 求解起点到终点的最短路径
windows·python·网络安全·dfs·bfs·游戏安全·曼哈顿距离
尘埃落定wf11 分钟前
FastAPI 鉴权怎么写?中间件和依赖注入一次说清楚
python·中间件·fastapi
2301_7735536211 分钟前
构建 Go CLI 应用的最佳实践:纯 Go 交互式命令行库选型与使用指南
jvm·数据库·python
qq_3729069314 分钟前
c#如何添加按钮点击事件_c#添加按钮点击事件的几种常见用法
jvm·数据库·python
2301_8176722619 分钟前
JavaScript 中高效定位二维数组间不匹配元素的行列索引
jvm·数据库·python
2401_8314194421 分钟前
golang如何实现验证码图片生成_golang验证码图片生成实现实战
jvm·数据库·python