我们每天都会将PDF文件发送给我们,我们需要将图像输出。例如,我想要做的是使用python将图像从this PDF file I have中取出。我们获得的大多数pdf文件都是多页面的,我们希望将每个嵌入的图像导出为单独的文件。大多数都有jpeg文件,但他的文件没有。
对象5作为zlib压缩流嵌入。我很确定它是zlib压缩的,因为它标记为FlateDecode,流的开头是\ x78 \ x9c,这是zlib的典型。你可以看到the hex dump here
的(部分)问题是,如何'缩小'并保存生成的文件。
感谢您分享您的智慧。
答案 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中执行,如您所知。