首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python中的img2pdf包将图像转换为pdf

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

Stack Overflow用户
提问于 2022-03-02 15:23:06
回答 2查看 668关注 0票数 2

我正在尝试将名为Final的文件夹中的图像转换为一个pdf --这是我努力完成的任务

代码语言:javascript
复制
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")]))

但我收到了这样一条错误信息(知道如何修复)

代码语言:javascript
复制
 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'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-04 15:38:49

错误信息之所以神秘,很大程度上是因为img2pdf向后弯曲,对于可以传递给convert函数的内容非常灵活:文件名、打开的文件对象、原始图像数据、任何这些数据的倍数,或者列表。如果它尝试打开一个文件并失败,那么它假设输入是原始图像数据(以字节形式),并尝试以这种方式处理它,在这种情况下,您将得到所看到的TypeError

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

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

代码语言:javascript
复制
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。它通常使处理路径更简单 (而且更容易与平台无关)而不是处理osPath对象比普通字符串更聪明,并且在本例中自动了解它们的封闭文件夹。

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

代码语言:javascript
复制
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')]))
票数 2
EN

Stack Overflow用户

发布于 2022-06-04 14:11:49

请试试这个:

而不是

代码语言:javascript
复制
[x for x in os.listdir("./Final") if x.endswith(".png")]

尝试:

代码语言:javascript
复制
[open(x,'rb').read() for x in os.listdir("./Final") if x.endswith(".png")]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71325155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档