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

相关推荐
大刀爱敲代码44 分钟前
基础算法01——二分查找(Binary Search)
java·算法
追风少年1553 小时前
常见中间件漏洞之一 ----【Tomcat】
java·中间件·tomcat
yang_love10113 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
郑州吴彦祖7724 小时前
【Java】UDP网络编程:无连接通信到Socket实战
java·网络·udp
mqwguardain4 小时前
python常见反爬思路详解
开发语言·python
spencer_tseng4 小时前
eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true
java·jvm·eclipse
_庄@雅@丽4 小时前
(UI自动化测试web端)第二篇:元素定位的方法_xpath扩展(工作当中用的比较多)
python·ui自动化元素定位·xpath元素定位
鱼樱前端4 小时前
mysql事务、行锁、jdbc事务、数据库连接池
java·后端
Hanson Huang5 小时前
23种设计模式-外观(Facade)设计模式
java·设计模式·外观模式·结构型设计模式
Hanson Huang5 小时前
23种设计模式-生成器(Builder)设计模式
java·设计模式·生成器模式