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

问题描述 投票:0回答:2

我正在尝试将名为

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:\Users\Future\Desktop\demo.py", line 5, in <module>
    f.write(img2pdf.convert([x for x in os.listdir("./Final") if x.endswith(".png")]))
  File "C:\Users\Future\AppData\Local\Programs\Python\Python39\lib\site-packages\img2pdf.py", line 2263, in convert
    ) in read_images(
  File "C:\Users\Future\AppData\Local\Programs\Python\Python39\lib\site-packages\img2pdf.py", line 1444, in read_images
    im = BytesIO(rawdata)
TypeError: a bytes-like object is required, not 'str'
python
2个回答
2
投票

错误消息很神秘,很大程度上是因为

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,截至 0.5.0

这是一个非常直译的样子,除了使用

pathlib

from pathlib import Path
import img2pdf

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

但是现在

glob
方法正在执行过滤,列表理解实际上并没有执行任何操作。

from pathlib import Path
import img2pdf

with open("Stickers.pdf","wb") as f:
    f.write(img2pdf.convert([*Path('./Final').glob('*.png')]))

-1
投票

请尝试这个:

而不是

[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")]
© www.soinside.com 2019 - 2024. All rights reserved.