媳妇发来几十张扫描件,要求合并成一个pdf文件。
本来是个很简单的操作,使用 WPS 将图片合并为 pdf 就完了。
但就在完成最后一步时弹了一个框:
会员过期了,下一步面临的选择是充值或换工具。之前充过两年 wps 会员,后来普通会员取消后就没再充值了。平时使用 wps 也很少用到它的高级功能,如果只为图片合并 pdf 这一个功能就充会员就不合算了。
拿起我的 Python 写了一个图片合并 pdf 的脚本:
pip install reportlab Pillow
cat merge_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from PIL import Image
def images_to_pdf(image_paths, output_path):
c = canvas.Canvas(output_path, pagesize=A4)
width, height = A4
for path in image_paths:
c.drawImage(path, 0, 0, width=width, height=height)
c.showPage()
c.save()
# 图片文件路径列表
image_paths = [
'扫描全能王 2024-04-20 18.50_1.jpg',
'扫描全能王 2024-04-20 18.50_2.jpg',
'扫描全能王 2024-04-20 18.50_3.jpg',
'扫描全能王 2024-04-20 18.50_4.jpg',
'扫描全能王 2024-04-20 18.50_5.jpg',
'扫描全能王 2024-04-20 18.50_6.jpg',
'扫描全能王 2024-04-20 18.50_7.jpg',
'扫描全能王 2024-04-20 18.50_8.jpg',
'扫描全能王 2024-04-20 18.50_9.jpg',
'扫描全能王 2024-04-20 18.50_10.jpg',
'扫描全能王 2024-04-20 18.50_11.jpg',
'扫描全能王 2024-04-20 18.50_12.jpg',
'扫描全能王 2024-04-20 18.50_13.jpg',
'扫描全能王 2024-04-20 18.50_14.jpg',
'扫描全能王 2024-04-20 18.50_15.jpg',
'扫描全能王 2024-04-20 18.50_16.jpg',
'扫描全能王 2024-04-20 18.50_17.jpg',
'扫描全能王 2024-04-20 18.50_18.jpg',
'扫描全能王 2024-04-20 18.50_19.jpg',
'扫描全能王 2024-04-20 18.50_20.jpg',
'扫描全能王 2024-04-20 18.50_21.jpg',
'扫描全能王 2024-04-20 18.50_22.jpg',
'扫描全能王 2024-04-20 18.50_23.jpg',
]
# 合并后的PDF文件路径
output_path = 'merged_images.pdf'
# 调用函数生成PDF
images_to_pdf(image_paths, output_path)
合并 pdf 后发现有的页面是横版的,有的是纵版的。查看原始图片发现的确有的分辨率是 1828x2592, 有的图片是 2536x1780
打开图片查看也是有的是横版的,有的是竖版的。看来是图片的样式影响到了合并的效果。
于是使用 wps 的图片查看器对图片进行调整,使用它的向左转、向右转功能对图片的方向进行调整。
调整后的图片果真变成了竖版,并且分辨率看起来好像也正常了:
再次执行程序进行合并,发现 pdf 内容并没有变化,非常奇怪。难道是代码出bug了?使用 honeyview 图片查看工具查看经 wps 图片处理过的图片分辨率并没有变化,只是多了一个旋转属性。
也就是说有些图片处理软件在进行图片旋转时并非真的对图片进行旋转,它只是在图片的 EXIF 信息中增加了一个“旋转90度”的属性。相当于只是修改了文件的属性,并没有对图片文件进行真实转换。
有没有不修改 EXIF 属性,直接修改图片文件本身的图片查看软件?windows 自带的图片查看器对图片进行调整时就是真实地修改图片的分辨率和方向。使用它的向左转、向右转功能对图片的方向进行调整。
修改后的图片 EXIF 属性如下:
可以看出 windows 的照片查看器是真的对图片的方向进行了调整,处理后的图片使用 Python 脚本可以很方便地合并成一个 pdf 文件。
关于图片方向的问题是 pdf 合并时的小插曲,使用 Python 也可以处理图片旋转的问题,但我们的目的是尽快完成工作,能用现成工具的地方就没必要自己写了。
def get_image_rotation(image_path):
img = Image.open(image_path)
exif = img._getexif()
if exif:
orientation = exif.get(0x0112)
if orientation == 3:
return 180
elif orientation == 6:
return 270
elif orientation == 8:
return 90
return 0 # 默认为0度
当然网上也有很多 pdf 线上工具,但有安全隐患,特别是隐私需要保护的时候。为了防止用错工具,我将用到的图片工具截图如下:
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。
原文始发于微信公众号(生有可恋):如何将多张图片合并成一个pdf文件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论