Python批量将多张图片拼接为PDF

参考博客:http://ilovin.me/2017-04-18/stitch-img-to-pdf/   算是技术杂谈类的吧......

最近碰到一个问题,想要把一个文件夹下的图片拼接起来生成一个PDF文件,并且该PDF文件每页都具有相同的A4大小。其实生成PDF这件事有许多方法可以办到,最简单可以用word或者acrobat,然而通过这些软件来生成PDF文件有些问题无法避免,一是样式无法自定义,二是不太好把它做成一个模块嵌入到其他需要使用的地方。于是就想能否自己来写,好在Python轮子多,简单搜索了一下,用ReportLab似乎可以达到自己的要求。

实现方法

代码实现起来倒是不复杂,但是有一点需要注意,那就是用PIL打开一个图片的时候,当它是JPEG格式的时候,我发现它总是旋转过的,因此我们需要读取一下该图片的exif信息,将它转过来。

 
def rotate_img_to_proper(image):
try:
if hasattr(image, '_getexif'): # only present in JPEGs
for orientation in PIL.ExifTags.TAGS.keys():
if PIL.ExifTags.TAGS[orientation] == 'Orientation':
break
e = image._getexif() # returns None if no EXIF data
if e is not None:
#log.info('EXIF data found: %r', e)
exif = dict(e.items())
orientation = exif[orientation]
# print('found, ',orientation)
if orientation == 3:
image = image.transpose(Image.ROTATE_180)
elif orientation == 6:
image = image.transpose(Image.ROTATE_270)
elif orientation == 8:
image = image.rotate( 90,expand= True)
except:
pass
return image


什么是图像 exif 信息?扫盲:

基本上, Exif文件格式与JPEG 文件格式相同. Exif按照JPEG的规格在JPEG中插入一些 图像/数字相机 的信息数据以及缩略图像. 于是你能通过与JPEG兼容的互联网浏览器/图片浏览器/图像处理等一些软件 来查看Exif格式的图像文件. 就跟浏览通常的JPEG图像文件一样.


随后我们就可以将图片保持长宽比地resize到A4页面中

 
# new a Doc
imgDoc = canvas.Canvas(output_file_name) #pagesize=letter
imgDoc.setPageSize(A4)
document_width,document_height = A4
# fill each page with a image
image_file = PIL.Image.open(image)
image_file = rotate_img_to_proper(image_file)
image_width,image_height = image_file.size
if not(image_width> 0 and image_height> 0):
raise Exception
image_aspect = image_height/float(image_width)
#Determins the demensions of the image in the overview
print_width = document_width
print_height = document_width*image_aspect
imgDoc.drawImage(ImageReader(image_file),document_width-print_width,
document_height-print_height,width=print_width,
height=print_height,preserveAspectRatio= True)
#inform the reportlab we want a new page
imgDoc.showPage()
imgDoc.save()


原博的github地址:github

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值