我正在使用 iText 库从 PDF 文档中读取文本。但是,某些 pdf 文档可能除了文本之外还嵌入了图像。
我想知道是否有任何方法可以通过 iText 或其他方式来确定 pdf 文档是否包含图像?
我正在使用 iText 库从 PDF 文档中读取文本。但是,某些 pdf 文档可能除了文本之外还嵌入了图像。
我想知道是否有任何方法可以通过 iText 或其他方式来确定 pdf 文档是否包含图像?
您可以使用 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 >>
您需要在这里检查的是有这个 /Subtype 条目和一个 /Image 由一些空格分隔。如果你点击它,那么你有一个图像。
那么这种方法的局限性是什么?
好吧,可以在文档中嵌入图像但不使用它。这将导致误报。我认为这不太可能。这样做是非常低效的,而且只有一个非常淫荡的制作人才会这样做。
正如上面 Hugo 所提到的,图像可以嵌入到页面内容流中。这将导致假阴性。不过这些都很少见。这是规范中的一个,它从来都不是一个好主意,也没有被广泛使用。如果您有来自单个生产者的文件(通常是这种情况),那么无论是否这样做,都会很快显现出来。但是我认为这将是非常罕见的。猜测一下,我无法想象超过 1% 的野生 PDF 会包含这个结构。
可以将这些 XObject 标记作为引用而不是直接对象嵌入。但我认为你可以完全打折。虽然合法,但绝对是奇怪的。我不认为你会看到那个。
正确的方法是扫描和解析 PDF 中的所有内容流。这是我们在 ABCpdf 中所做的(我正在研究),但它需要更多的工作和更多的处理能力。大型文档可能需要几秒钟。
想想 99% 的可靠性是否足够好。:-)
PDF 中的图像是 FormXObjects 或使用 BI-EI 命令嵌入到内容中的图像。因此,您必须解析页面的资源字典并递归检查它的 Xobjects 以检查它们是否还包含图像(相同的资源字典)。此外,您还必须解析所有内容流并检查嵌入式图像是否存在。附加图像可以在模式中定义 -> 如果您要实现自己的图像存在检查器,这是一种方法。首先阅读规范并估计时间费用。3d 派对库最终可能不会那么昂贵。