我有一个场景,我需要一个Java应用程序才能从以下两种模式之一中提取PDF文件中的内容:TEXT_ONLY
或ALL
。在文本模式中,只有可见文本(“可见”,就像人正在阅读PDF一样)被读出为字符串。在所有模式中,从文件中读取所有内容(文本,图像等)。
例如,如果一个PDF文件中有1个页面,并且该页面有3个连续文本段落,并且包装了2个图像,那么TEXT_ONLY
将提取所有3个段落,{ {1}}将提取所有3个段落和两个图像:
ALL
我知道Apache Tika使用了PDFBox,但我担心Tika会遮蔽/禁止这种功能(在这种情况下,我可能需要直接从PDFBox中执行此操作)。
所以我问:这可能,如果是这样,哪个库更适合我使用?我完全是错误的做法吗?我不在考虑任何陷阱/警告?
答案 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都是由上述工具链创建的。
在任何情况下,你都必须自己做一些编程,然后根据你的用例对它们进行微调。