无法在 Java 中读取生成的 pdf 文件文本

Posted

技术标签:

【中文标题】无法在 Java 中读取生成的 pdf 文件文本【英文标题】:Cannot read generated text of pdf file in Java 【发布时间】:2019-04-21 14:57:02 【问题描述】:

我正在尝试阅读 Java 中的文本,但效果不佳。 这是我的代码

PDFTextStripper pdfStripper = null;
PDDocument pdDoc = null;
COSDocument cosDoc = null;
File pdfFile = new File("1.pdf");
PDFParser parser = new PDFParser(new RandomAccessFile(pdfFile,"rw"));
parser.parse();
cosDoc = parser.getDocument();
pdfStripper = new PDFTextStripper();
pdDoc = new PDDocument(cosDoc);
pdfStripper.setStartPage(1);
pdfStripper.setEndPage(5);
String parsedText = pdfStripper.getText(pdDoc);
System.out.println(parsedText);

但是结果是这样的

请稍候...

如果此消息最终没有被文档的正确内容替换,您的 PDF 查看器可能无法显示此类文档。

您可以通过以下方式升级到最新版本的适用于 Windows®、Mac 或 Linux® 的 Adob​​e Reader 访问http://www.adobe.com/go/reader_download。

有关 Adob​​e Reader 的更多帮助,请访问http://www.adobe.com/go/acrreader。

Windows 是 Microsoft Corporation 在美国和/或其他国家/地区的注册商标或商标。 Mac是商标 苹果公司,在美国和其他国家注册。 Linux 是 Linus Torvalds 在美国和其他国家的注册商标 国家。

我发现这个错误是因为 xfa pdf 文档而发生的。 但我不知道我的 pdf 文档的 xfa 格式。 所以请告诉我如何知道 xfa 格式。

请有人帮助我。 谢谢!

【问题讨论】:

你能分享你的程序生成的PDF文件吗? 抱歉,该 pdf 文件包含我的一些业务信息,因此我无法分享。它包含输入字段、按钮和复选框。你对这个问题有任何想法吗?当我用 Adob​​e Reader 打开它时它显示正确 可能是 xfa 形式,PDFBox 不支持。 谢谢。是的,它是 xfa 表格。我认为 PDFBox 支持 xfa 表单。 ***.com/questions/10536334/combining-xfa-with-pdfbox 但是,在我的代码中,它不起作用... “支持”只是为了检索 XML 组件。 【参考方案1】:

总结一下 cmets 中所说或暗示的内容......

OP引用的文字,

请稍候...

如果此消息最终没有被文档的正确内容替换,您的 PDF 查看器可能无法显示此类文档。

...

是 Adob​​e 软件通常以纯 XFA 形式放入 PDF 中的单个 PDF 页面的内容。

XFA 表单构成了在 PDF 中描述表单的另一种方式。与 AcroForm 方式相比,XFA 表单仅使用 PDF 作为信封,携带 XML 流,以与任何其他 PDF 结构无关的方式描述表单的属性、行为和值。

因此,许多 PDF 处理器仅提供对 XFA 表单的基本支持(或根本不提供),主要的例外是(显然)Adobe 产品。

因此,XFA 在当前 PDF 规范 ISO 32000-2 中被标记为已弃用。


对于 PDFBox,XFA 支持仅限于检索 XFA XML 数据的功能。使用 PdfTextStripper 和相关类的文本提取仅对常规 PDF 内容进行操作,因此仅检索 OP 报告的文本。

要访问 XFA 表单的内容,您可以使用 PDAcroForm.getXFA() 检索 XFA 资源。

【讨论】:

以上是关于无法在 Java 中读取生成的 pdf 文件文本的主要内容,如果未能解决你的问题,请参考以下文章

java 已经获取pdf代码,如何把他pdf文件保存到本机 要求用输出流做

用python操作PDF文件

在java中从PDF中提取文本的最佳方法

怎么用java读取pdf文件内容

java jxls操作excel,怎么把富文本框的内容转换成excel格式的内容

java 中简述使用流进行读写文本文件的步骤?