有一个需求,需要提取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无法直接提取,需要额外单独处理。
很多客户的微信小程序,上架后没有被搜索到,这是怎么回事呢?微信小程序上架后多久能被搜索到呢?针对这个问题,丁老师今天进行一下解读。首先,微信小程序在上架前,先要保证完成认证和备案,没有认证和备案的小程序,是无法被搜索到的。微信小程序搜索...
最近有做前端的小伙伴咨询丁老师,网站中使用的不是只有css吗?怎么现在还有Less和Scss,这些都是什么,和CSS有什么区别呢?今天丁老师介绍一下。CSSCSS就是传统的网站样式表,是Cascading Style Sheet的缩写,...
经常有同学提问,公众号绑定的域名链接,访问时提示“无法确认该网页的安全性,请谨慎访问”,这是怎么回事?如何解决呢?如图:这是一个被问及比较多的问题,也是一个比较普遍的情况,今天丁老师就这个问题的原因,以及解决方法,来进行分析和解答。问:...
有客户咨询丁老师,他们目前有一款安卓APP,想转为鸿蒙应用,以适配在鸿蒙手机和华为电脑上,想问下安卓的APP可以转为鸿蒙应用吗?大概需要多少钱呢?由于近期咨询相关问题的人太多,丁老师针对这个问题做一下解答。安卓APP可以转为鸿蒙应用吗?...
国外很多VPS购买后,只有密码,没有登录账号,如何登录呢?我们以one.com为例,购买了VPS后,只能设置密码,但是用root,也无法登录,是怎么回事呢?查了官方文档,原来修改的VPS密码,不是root的,这个VPS默认的账号是admin...
普通账号个人认证号企业认证号蓝色认证标识薯条推广聚光平台效果广告普通应商业合作以KOL/KOC身份和品牌合作以品牌方身份发起起合作开设店铺个人店铺或个体户(不支持港澳台公司申请)旗舰店店或专卖店(支持港澳台公司申请)主动私信每天10位陌生用...
上一期我们讲到了《微信小程序发布后多久可以能被搜索到?》,我们已经知道了微信小程序在上架后,多久能被搜索到的一个时间范围。本期我们讲一下,微信小程序被搜索,如何提升排名,是搜索结果靠前的方法。首先,微信小程序的搜索结果排名,并没有一个固定的...
这几年AI技术的发展已经达到新的高度,从提高个人生产力到企业操作效率的各个方面,AI都扮演着不可或缺的角色。无论是进行语言交流、内容创作、或是任务管理,都有相应的AI工具可以帮助我们更加轻松地完成工作。以下是丁老师觉得不错的AI工具推荐,希...