使用Java提取PDF中的文字的三种常见方法

 更新时间:2025年06月30日 09:54:05   作者:2401_89793006  
这篇文章主要介绍了Java中提取PDF文本的三种方法:ApachePDFBox(普通PDF,轻量易用)、iText(复杂格式,功能强大)、TesseractOCR(扫描版,需OCR识别),并给出各场景下的推荐选择,需要的朋友可以参考下

使用 Java 提取 PDF 中的文字

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

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

1. 使用 Apache PDFBox 提取 PDF 文本

1.1 添加 Maven 依赖

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.27</version>
</dependency>

1.2 代码示例

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 依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.1.17</version>
</dependency>

2.2 代码示例

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 依赖

<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>4.5.5</version>
</dependency>

3.2 代码示例

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 进行识别。

到此这篇关于使用Java提取PDF中的文字的三种常见方法的文章就介绍到这了,更多相关Java提取PDF文字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud Gateway路由表配置实现小结

    SpringCloud Gateway路由表配置实现小结

    SpringCloudGateway通过路由表将请求转发到不同的服务或地址,每个路由包含id、uri、predicates和filters等字段,下面就来介绍一下SpringCloud Gateway路由如何配置,感兴趣的可以了解一下
    2026-01-01
  • SpringBoot启动报错Failed to configure a DataSource解决方案

    SpringBoot启动报错Failed to configure a DataSource解决方案

    SpringBoot应用启动时出现Failed to configure a DataSource错误,通常是由于数据库配置缺失或不当导致,解决方案分三种情况,下文将介绍对应方法,根据实际需求选择对应方案即可解决问题,需要的朋友可以参考下
    2025-10-10
  • GateWay动态路由与负载均衡详细介绍

    GateWay动态路由与负载均衡详细介绍

    这篇文章主要介绍了GateWay动态路由与负载均衡,GateWay支持自动从注册中心中获取服务列表并访问,即所谓的动态路由
    2022-11-11
  • SpringCloud使用FFmpeg对视频压缩处理的代码示例

    SpringCloud使用FFmpeg对视频压缩处理的代码示例

    在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务,FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等,本文将通过Java代码示例,向您展示如何使用FFmpeg进行视频压缩,并介绍相关参数的设置
    2024-11-11
  • Java通过导出超大Excel文件解决内存溢出问题

    Java通过导出超大Excel文件解决内存溢出问题

    导出excel是咱Java开发的必备技能,下面这篇文章主要给大家介绍了关于Java通过导出超大Excel文件解决内存溢出问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • SpringBoot MyBatis简单快速入门例子

    SpringBoot MyBatis简单快速入门例子

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。这篇文章主要介绍了SpringBoot MyBatis快速入门-简单例子,需要的朋友可以参考下
    2021-07-07
  • Spring获取Cookie和Session(@CookieValue()和@SessionAttribute())

    Spring获取Cookie和Session(@CookieValue()和@SessionAttribute())

    本文主要介绍了Spring获取Cookie和Session(@CookieValue()和@SessionAttribute()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • Java基础之Thymeleaf的简单使用

    Java基础之Thymeleaf的简单使用

    这篇文章主要介绍了Java基础之Thymeleaf的简单使用,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 深入剖析springBoot中的@Scheduled执行原理

    深入剖析springBoot中的@Scheduled执行原理

    这篇文章主要介绍了springBoot中的@Scheduled执行原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • springboot3整合远程调用的过程解析

    springboot3整合远程调用的过程解析

    远程过程调用主要分为:服务提供者,服务消费者,通过连接对方服务器进行请求交互,来实现调用效果,这篇文章主要介绍了springboot3整合远程调用,需要的朋友可以参考下
    2023-06-06

最新评论