使用python中的img2pdf包将图像转换为pdf



我正在尝试将名为Final的文件夹中的图像转换为一个pdf这是我尝试实现任务

import os
import img2pdf
with open("Stickers.pdf","wb") as f:
#print(os.listdir("./Final"))
f.write(img2pdf.convert([x for x in os.listdir("./Final") if x.endswith(".png")]))

但我收到了一条这样的错误消息(知道如何修复吗(

File "C:UsersFutureDesktopdemo.py", line 5, in <module>
f.write(img2pdf.convert([x for x in os.listdir("./Final") if x.endswith(".png")]))
File "C:UsersFutureAppDataLocalProgramsPythonPython39libsite-packagesimg2pdf.py", line 2263, in convert
) in read_images(
File "C:UsersFutureAppDataLocalProgramsPythonPython39libsite-packagesimg2pdf.py", line 1444, in read_images
im = BytesIO(rawdata)
TypeError: a bytes-like object is required, not 'str'

错误消息很神秘,主要是因为img2pdf在传递给convert函数的内容方面非常灵活:文件名、打开的文件对象、原始图像数据、其中任何一个的倍数或列表。如果它尝试打开一个文件但失败了,那么它会假设输入是原始图像数据(以字节为单位(,并尝试以这种方式处理它,在这种情况下,您会得到您看到的TypeError

它无法正确打开文件的原因是os.listdir只返回文件名本身,而不是其完整路径,并且这些图像文件不在您当前的工作目录中。也就是说,您试图打开example.png,而不是./Final/example.png

您可以通过手动将文件夹名添加到每个文件名来解决此问题:

import os
import img2pdf
with open("Stickers.pdf","wb") as f:
f.write(img2pdf.convert([f'./Final/{x}' for x in os.listdir("./Final") if x.endswith(".png")]))

您也可以使用pathlib。它通常使处理路径比处理os更容易(而且更容易与平台无关(。Path对象比纯字符串更聪明,并且在这种情况下会自动知道它们的封闭文件夹。

Python的所有内建(如open(都会接受Path对象,在任何地方您也可以使用表示路径的字符串,但不幸的是,img2pdf并没有这样做,所以您仍然需要将它们转换回字符串。就我个人而言,我仍然认为这有点好,但你的里程数可能会有所不同:

from pathlib import Path
import img2pdf
with open("Stickers.pdf","wb") as f:
f.write(img2pdf.convert([str(path) for path in Path('./Final').glob('*.png')]))

请尝试以下操作:

代替

[x for x in os.listdir("./Final") if x.endswith(".png")]

尝试:

[open(x,'rb').read() for x in os.listdir("./Final") if x.endswith(".png")]