2013-06-20 43 views
-1

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

我想知道是否有任何方式,通过iText或其他,以确定如果PDF文件包含图像?

+0

看这里http://stackoverflow.com/questions/7007917/how-to-extract-images-from-a-pdf-with-itext-in-the-correct-order 使用相同的基本设置,看看是否存在。 – Phil

+0

如果你不想切换到PDFBox添加@菲尔的参考建议......你也可以使用解析器包中的iText类来进行位图图像提取。 – mkl

+0

我遇到了这个链接,但是,我需要找出一个图像是否存在于pdf中。 http://itextpdf.com/examples/iia.php?id=284 – Anthony

回答

2

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

但是,您可以通过阅读PDF文本并以此方式进行处理来做相当可靠的检查。首先,您需要检查它是通过查找在开始的PDF头一个PDF,

%PDF... 

然后通过寻找短语扫描,

/XObject 

当你点击这个标签,你需要检查在数据流中向前和向后移动到< <和>>字典边界以提取完整的XObject字典。有可能嵌套< <和>>所以你可能想要检查'OBJ'并转发到'流'条目。总之你最终的东西,看起来像这样,

<< 
/Type /XObject /Subtype /Image /Name /I1 
/Width 800 /Height 128 
/BitsPerComponent 1 /ImageMask true 
/Filter [/FlateDecode] 
/Length 2302 >> 

你需要在这里检查的是,有这种/亚型进入和一些空格分开的/图像的事情。如果你击中了那么你就有一个图像。

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

那么可以在文档中嵌入图像,但不能使用它。这会导致误报。我认为这是不太可能的。这样做效率非常低,只有一个非常生气的生产者会这样做。

上面Hugo提到的图像可以嵌入到页面内容流中。这会导致错误的否定。这些都很少见。这是规范中那些不太好的主意,也没有被广泛使用。如果你有一个单一制作人的文件(如往常一样),如果它做到或不做,它会很快变得明显。不过,我认为这将是非常罕见的。猜测我无法想象超过1%的野生PDF将包含此构造。

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

正确的方法涉及扫描和解析PDF中的所有内容流。这是我们在ABCpdf(我工作)中所做的工作,但它有更多的工作和更多的处理能力。在大文件上可能需要几秒钟的时间。

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

0

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

+1

可以iText不做你的建议吗? – Anthony

+0

错误确实存在于iText和其他工具中的任何地方.PDF文件也不是排他性的,有很多格式错误,创建不正确的例子。它可能是您的情况,如果您发布了您试图完成的示例代码这个任务与。 –