首页 > 原创文章 > 技术应用 > 查看文章

在Java中使用PDFBox来提取PDF中的文本

所属分类:技术应用 来源: 丁老师原创 更新时间:2025-10-08 09:04 浏览: 433 IP属地: 深圳
点击阅读全文

有一个需求,需要提取PDF中表格的文本,项目是java环境,这个问题归属于"Java提取PDF文本"这一类。Java提取pdf文本的方法有很多,也有很多第三方库。丁老师使用的是Apache PDFBox,是Apache的第三方库,开源免费,功能强大,支持对PDF的创建、修改、加密、内容提取、图片解析等功能。

使用PDFBox提取PDF的方式如下:

一、添加Maven依赖

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

二、实现代码

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.IOException;

public class PDFTextExtractor {

    /**
     * 提取整个PDF文件的文本内容
     * @param pdfFilePath PDF文件路径
     * @return 提取到的文本内容
     * @throws IOException 处理文件时可能出现的异常
     */
    public static String extractAllText(String pdfFilePath) throws IOException {
        //加载PDF文档
        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            //检查文档是否被加密
            if (document.isEncrypted()) {
                throw new IOException("PDF文档已加密,无法提取文本");
            }
            
            //创建PDFTextStripper实例
            PDFTextStripper stripper = new PDFTextStripper();
            
            //提取所有文本
            return stripper.getText(document);
        }
    }

    /**
     * 提取PDF中指定页码范围的文本
     * @param pdfFilePath PDF文件路径
     * @param startPage 起始页码(从1开始)
     * @param endPage 结束页码
     * @return 提取到的文本内容
     * @throws IOException 处理文件时可能出现的异常
     */
    public static String extractTextByPageRange(String pdfFilePath, int startPage, int endPage) throws IOException {
        try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
            if (document.isEncrypted()) {
                throw new IOException("PDF文档已加密,无法提取文本");
            }
            
            //验证页码范围
            int totalPages = document.getNumberOfPages();
            if (startPage < 1 || endPage > totalPages || startPage > endPage) {
                throw new IllegalArgumentException("无效的页码范围,总页数: " + totalPages);
            }
            
            PDFTextStripper stripper = new PDFTextStripper();
            //设置提取的页码范围
            stripper.setStartPage(startPage);
            stripper.setEndPage(endPage);
            
            return stripper.getText(document);
        }
    }

    public static void main(String[] args) {
        String pdfPath = "example.pdf"; //替换为你的PDF文件路径
        
        try {
            //提取所有文本
            String allText = extractAllText(pdfPath);
            System.out.println("=== 所有文本内容 ===");
            System.out.println(allText.substring(0, Math.min(allText.length(), 500))); // 只打印前500字符
            
            //提取指定页码范围的文本(示例:第1-2页)
            String pageRangeText = extractTextByPageRange(pdfPath, 1, 2);
            System.out.println("\n=== 第1-2页文本 ===");
            System.out.println(pageRangeText.substring(0, Math.min(pageRangeText.length(), 500)));
            
        } catch (IOException e) {
            System.err.println("提取文本失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

三、代码说明
PDFTextStripper函数是PDFBox中专门用于提取文本的类,支持各种文本提取需求。

主要方法:
extractAllText():提取 PDF 中所有页面的文本
extractTextByPageRange():提取指定页码范围内的文本。

功能特点:
1.支持自动处理文本的排版和换行。
2.支持设置提取的页码范围。
3.会检查文档是否加密,加密文档需要先解密才能提取。

四、注意事项
1.对于由扫描生成的PDF,因为这个文件是扫描的图片格式,所以PDFTextStripper无法提取文本。对于图片类的文件,可以使用OCR(图片文字提取)类工具进行内容提取。
2.涉及复杂排版的PDF,如学术类文章、包含计算公式等,提取到的文本可能会出现顺序错乱的情况。
3.涉及较大文件提取时,可能会速度过慢并占用系统资源,可以使用分页提取,并在提取后释放资源。
4.某些特殊字体或加密的PDF无法直接提取,需要额外单独处理。


相关文章

如何使用Google Gemini大模型?

GoogleGemini是一款非常强大的AI大语言模型,由google公司出品,支持包括中文语言在内的超过40种语言处理,在中文内容的处理方面,个人感觉比国内的大模型要优秀一些(主要是生成的内容质量、语义语法、内容重复性、文章结构等几个...

nacos,txlcn,xxl-job,ar...

有同学在群里问了,在开发架构中,经常遇到nacos,txlcn,xxl-job,ares,canal这些东西?到底是些什么,都是做什么用的呢?今天丁老师就给你们解答。首先,这些都属于java程序中,开发分布式架构的一些常用中间件,具体的...

Bagisto安装环境配置要求

Bagisto一个功能强大的电商平台系统,采用Laravel框架和Vue.js开发,支持前后端分离,适用于跨境电商、海外电商平台等行业。Bagisto的安装对系统和环境有特定的要求,具体如下:服务器:CPU:建议4核以上配置;内存:建议...

Spring,Spring Cloud,Sp...

很多想学java的新同学,经常问丁老师,java的spring,springcloud,springboot都是些什么东东呀?感觉傻傻分不清楚呢?今天丁老师就给你们解答。首先,spring,springcloud,springboot都...

推荐文章

linux使用lnmp套件安装后打卡默认站点...

最近要在某单位内网部署项目,使用了lnmp来配置环境,软件安装成功,可安装后不管是打开ip地址还是默认站点,都提示nginx403forbidden,这是怎么回事呢?首先,已经出现了nginx403提示,说明nginx是安装正常的。其次,4...

关闭edge浏览器自带image viewe...

挺不错的浏览器,强加入了edgeimageviewer图片浏览器,感觉不是那么好,对于开发者来说,更想要原生的东西。包括微信网页版里的表情图片,用edgeimageviewer打开的话,无法保存为gif格式,即使保存了,也只是第一帧静态的。...

二维码可以存储多少个信息?

二维码码有三个参数:数据类型、大小(“像素”数)和纠错级别。能存储多少信息也取决于这些参数。例如,纠错级别越低,可存储的信息越多,但代码越难被读者识别。最大尺寸和最小纠错值如下:最大字符数7089个字符(纯数字)字母数字4296个字符(字母...

AI工具大全:好用的AI工具推荐(持续更新中...

这几年AI技术的发展已经达到新的高度,从提高个人生产力到企业操作效率的各个方面,AI都扮演着不可或缺的角色。无论是进行语言交流、内容创作、或是任务管理,都有相应的AI工具可以帮助我们更加轻松地完成工作。以下是丁老师觉得不错的AI工具推荐,希...