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

时间:2013-06-20 20:58:57

标签: java pdf itext apache-tika

我正在使用iText库从PDF文档中读取文本。但是,除了文本之外,某些pdf文档可能还会嵌入图像。

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

2 个答案:

答案 0 :(得分:2)

您可以使用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%的可靠性是否足够好。 : - )

答案 1 :(得分:0)

PDF中的图像是FormXObjects或使用BI-EI命令嵌入到内容中的嵌入图像。 因此,您必须解析页面的Resources字典并递归检查它的Xobjects以检查它们是否也包含图像(相同的Resources字典)。此外,您还必须解析所有内容流并检查嵌入的图像是否存在。附加图像可以在模式中定义 - &gt;如果你要实现自己的图像存在检查器,这是一种方法。首先阅读规范并估算时间费用.3d方可能最终没有那么昂贵。