Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阅读PDF文本和/或所有内容_Java_Pdf_File Io_Pdfbox_Apache Tika - Fatal编程技术网

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

我有一个场景,需要Java应用程序能够以两种模式之一从PDF文件中提取内容:
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代码所覆盖,该怎么办

  • 如果某些可选内容组中的文本仅在打印时可见,该怎么办

*

我希望大多数可用的PDF文本解析库都会忽略所有这些情况并提取文本,最多只提取一个裁剪框。对于添加了不可见OCR文本的图像,通常需要提取该文本

例如,如果一个PDF文件中有一个页面,而该页面有3个连续文本段落,并且是文字包装的2个图像,那么text_只会提取所有3个段落,而all会提取所有3个段落和两个图像:

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”呢