繁体   English   中英

在python中使用img2pdf package将图片转为pdf

[英]Convert images to pdf using img2pdf package in python

我正在尝试将名为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'

错误消息是神秘的,主要是因为img2pdf向后弯腰,以至于您可以传递给convert function 的内容如此多才多艺:文件名、打开的文件 object、原始图像数据、其中任何一个的倍数或列表。 如果它尝试打开一个文件但失败了,它会假定输入是原始图像数据(以字节为单位)并尝试以这种方式处理它,在这种情况下,您会得到您看到的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 object 任何地方,您也可以在任何地方使用表示路径的字符串,但不幸的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")]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM