开发者问题收集

使用python将jpg转换为pdf时旋转无效

2020-02-24
3520

我正在尝试使用 img2pdf 将 jpg 转换为 pdf。

它适用于大多数 jpg,但不是全部。

这是我的脚本:

import img2pdf
import PIL.Image
import os
image = PIL.Image.open("Lidl.jpg")
pdf_bytes = img2pdf.convert(image.filename)
file = open(pdf_path, "wb")
file.write("file.pdf")
image.close()
file.close()

这是我收到的错误:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    pdf_bytes = img2pdf.convert(image.filename)
  File "/home/ksb/Dropbox/Python/imap/venv/lib/python3.6/site-packages/img2pdf.py", line 1829, in convert
    ) in read_images(rawdata, kwargs["colorspace"], kwargs["first_frame_only"]):
  File "/home/ksb/Dropbox/Python/imap/venv/lib/python3.6/site-packages/img2pdf.py", line 1191, in read_images
    imgdata, imgformat, default_dpi, colorspace, rawdata
  File "/home/ksb/Dropbox/Python/imap/venv/lib/python3.6/site-packages/img2pdf.py", line 1030, in get_imgmetadata
    'Image "%s": invalid rotation (%d)' % (im.name, value)
NameError: name 'im' is not defined

如果我查看图像元数据,它会显示:

Unknown rotation value 0
ColorSpace=sRGB

是否可以设置旋转值?

任何提示都非常感谢。

BR Kresten

3个回答

在文档中检查错误列表 https://github.com/josch/img2pdf#bugs 并且您有来自此处的示例 https://github.com/josch/img2pdf#library 如何修复该问题:

# ignore invalid rotation values in the input images
with open("name.pdf","wb") as f:
    f.write(img2pdf.convert('test.jpg', rotation=img2pdf.Rotation.ifvalid))

因此

import img2pdf
import PIL.Image
import os
image = PIL.Image.open("Lidl.jpg")
with open("file.pdf","wb") as f:
    f.write(img2pdf.convert(image.filename, rotation=img2pdf.Rotation.ifvalid))

请注意,旋转仅在最新的 img2pdf 版本上可用。否则,您可能会收到一条错误消息,提示“模块‘img2pdf’没有属性‘Rotation’”

fearis
2022-12-06

我猜问题出在下面的代码行上。

file.write("file.pdf")

在这里尝试传递从 convert 函数获得的字节。

file.write(pdf_bytes)

对于您收到的错误,您可以按照下面的方法尝试。尝试使用库 imdirect

from PIL import Image
import imdirect
img = Image.open('Lidl.jpg')
img_rotated = imdirect.autorotate(img)

上面的代码片段是从库的项目描述页面复制而来的。另请阅读简要说明,了解为什么会发生此类问题。

https://pypi.org/project/imdirect/

如果仍然不起作用,作为最后一次尝试的一部分, 在打开后、转换为字节之前旋转图像,以满足您的要求的所需角度。

image = PIL.Image.open("Lidl.jpg")
image.rotate(90) #90 is rough number, you calculate, what you need.
pdf_bytes = img2pdf.convert(image.filename)
Pavan Chandaka
2020-02-24
from PIL import Image

image1 = Image.open(r'C:\Users\Ron\Desktop\Test\image1.png')
image2 = Image.open(r'C:\Users\Ron\Desktop\Test\image2.png')
image3 = Image.open(r'C:\Users\Ron\Desktop\Test\image3.png')
image4 = Image.open(r'C:\Users\Ron\Desktop\Test\image4.png')
 
im1 = image1.convert('RGB')
im2 = image2.convert('RGB')
im3 = image3.convert('RGB')
im4 = image4.convert('RGB')

imagelist = [im2,im3,im4]

im1.save(r'C:\Users\Ron\Desktop\Test\myImages.pdf',save_all=True, append_images=imagelist)

It is work for me

Юрий Такаев
2021-01-21