阅读PDF文本和/或所有内容

时间:2013-02-24 18:22:27

标签: java pdf file-io pdfbox apache-tika

我有一个场景,我需要一个Java应用程序才能从以下两种模式之一中提取PDF文件中的内容:TEXT_ONLYALL。在文本模式中,只有可见文本(“可见”,就像人正在阅读PDF一样)被读出为字符串。在所有模式中,从文件中读取所有内容(文本,图像等)。

例如,如果一个PDF文件中有1个页面,并且该页面有3个连续文本段落,并且包装了2个图像,那么TEXT_ONLY将提取所有3个段落,{ {1}}将提取所有3个段落和两个图像:

ALL

我知道Apache Tika使用了PDFBox,但我担心Tika会遮蔽/禁止这种功能(在这种情况下,我可能需要直接从PDFBox中执行此操作)。

所以我问:这可能,如果是这样,哪个库更适合我使用?我完全是错误的做法吗?我不在考虑任何陷阱/警告?

1 个答案:

答案 0 :(得分:1)

为了解释为什么@markStephens会指出一些资源给出一些PDF的背景知识。

  

在文本模式下,只有可见文本(“可见”,就像人正在阅读PDF一样)被读出为字符串。

你的定义“可见”就好像一个人在阅读PDF 还没有明确定义:

  • 文字1 pt的大小是否可见?放大时,人类可以阅读它;但是,在标准放大倍数下没有。哪个大小是限制?

  • 背景为(128,128,128)的RGB(128,129,128)中的文字是否可见?颜色有多么不同?

  • 文字是否在某些其他白噪声图案的背景上以某些白噪声图案显示?模式有多么不同?

  • 文字是否仅部分在屏幕上可见?如果是的话,一个可见像素是否足够?那个可见页面区域适合字母点的巨大尺寸的'I'怎么样?

  • 某些注释所涵盖的文本如何易于移动,甚至可能是文件中的一些自动执行的JavaScript代码?

  • 某些可选内容组中的文字仅在打印时可见?

... *

我希望大多数可用的PDF文本解析库忽略所有这些情况并提取文本,至多尊重裁剪框。如果图像中添加了不可见的OCR文本,则需要提取该文本。

  

例如,如果一个PDF文件中有1个页面,并且该页面有3个连续文本段落,并且包装了2个图像,那么TEXT_ONLY将提取所有3个段落,而ALL将提取所有3个段落段落和两个图像:

PDF(一般情况下)不知道段落,只是位于页面某处的一些字形组。识别段落是一项无法保证正常工作的任务,因为工作中有启发式方法。此外,如果您的多列文本具有不规则的分离,甚至可能在其间有一些图像(很难确定是否有两列被图像分割,或者是否有一列带有集成图像),您可以依赖对文本流的识别更不用说段落,部分等文本元素惨遭失败了。

如果您的PDF被正确标记或者由工具链生成,所创建的PDF内容流中的模式会背叛文本结构,那么您可能会更幸运。但是,如果是后者,则必须为该工具链定制解决方案。

  

但我担心Tika会遮蔽/禁止这种功能(在这种情况下,我可能需要直接从pdfBox执行此操作)。

您指向另一个兴趣点:PDF可以标记为禁止文本提取,否则任何人都可以显示。虽然技术上标记为类似的PDF可以像只有一个解码步骤的文档一样处理(基本上它们是用公知的密码加密),但这样做显然违背了作者的声明意图并侵犯了他的版权。 / p>

  

所以我问:这是可能的,如果是的话,哪个库更适合我使用?我完全是错误的做法吗?我不在考虑任何陷阱/警告?

只要您期望通用输入的准确率达到100%,就应该重新考虑您的架构。

如果您拥有所有PDF,并且有效的解决方案是可以的,另一方面,您可以使用多个可能的库,iText和PDFBox,但有两个可供选择。哪种方式最适合您取决于更多因素,例如:是否需要某些通用解决方案或所有PDF都是由上述工具链创建的。

在任何情况下,你都必须自己做一些编程,然后根据你的用例对它们进行微调。