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

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

所属分类:技术应用 来源: 丁老师原创 更新时间:2025-10-08 09:04 浏览: 1866 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无法直接提取,需要额外单独处理。


标签:

相关文章

网页Iframe读取PDF文件的参数设置

在网页中读取和显示PDF文件,可以使用Iframe加载,只需要在iframe的src中设置pdf地址即可,如:<iframe src="pdf地址" </iframe 通过iframe加载pdf,不但可以...

OpenMRS系统介绍

OpenMRS(Open Medical Record System)是一个全球性的电子健康记录(EHR)平台,是全球具有影响力的电子医疗记录系统,专注于医疗记录管理,尤其在发展中国家医疗信息化项目中应用广泛,是医疗领域软件的权威代表。...

Wordpress如果没有登录就看不到新文章...

在使用wordpress网站cms中,有同学提问,他的网站必须登录了才可以查看到新文章内容,如果没有登录,查看到的还是之前几个月的内容,这是怎么回事呢?经过丁老师分析和排查,发现该网站,使用了wordpress的WP Fastest C...

Linux服务器连接数增加后挂掉的故障分析和...

有同学咨询,他们公司的一台服务器,是一台Linux用作负载均衡的服务器,最近在使用过程中,随着连接数的增加,服务器突然挂掉了,这是怎么回事呢?今天丁老师就这个问题做一下解答。故障分析服务器:Linux用途:负载均衡服务故障情况:用户连接...

推荐文章

fontawesome所有图标class类名...

fontawesome所有图标class类名单,适用于4.7.0版本。总计有593个图标class类(包含别名):fa-500pxfa-address-bookfa-address-book-ofa-address-cardfa-addre...

国外VPS购买后如何登录?

国外很多VPS购买后,只有密码,没有登录账号,如何登录呢?我们以one.com为例,购买了VPS后,只能设置密码,但是用root,也无法登录,是怎么回事呢?查了官方文档,原来修改的VPS密码,不是root的,这个VPS默认的账号是admin...

丁老师软件推出图片在线加水印功能

丁老师软件,推出图片在线加水印功能,支持图片和PDF文件加水印,可以添加文字水印、图片水印,文字水印支持调整文字大小、文字颜色、位置、透明度等,添加水印后可以自动生成文件,可以下载。在线添加图片水印地址https://www.dls6.co...

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

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