我正在使用reportlab从python API生成PDF文档。 这些文件包括载有以下内容的照片(以前用相机或移动设备拍摄):
from reportlab.platypus import Image
img = Image(path)
story.append(img)
问题:某些图像没有以正确的方向显示(某些EXIF数据可能在某些时候丢失或被忽略)。
我遇到过类似PIL的问题一次,我选择的解决方案是使用Wand而不是PIL或Pillow,但看起来ReportLab只使用PIL来处理Python的图像...
我找到this code snippet from another question但我不确定如何编辑reportlab以包含它,或者它是否是一个好方法。
我很惊讶我没有找到关于这个主题的任何内容,我不能成为唯一一个想要在reportlab生成的PDF中包含图片的人......
这是在左侧预览中打开原始图像的图片,右侧是PDF:
感谢您的帮助,我一直在努力工作几个小时......
答案 0 :(得分:0)
我实际上遇到了与pyCairo相同的问题。
我有一堆JPEG图像,其中一些直接放在PDF文档中,另一些则在插入PDF之前用pyCairo进行操作。
将JPEG图像插入到reportlab PDF文档中,或者将图像从JPEG转换为PNG以使用pyCairo时(据我所知pyCairo不能与JPEG一起使用),存储在图像中的图像的方向EXIF迷路了。
这是我最终做的事情:
from reportlab.platypus import Image
from wand.image import Image as WandImage
def AddAPictureToDocument():
with WandImage(filename=path) as wimg:
WandConvertToPNG(wimg,pngDestinationPath)
img = Image(pngDestinationPath)
story.append(img)
def WandConvertToPNG(img, savepath):
exif = {}
exif.update((k[5:], v) for k, v in img.metadata.items()
if k.startswith('exif:'))
orientation = exif['Orientation']
with img.convert('png') as converted:
if int(orientation) == 3 :
converted.rotate(180)
elif int(orientation) == 6 :
converted.rotate(90)
elif int(orientation) == 8 :
converted.rotate(270)
converted.save(filename=savepath)
但它可能非常慢,特别是对于pyCairo,因为我需要:
1)从JPEG转换为PNG,
2)将图像旋转到正确的方向
3)使用pyCairo在图像上绘制东西
4)将pyCairo处理的图像保存到PNG
5)将PNG转换为JPEG以压缩图像
我认为PIL或Wand等图像库在JPEG-> PNG转换后会处理图像的方向是不是很天真?
无论如何,我仍然在寻找更好的解决方案。