使用python解压缩并保存PDF格式的zlib数据

时间:2017-03-14 16:43:13

标签: python pdf zlib

我们每天都会将PDF文件发送给我们,我们需要将图像输出。例如,我想要做的是使用python将图像从this PDF file I have中取出。我们获得的大多数pdf文件都是多页面的,我们希望将每个嵌入的图像导出为单独的文件。大多数都有jpeg文件,但他的文件没有。

对象5作为zlib压缩流嵌入。我很确定它是zlib压缩的,因为它标记为FlateDecode,流的开头是\ x78 \ x9c,这是zlib的典型。你可以看到the hex dump here

的(部分)

问题是,如何'缩小'并保存生成的文件。

感谢您分享您的智慧。

1 个答案:

答案 0 :(得分:0)

我到处搜索并尝试了很多东西,却无法开始工作。我设法解压缩这样的数据:

import zlib
with open("MDL1703140088.pdf", "rb") as f:
    pdf = f.read()

image = zlib.decompress(pdf[640:69307])

640是zlib标题(b'x\x9c')位置,69307是像pdf规范的页脚一样的位置。 b'\nendstream\n'在那里。详情位于the spec,可以找到一些有用的Q& A here。但是在这种情况下允许省略结束位置,因为decompress()似乎忽略了非压缩数据。您可以通过以下方式验证:

decomp = zlib.decompressobj()
image = decomp.decompress(pdf[640:])
print(decomp.unused_data)  # starts from b'\nendstream\n

到目前为止一切顺利。但是当我将image写入PNG文件时,任何图像查看器都无法读取它。实际上,解压缩的数据在这里和那里看起来都很空洞。我附上了一些PNG标题,但没有运气。嘿,太多了......

正如我之前所说(奇怪的是我的评论已被某人删除),您最好使用其他一些现有工具。如果您不选择Acrobat,那么pdftopng (part of Xpdf)呢? pdftopng MDL1703140088.pdf .完美地给了我一个有效的PNG文件。显然,命令行工具可以在Python中执行,如您所知。