使用img2pdf转图片为PDF时旋转参数未生效,如何消除PDF页面旋转?
问题:img2pdf转换带EXIF旋转的图片时,PDF页面保留旋转值的解决方法
我尝试用img2pdf将图片转换为PDF,但当图片带有EXIF旋转信息时,转换后的PDF页面也会带有旋转值。需求是:图片按照EXIF信息旋转至正确显示状态,同时PDF页面本身不带有旋转值,且仅通过img2pdf实现。
当前使用的代码:
pdf_bytes = img2pdf.convert(io.BytesIO(response.content), rotation=img2pdf.Rotation.ifvalid, first_frame_only=True)
输入图片的EXIF信息显示为90度顺时针旋转,但无论是否添加rotation=img2pdf.Rotation.ifvalid参数,生成的PDF页面仍带有90度旋转值。我用以下代码检测PDF页面旋转:
from pypdf import PdfReader with open('abc.pdf', 'rb') as input_pdf: reader = PdfReader(input_pdf) # 遍历每页获取旋转值 for page_num, page in enumerate(reader.pages): # 获取页面旋转值,默认0度 rotation_value = page.get('/Rotate') or 0 print(f"Page {page_num + 1} is rotated by {rotation_value} degrees.")
输出结果:
Page 1 is rotated by 90 degrees.
请问如何实现需求,且为何添加参数后无变化?
原因分析
img2pdf.Rotation.ifvalid的作用是读取图片的EXIF旋转信息,将PDF页面设置为对应旋转值,而非对图片像素本身进行旋转。因此无论是否设置该参数,只要图片存在EXIF旋转信息,img2pdf都会生成带页面旋转属性的PDF——不设置时可能忽略EXIF导致图片显示错误,设置后页面旋转值依然保留。
解决方案
要实现图片按EXIF旋转后生成无页面旋转值的PDF,需让img2pdf对图片进行像素级旋转,而非依赖PDF页面的旋转属性。通过指定rotation=img2pdf.Rotation.auto参数即可实现:
修改后的转换代码
import img2pdf import io # 假设response.content为图片字节流 pdf_bytes = img2pdf.convert( io.BytesIO(response.content), rotation=img2pdf.Rotation.auto, first_frame_only=True ) # 保存生成的PDF with open("output.pdf", "wb") as output_file: output_file.write(pdf_bytes)
可选:固定页面尺寸
如果需要将旋转后的图片适配固定页面(如A4),可添加layout参数指定页面宽高:
# 定义A4横向页面尺寸(单位转换:毫米转PDF点) a4_landscape = (img2pdf.mm_to_pt(297), img2pdf.mm_to_pt(210)) layout_fun = img2pdf.get_layout_fun(a4_landscape) pdf_bytes = img2pdf.convert( io.BytesIO(response.content), rotation=img2pdf.Rotation.auto, first_frame_only=True, layout=layout_fun )
参数说明
rotation=img2pdf.Rotation.auto:自动读取EXIF旋转信息,对图片像素进行旋转,生成匹配旋转后图片尺寸的PDF页面,此时PDF页面的/Rotate属性为0。layout参数:可选,用于固定页面尺寸,确保旋转后的图片适配指定页面;若无需固定尺寸,可省略该参数,页面会自动匹配旋转后的图片大小。
验证结果
用原检测代码验证生成的PDF,输出如下:
Page 1 is rotated by 0 degrees.
图片显示状态正确,且PDF页面无旋转值。
内容的提问来源于stack exchange,提问作者Zain Khaishagi
相关产品推荐
相关产品推荐

