如何使用PIL(pillow)将图像列表保存为PDF?

17

我想使用PIL的.save()方法将我的PIL图像列表导出为PDF。

PIL文档中,保存部分说明如下: enter image description here => 我们可以在pdf格式中使用append_images选项。

在Pillow的Github页面中,这个问题说:增加了将图像添加到PDF保存的功能 #2526

我写了这段代码:

import PIL
im1 = PIL.Image.open("1.jpg").convert("RGB")
im2 = PIL.Image.open("2.jpg").convert("RGB")
im3 = PIL.Image.open("3.jpg").convert("RGB")
images = [im1,im2,im3]
images[0].save("out.pdf", save_all=True, append_images=images[1:])

但是它不起作用!

出现了以下错误:

Traceback (most recent call last):
  File "sample.py", line 13, in <module>
gif.save("out.pdf", save_all=True, append_images=images)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/Image.py", line 1928, in save
save_handler(self, fp, filename)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/PdfImagePlugin.py", line 55, in _save_all
_save(im, fp, filename, save_all=True)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/PdfImagePlugin.py", line 182, in _save
Image.SAVE["JPEG"](im, op, filename)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/JpegImagePlugin.py", line 609, in _save
info = im.encoderinfo
AttributeError: 'Image' object has no attribute 'encoderinfo'

很简单,但你应该写成append_images=images。你也可以将导入语句更改为from PIL import Image,然后只需使用Image.open(..) - Vasilis G.
请看这里。除此之外,我想不到其他的了。 - Vasilis G.
@martineau 谢谢。我可以很容易地通过PIL将一张图片导出为PDF...而且新的PIL还增加了多帧图像的功能! - mkal
1
我认为这是一个bug。在Python 3.6.0上使用Pillow 4.3.0,我可以轻松地保存单个PDF图像。并且我可以使用append_images参数调用.save方法来编写正确的多帧GIF。如果源图像是GIF,则甚至可以保存多帧PDF,但是当我检查生成的PDF文件时,它不正确。我在我的测试中使用了3个图像,输出的PDF由3页组成,每页包含3列图像,顶部和底部的图像似乎是列表中的第1个图像,并且中间的图像是我第1个图像的错误解码版本。 :( - PM 2Ring
mkal:我没有意识到Pillow已经添加了这个增强功能——自从我使用或关注它的最新增强功能以来已经有一段时间了。我怀疑@PM2Ring可能是正确的,因为我在过去的版本中遇到了几个错误。好消息是,你可以通过向开发人员报告它们来修复它们(与现在的PIL不同)。 - martineau
显示剩余5条评论
3个回答

6

尝试使用这种格式

from PIL import Image
im1 = PIL.Image.open("1.jpg").convert("RGB")
im2 = PIL.Image.open("2.jpg").convert("RGB")
im3 = PIL.Image.open("3.jpg").convert("RGB")
images = [im2,im3]
im1.save("out.pdf", save_all=True, append_images=images)

1
问题不在于楼主的代码有错,而是他们使用的PIL版本存在一个bug。发布稍微重新排列过的楼主代码版本是没有用的。 - snakecharmerb

2

17
请问您能否提供具体的文档部分,说明如何完成这个操作? - Daniel Porteous
为了后代,Image.save() 方法的文档可以在这里找到,支持的文件格式列表以及可传递到 Image.save() 的相应参数可以在这里找到(PDF 文件格式)。 - Jacob Lee

-3

有点偏题,但如果你有大量的图片需要转换,使用列表推导式是最好的选择。

from PIL import Image

im1=Image.open('1.png').convert('RGB')
images = [Image.open(f”{imgNumber}.png”).convert('RGB') for imgNumber in range(2, 100)]
im1.save("imgBook.PDF", save_all=True, append_images=images)

列表推导在这种情况下牺牲了可读性,而且它是完全不必要的;在这种情况下使用标准的 for 循环会更好。 - Jacob Lee
1
如果你理解列表推导式,它不会牺牲可读性 ;) - 0x029A
不,它仍然会牺牲可读性。;) - Jacob Lee
1
我必须不同意你的看法。列表推导通常被认为更易读和符合Python风格。值得研究和理解。https://towardsdatascience.com/python-basics-list-comprehensions-631278f22c40 - 0x029A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接