Java 阅读PDF文本和/或所有内容
我有一个场景,需要Java应用程序能够以两种模式之一从PDF文件中提取内容:Java 阅读PDF文本和/或所有内容,java,pdf,file-io,pdfbox,apache-tika,Java,Pdf,File Io,Pdfbox,Apache Tika,我有一个场景,需要Java应用程序能够以两种模式之一从PDF文件中提取内容:TEXT\u ONLY或ALL。在文本模式下,只有可见文本(“可见”就像人类正在阅读PDF一样)被读出为字符串。在所有模式下,所有内容(文本、图像等)都将从文件中读取 例如,如果一个PDF文件中有一个页面,而该页面有3个连续文本段落,并且是文字包装的2个图像,则text\u ONLY将提取所有3个段落,而all将提取所有3个段落和两个图像: while(page.hasMoreText()) textList.a
TEXT\u ONLY
或ALL
。在文本模式下,只有可见文本(“可见”就像人类正在阅读PDF一样)被读出为字符串。在所有模式下,所有内容(文本、图像等)都将从文件中读取
例如,如果一个PDF文件中有一个页面,而该页面有3个连续文本段落,并且是文字包装的2个图像,则text\u ONLY
将提取所有3个段落,而all
将提取所有3个段落和两个图像:
while(page.hasMoreText())
textList.add(page.nextTextChunk());
if(allMode)
while(page.hasMoreImages())
imageList.add(page.nextImage());
我知道ApacheTika在引擎盖下使用PDFBox,但我担心这种功能被Tika屏蔽/禁止(在这种情况下,我可能需要直接从PDFBox执行)
所以我问:这可能吗?,如果可能,哪个库更适合我使用?我是不是走错了路?这里有没有我没有考虑的陷阱/注意事项?来解释为什么@markStephens会向您介绍一些关于PDF的背景资料 在文本模式下,只有可见文本(“可见”就像人类正在阅读PDF一样)被读出为字符串 您对“可见”的定义,就像一个人正在阅读PDF一样,还没有很好的定义:
- 文本1磅大小是否可见?放大时,人类可以阅读;但在标准放大倍数下,不是这样。哪种尺寸是限制
- 背景为(128128128)的RGB(128129128)中的文本是否可见?颜色有多不同
- 文本是否以某种白噪声模式显示在另一种白噪声模式的背景上?模式有多大不同
- 文本是否仅部分显示在屏幕上?如果是,一个可见像素是否足够?如果某个巨大尺寸的“I”字符的可见页面区域与字母上的圆点相吻合,该怎么办
- 如果文本被一些易于移动的注释所覆盖,甚至可能被文件中一些自动执行的JavaScript代码所覆盖,该怎么办
- 如果某些可选内容组中的文本仅在打印时可见,该怎么办
while(page.hasMoreText())
textList.add(page.nextTextChunk());
if(allMode)
while(page.hasMoreImages())
imageList.add(page.nextImage());
PDF(通常)不知道段落,只知道页面上某个位置的一些字形组。识别段落是一项无法保证正常工作的任务,因为有启发法在起作用。此外,如果您有不规则分隔的多列文本,甚至可能中间有一些图像(很难确定是否有两列被图像分割,或者是否有一列包含集成图像),您可以依靠对文本流的识别,更不用说段落、节段、,等等,惨败
如果您的PDF被正确标记,或者全部由一个工具链生成,而创建的PDF内容流中的模式背叛了文本结构,那么您可能会更幸运。但是,对于后者,您的解决方案必须为该工具链定制
但我担心Tika会屏蔽/禁止此类功能(在这种情况下,我可能需要直接从pdfBox执行此操作)
这里您指向另一个关注点:PDF可以被标记为禁止文本提取,而任何人都可以显示它们。虽然从技术上讲,这样标记的PDF可以像没有该标记的文档一样通过一个解码步骤进行处理(基本上是使用公开的密码进行加密),但这样做显然违背了作者声明的意图,侵犯了他的版权
所以我问:这可能吗?如果可能的话,哪个库更适合我使用?我是不是走错了路?我在这里没有考虑任何陷阱/警告
只要您希望通用输入的准确率达到100%,就应该重新考虑您的体系结构
如果PDF是您所拥有的全部,并且一个尽可能有效的解决方案是可以的,那么另一方面,有多个可能的库供您、iText和PDFBox命名,但还有两个库。哪一个最适合您取决于更多因素,例如,您是否需要某种通用解决方案,或者所有PDF都是由如上所述的工具链创建的
无论如何,您必须自己编写一些程序,以便根据您的用例对它们进行微调。阐述@markStephens为什么会向您介绍一些关于PDF的背景资料 在文本模式下,只有可见文本(“可见”就像人类正在阅读PDF一样)被读出为字符串 您对“可见”的定义,就像一个人正在阅读PDF一样,还没有很好的定义:
- 文本1磅大小是否可见?放大时,人类可以阅读;但在标准放大倍数下,不是这样。哪种尺寸是限制
- 背景为(128128128)的RGB(128129128)中的文本是否可见?颜色有多不同
- 文本是否以某种白噪声模式显示在另一种白噪声模式的背景上?模式有多大不同
- 文本是否仅部分显示在屏幕上?如果是,一个可见像素是否足够?那么,在一个巨大的页面区域中的一些字符“I”呢