多张手机拍的照片,一键变成了一个可以直接发人的PDF,名字是 scanned_contract.pdf,放在你指定的输出目录里。打开就能看,清晰度合格,页面都是按A4排好的,没有水印。

程序跑起来实则挺直白。最后把每张图片一页页写进PDF,用的是 reportlab 的画布(canvas),写完一张就翻页,最后一把刀保存成文件。遇到打不开的图片不会把整个流程掀翻:会把出问题的文件名和错误缘由打印出来,然后继续处理下一张。等全都处理完,控制台会弹一句话告知你生成成功,文件路径也清清楚楚。
再往前说说图片怎么被处理的。脚本通过 Pillow(也就是 PIL)逐张打开图片。先把可能存在的透明通道弄掉,避免PNG那种透明背景在PDF里变成黑块或者出错;如果图片是调色板模式,就把它转成RGB。拍照时横着拍的许多,人为方便阅读,脚本里做了个判断:只要宽比高大,就顺时针旋转90度。接着按A4纸算好能放图的尺寸,按比例把图片缩放,不会把图片拉变形,也不会超出页面,然后把图片居中放好。每处理完一张,用 showPage 新起一页,这样一张图片对应一页PDF。

再再往前,看脚本怎么找到图片。你给它一个文件夹路径,脚本会把常见后缀的图片都挑出来(.jpg、.jpeg、.png、.bmp、.gif),按文件名排序后排成一个列表,然后按顺序处理。图片数量没所谓,几张到上百张都能照常干活。脚本和图片不必放一块儿,路径都能写绝对路径,所以你想把图片放在别的盘也行,输出PDF路径也能指定成任意可写的位置。
运行前要准备的东西也写清楚了:系统里装好 Pillow 和 reportlab。常见的安装命令是 pip install pillow reportlab。把手机拍的照片按你想要的顺序放进文件夹,列如给文件名加序号(1.jpg、2.jpg),然后在脚本里改 image_dir 和 output_pdf 两个变量,直接跑就行。先试几张图片看效果,调着来一遍,出现问题按控制台的错误信息去定位替换那张图就行。要是不想用付费APP,这招省钱又能学点皮毛。
下面把实现逻辑用更接地气的步骤说一遍,方便你理解每一步在干嘛:
– 导入 Pillow 的 Image,和 reportlab 的 canvas 与页面尺寸常量。
– 写个函数,参数是图片路径列表、输出PDF路径和页面尺寸。
– 在函数里新建一个画布对象,按顺序循环处理每张图片:
– 用 Image.open 打开文件;
– 有透明通道就合成到白底上;是调色板模式就转RGB;
– 若检测到图片宽大于高,就顺时针转 90 度;
– 按 A4 的可用区域算出缩放比例,等比缩放到不超页,再居中定位;
– 用画布的 drawImage 把处理好的图片画上去,画完一页就 new page(showPage);
– 出现异常用 try/except 捕获,打印出问题文件和错误信息,然后继续下一张;
– 循环结束后保存画布,打印“PDF生成成功:路径”,让你知道文件在哪儿。
举个具体例子说明流程会更直观。假设你把照片放在 D:pythonimg,想输出的文件叫 scanned_contract.pdf。脚本会先读那个文件夹,挑出以 .jpg/.jpeg/.png/.bmp/.gif 结尾的文件,用 sorted 排好名字(所以文件名的先后决定PDF的页序),拼成完整路径的列表,交给合并函数去处理。处理过程中如果有一张打不开,会在控制台打印出文件名和异常信息,你可以去看那张是不是损坏、后缀被改了,或者拍糊了,换掉再跑一遍就行。
说说常见问题和对策,省得你走弯路:
– 图片方向不对:脚本按宽高判断并旋转,这对多数合同类竖版照片有效。但有人斜着拍或把手机旋转锁开关玩花了,还是可能需要手动先把方向矫正。
– 透明PNG变黑或不显示:PDF里对透明不太友善,脚本是把透明区域合成白底,这样打印和查看都稳妥。如果你想保留背景透明,那就不适合生成普通PDF。
– 顺序乱了:一般是文件名排序的问题。要按你希望的页序,最稳妥的做法是给文件名前面加序号,或在脚本里用文件创建时间做第二层排序。
– 损坏或特殊格式图片:脚本会跳过有问题的文件并把错误打印出来,方便你定位和替换。
– 图片太大或分辨率过高:尽管按比例缩放能把它放进A4,但内存占用会随图片分辨率增加而上升。如果电脑卡得慌,先把图片用批量压缩工具处理一下再合并。
如果你是第一次动手,操作顺序提议这样来:装好依赖,建个空文件夹,把几张手机拍的照片按顺序丢进去(文件名上标好就万无一失),把脚本里的路径改成你自己的,先跑一遍看生成的PDF。不对劲就看控制台提示,哪张出错就把它换掉或重新拍。试着多跑几次,你会找到最省心的拍照姿势和命名规则。
这个方法和用扫描仪、手机APP相比各有利弊。扫描仪出来的效果最好但不常见,手机APP方便但有些好用的要收费或带水印。用Python脚本的好处是你能完全控制流程,批量处理又不收费,坏处是需要动手改个路径、装个库,但这些门槛不高,跟着提示一步步来就能行。
要是碰到奇怪的错误,报错信息里一般会告知是哪一步出问题。常见就是文件打不开、模式不支持、或者磁盘没权限写入。按错误提示去查文件名、文件权限或图片格式,绝大多数问题都能快速解决。把能复用的脚本保存好,下次有同类需求直接改个路径就能干活,省时省事。
把这套流程当成一个小工具来用,能把手机拍的合同、发票、笔记等材料快速整理成一份标准的A4 PDF,方便发邮件、存档或打印。试着按自己的场景调整一些细节,列如把背景改成淡灰色,或者把排序规则改成按创建时间而不是文件名,脚本改动都不大,灵活度高。