使用python PyPDF2从PDF中提取图像

Max*_*kov 15 python pdf reportlab image-processing pypdf

有没有办法从pdf文档中提取图像(使用PyPDF2库)?也可以将一些图像替换为另一个图像(例如用PIL生成或从文件加载)?

我能够从pdf对象树中获取EncodedStreamObject并获得编码流(通过调用getData()方法),但看起来它只是原始内容,没有任何图像标题和其他元信息.

>>> import PyPDF2
>>> # sample.pdf contains png images
>>> reader = PyPDF2.PdfFileReader(open('sample.pdf', 'rb'))
>>> reader.resolvedObjects[0][9]
{'/BitsPerComponent': 8,
'/ColorSpace': ['/ICCBased', IndirectObject(20, 0)],
'/Filter': '/FlateDecode',
'/Height': 30,
'/Subtype': '/Image',
'/Type': '/XObject',
'/Width': 100}
>>>
>>> reader.resolvedObjects[0][9].__class__
PyPDF2.generic.EncodedStreamObject
>>>
>>> s = reader.resolvedObjects[0][9].getData()
>>> len(s), s[:10]
(9000, '\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc')
Run Code Online (Sandbox Code Playgroud)

我已经仔细研究过PyPDF2,ReportLabPDFMiner解决方案,但没有找到类似我正在寻找的东西.

任何代码示例和链接都将非常有用.

spe*_*ane 1

图像元数据不存储在 PDF 的编码图像中。如果元数据确实被存储,它会存储在 PDF 本身中,但会从底层图像中剥离。您在示例中看到的元数据可能就是您能够获得的全部内容。PDF 编码器可能会将图像元数据存储在 PDF 中的其他位置,但我还没有看到这一点。(请注意,这个元数据问题也针对 Java 提出。)

绝对可以提取流,但是,正如您所提到的,您使用该getData操作。

至于替换它,您需要使用 PDF 创建一个新的图像对象,将其添加到末尾,并相应地更新间接对象指针。使用 PyPdf2 很难做到这一点。