Java 如何检查PDF文档是否包含图像

Java 如何检查PDF文档是否包含图像,java,pdf,itext,apache-tika,Java,Pdf,Itext,Apache Tika,我正在使用iText库阅读PDF文档中的文本。但是,某些pdf文档中可能会嵌入图像和文本 我想知道是否有任何方法,通过iText或其他方式,来确定pdf文档是否包含图像?pdf中的图像是FormXObject还是使用BI-EI命令嵌入到内容中的嵌入图像。 因此,您必须解析页面的资源字典并递归地检查它的XObject,以检查它们是否包含图像AlsoName资源字典。此外,您还必须解析所有内容流,并检查是否存在嵌入的图像。另外,如果您要实现自己的图像状态检查器,可以在模式->中定义图像。首先阅读规范

我正在使用iText库阅读PDF文档中的文本。但是,某些pdf文档中可能会嵌入图像和文本


我想知道是否有任何方法,通过iText或其他方式,来确定pdf文档是否包含图像?

pdf中的图像是FormXObject还是使用BI-EI命令嵌入到内容中的嵌入图像。
因此,您必须解析页面的资源字典并递归地检查它的XObject,以检查它们是否包含图像AlsoName资源字典。此外,您还必须解析所有内容流,并检查是否存在嵌入的图像。另外,如果您要实现自己的图像状态检查器,可以在模式->中定义图像。首先阅读规范并估算时间开销。3d party lib最终可能不会太贵。

您可以使用PDF库进行正确且100%可靠的检查

不过,您可能只需将PDF读取为文本并以这种方式进行处理,就可以进行相当可靠的检查。您需要首先通过在开始处查找PDF标题来检查它是否为PDF

%PDF...
然后浏览一遍,寻找短语

/XObject
当您点击这个标记时,您需要在流中向后和向前检查>字典边界,以拉出完整的XObject字典。可能存在嵌套>,因此您可能希望检查回“obj”并转发到“stream”条目。不管怎样你最终会得到这样的结果

<< 
/Type /XObject /Subtype /Image /Name /I1 
/Width 800 /Height 128 
/BitsPerComponent 1 /ImageMask true 
/Filter [/FlateDecode] 
/Length 2302 >> 
这里需要检查的是,有一个/Subtype条目和一个/Image,由一些空格分隔。如果你点击了,你就会有一个图像

那么,这种方法的局限性是什么

可以在文档中嵌入图像,但不能使用它。这将导致假阳性。但我认为这是不太可能的。这样做效率很低,只有一个真正卑鄙的制作人才会这么做

如上面Hugo所述,图像可以嵌入到页面内容流中。这将导致假阴性。但这些都是相当罕见的。这是规范中的一部分,从来都不是一个好主意,也没有被广泛使用。如果您有来自单个制作人的文档,通常情况下,如果它这样做或不这样做,那么很快就会很明显。然而,我认为这将是非常罕见的。我猜我无法想象超过1%的野生PDF会包含这种结构

可以将这些XObject标记作为引用而不是直接对象嵌入。但我认为你完全可以打折。虽然这是合法的,但绝对是非法的。我想你永远也看不到

正确的方法包括扫描和解析PDF中的所有内容流。这是我们在ABCpdf中所做的,我正在研究,但这需要更多的工作和更多的处理能力。在一个大文档上可能需要很多秒


想想99%的可靠性是否足够好:-

请看这里,使用相同的基本集查看是否存在。如果您不想切换到@Phil的引用建议的PDFBox add。。。您也可以使用解析器包中的iText类来提取位图图像。我遇到了这个链接,但是,我需要找出pdf中是否存在图像。在这种情况下,只需创建自己的图像渲染侦听器。如果只是检查图像是否存在,它将比该示例中使用的图像简单得多。iText是否可以不按您的建议执行?在iText和其他工具中,到处都存在bug。PDF文件也不是排除项,有许多格式错误、创建错误的示例。可能是您的情况,如果您发布一个您试图完成此任务的示例代码,这将非常有用。