1. 批量合并打印这件事,到底在解决什么问题
先说个前提:我在这里聊的“批量合并打印”,指的是把多张电子发票、行程单、报销票据汇总成一份PDF文件,再按版面需求一次打印出来。这个方法最典型的落地场景就是报销:财务月底收上来几十上百张发票,每一张都单独打开打印,再手动按金额排序,那场面我见过太多——打印机旁边堆一摞散纸,手忙脚乱,漏一张就得翻垃圾桶。
我自己每个月要处理三四十张差旅发票,早先也是老老实实一张一张导出来,然后用PDF阅读器逐个打印。时间一长就发现几个问题:一是费时间,平均每张票从打开文件到打印完成大概要两分钟,四十张就是一个多小时;二是纸张浪费严重,很多电子发票打印出来只有半页,另一半空白;三是顺序容易乱,打印完成后如果中间夹一张无关票据,后续贴报销单时还得重新理一遍。批量合并打印这套流程,说到底就是把“逐张处理”变成“一次处理”,把“散乱输出”变成“规整输出”。
适合看这篇文章的人,我总结了一下,主要是这几类:经常出差报销的销售和项目人员,财务部门负责票据归档的同事,行政前台这类要帮多人代打印的岗位,以及自己开公司需要处理日常票据的创业者。当然,如果你只是偶尔打一两张发票,看完了解思路就够了,不需要整套流程都搬回去。
2. 票据整理的底层逻辑与方案选型
2.1 先理清一个事实:所有票据最终都要变成PDF
很多朋友问我的第一句话是:合并打印用什么软件?但我通常先反问一句:你手里的票据都是什么格式?
实际工作里,票据来源五花八门。最常见的是电子发票PDF文件,这个最好办;然后是电子发票XML文件,比如数电发票的原始XML;还有拍照或扫描出来的纸质发票图片,通常是JPG或PNG;再有就是行程单、银行回单、出租车票,这些往往只有纸质版。我的处理原则是:不管来源是什么,最终全部统一成PDF格式,再做合并。
为什么要统一格式?因为后面的打印排版需要依赖文件页面的统一尺寸与方向。如果把PDF和图片混在一起合并,不同页面横向纵向交替,打印出来的效果会非常难看。而且PDF格式在跨设备、跨打印机时不会出现字体丢失、图片变糊这类问题,连报销系统要求上传附件时也基本只认PDF。把图片转PDF这一步,我一般用系统自带打印功能:在图片查看器里直接选择打印成PDF,或者用免费的图片转PDF小工具,批量拖进去几十张图,一次导出成一个PDF,效率很高。
这里有一个小细节要提醒:图片转PDF之前,先把图片裁掉多余的白边。很多人用手机拍摄发票,拍出来四周全是桌面背景,直接转PDF会让画面里的发票只占很小一块。打印出来要么字太小,要么为了放大又把白边一起放大了,票面信息反而被截断。我一般用手机相册自带的编辑裁剪功能,先把发票主体框出来再转PDF,一张票不到十秒钟。
2.2 合并工具别乱选,我替你排过雷
PDF合并工具市面上很多,但真正适合批量处理的其实就那几类。我把用过的方案分四种,各有优劣。
第一种是Adobe Acrobat的“合并文件”功能。这个最省心,直接把多个PDF拖进去,自动排序,输出一个完整文件。缺点是正版订阅费用不低,如果只为了合并票据就买一年,不太划算。但如果你公司本来就买了Adobe全家桶,那直接用它就是最优解。
第二种是免费开源工具PDFsam。这个我用了比较久,它的“合并”功能支持添加文件夹,可以一次性倒入几十个PDF,按文件名排序合并。界面简单,不联网也能用,关键是免费无广告。对处理发票这种场景来说,功能完全够。不过要注意,它合并时对同一个文件夹内的文件排序,是按照Windows文件资源管理器的规则来的,稍后我会细说命名的重要性。
第三种是浏览器打印法,其实不算真正意义的合并,因为网页只能一个一个文件地打印,除非你把这些PDF全部拖到同一个浏览器窗口的多标签页里,然后选择“打印所有标签页”。但这里有个致命问题:浏览器打印多标签页时,纸张大小、缩放比例经常会自己变,而且不能精细控制每张A4纸上放几张票据。我试过两次,一次打出来页面有大有小,另一次直接把一个两页的PDF拆成了两张纸,不适合批量场景。
第四种是命令行脚本方案,比如用Python的pypdf库写几行代码来合并。这个方案适合会一点编程的人,优势是深度可控,可以自定义排序规则、按发票金额顺序重排、甚至加一个统一封面,全自动。劣势是需要装Python环境,对不熟悉命令行的人不友好。我自己现在是用脚本处理,但如果你是第一次接触,先从PDFsam开始就好。
我不太推荐用在线网页合并工具,原因有几个:第一,发票里有企业税号、个人住址这部分隐私信息,上传到第三方服务器我并不放心;第二,很多在线工具限制文件数量,一次只能传五个文件,超过就要付费;第三,真的见过朋友用在线工具合并完PDF,下载下来的文件页面顺序错乱,因为服务器按处理时间排序而不是按文件名排序,从头再来更浪费时间。
3. 核心实操步骤:从散乱票据到规整打印文件
3.1 文件命名和排序,决定了90%的打印效率
很多人忽略一个关键点:合并PDF之后的页面顺序,几乎完全取决于文件名的排序规则。Windows资源管理器默认按文件名逐字符排序,所以你如果把文件命名为“发票1”“发票2”……一直排到“发票10”,合并出来的顺序会变成1、10、2、3、4……因为字符排序里“1”排在“2”后面,但“10”又排在“2”前面。
我是怎么处理的?统一采用这套命名规则:六位日期 + 姓名 + 类别 + 两位序号。
比如:250401 张三 差旅高铁 01、250401 张三 差旅住宿 02、250402 李四 市内打车 01。
这套规则的底层逻辑是:日期决定了票据的时间先后,类别决定了合并后票据的归组,序号保证同一批同类票据内部不乱。在文件夹里按名称排序后,所有票据自然就是“时间+类别”的双重顺序,再添加到PDFsam时,合并出来的文档顺序和报销单粘贴顺序完全一致,一分钟都不用额外整理。
这里要特别说明一点:如果你用的是扫描纸质发票,尽量在扫描时就按这个规则命名,不要扫完再批量改名。因为扫描仪生成的文件名往往是“Scan001”“Scan002”,改起来非常麻烦。更合理的做法是把票据先按时间排好,再放进扫描仪自动进纸器,一次扫描成一个连续PDF。我自己用普通家用扫描仪时,就是先垫一张索引纸,在索引纸上写上“1-10号是高铁票、11-15号是住宿票”,然后再开始扫,这样后续拆分时心里有数。
3.2 合并操作怎么做得又快又稳
以PDFsam为例,点开“合并”工具后,直接把一个文件夹里的PDF全部选中拖进去,界面下方会列出一个预览列表,此时可以手动拖动调整顺序,也可以点“排序”按钮按文件名重新排列。我的习惯是拖进去后先不着急点击运行,先扫一眼列表里有没有文件名重复的,有没有明显排序错位的。
如果发现文件数对不上,最常见的原因是漏掉了某个子文件夹,或者同名文件被系统遮挡。我会把文件资源管理器打开到同一路径,在PDFsam里用“排序”功能,再对比一下两侧的总数与末尾文件名,确认一致后再合并。这样虽然多花一分钟,但能避免最后打印完才发现少一张票,再回炉重打,那才是真的浪费。
用Python脚本合并的话,我只贴一个最简单的片段作为思路参考:
from pypdf import PdfWriter, PdfReader file_list = sorted([f for f in os.listdir("票据文件夹") if f.endswith(".pdf")]) merger = PdfWriter() for f in file_list: merger.append(PdfReader("票据文件夹/" + f)) merger.write("合并结果.pdf")这个脚本做的事就是按照文件夹里“排好序的文件名”依次拼接PDF,效果和PDFsam一样,好处是一劳永逸,下次沿用同一套文件夹结构就不用再打开图形界面了。不过要注意,pypdf库需要先通过pip安装,具体环境这里不展开。
3.3 页面布局和打印参数,别忽略这个环节
合并后的PDF是一页一张票据的,直接按这个打印,本质上和逐张打印没区别,纸张浪费依旧。真正的重点在于打印对话框里的“每张纸打印多页”设置。
Windows系统自带的打印驱动,通常支持每张纸打印1页、2页、4页、6页、9页这类固定版式。我用得最多的组合是“每张纸打印4页”,因为一张A4纸被均匀分成四块,每块约105毫米宽、148毫米高,刚好放下一张还原度较好的全尺寸或略缩小的发票。如果发票本身是A5左右大小(例如很多出租车票、火车票),我会用“每张纸打印6页”的紧凑模式。如果票据文字很小,比如增值税发票右下角有一长串备注说明,你会发现4页版式还勉强看清,6页就吃力了,我会退回2页版式保证清晰度。
注意“缩放方式”这个参数。我遇到不少同事习惯选“适合页面”,结果打印出来票据被放大到整张A4纸,清晰度反而下降,而且四边内容容易溢出。更合理的选择是“实际大小”或“100%缩放”,再配合每张纸多页的版式。因为发票PDF本身是按照真实票据页面尺寸生成的,100%缩放再套进四分格里,刚好能保留原始比例,打出来的票据不会变形。
还有一个很多人忽略的选项是“自动旋转”。部分票据扫描件是横向的,合并进文档后依然横着,如果打印机驱动开了自动旋转,所有横向页面会被自动转成竖向,版式会变乱。我通常关闭自动旋转,让页面保持原始方向,然后在排版时手动决定这批横向票据统一放在文档靠前或靠后的位置,也就是提前按方向归好组。
4. 实操过程实录:以月度差旅报销为例
4.1 需求设定与纸张用量计算
我用一个真实场景来演示整套流程:某个月需要报销差旅费,一共收到28张电子发票,另外有6张纸质出租车票需要扫描成PDF,合计34张票据。假如一张一张打,34张发票对应的就是34页A4纸,实际上很多票据只占半页,浪费极大。
合并后采用每页4张票据的版式,34张除以4,等于8.5页。理论上需要9张A4纸,但实际操作中我会凑成8个整页,也就是32张票据打成8页,剩下2张票据和它们关联的行程单放成第9页,因为计算纸张成本时没多大差别,但多出来那页我会顺便把报销单封面也一起打印出来,一张纸两用。
纸张用量对比很直观:逐张打印34页,合并四合一打印9页,节约了约25张A4纸。按一包纸500张25块钱算,单看纸张节约不到两块钱,好像不起眼。但真实价值在于处理时间:逐张打印时你需要重复34次“打开文件-点打印-等输出-确认张数”,合并后这个动作只做了一次,光等待时间就省下四十分钟。做财务月结时,这四十分钟就是能不能准点下班的区别。
4.2 从收集到输出的完整流程拆解
第一步,收集原始文件。把手机里收到的电子发票PDF、邮箱附件里的行程单、从公司报销系统导出的订单确认页,全部放进一个新建文件夹,文件夹命名为“202504差旅报销”。
第二步,按前面说的命名规则批量改名。这一步如果是几十文件,手动改比较痛苦,我一般用免费的批量重命名工具,或者直接用Windows资源管理器全选后按F2逐个改名再补序号。技能允许的话可以用一条简单的PowerShell命令:遍历文件,按创建时间重命名为固定前缀加序号。这里贴一段参考,方便懂的人复制:
Get-ChildItem "票据文件夹" -Filter *.pdf | Sort-Object LastWriteTime | ForEach-Object { Rename-Item $_ -NewName ("2504-" + $_.LastWriteTime.ToString("MMdd") + "-" + $_.Name) }第三步,把纸质票据扫描。我用的是一台普通多功能一体机,默认扫描分辨率300dpi,这个值对票据来说足够了。如果扫描件是黑白的,反而更清晰,因为部分红章在黑白模式下会变成黑章,但很多报销系统并不要求保留红色,实际可以接受。如果公司要求必须打印红色印章,那我建议用彩色扫描。关于分辨率的计算逻辑下面重点讲。
第四步,PDF合并。用PDFsam批量拖入文件,确认顺序无误后点击运行,输出文件命名成“202504差旅报销合并.pdf”。合并后我会顺手打开检查一遍,重点看有没有空白页、方向颠倒、重复页。
第五步,打印版式设置。打开合并PDF,按Ctrl+P进入打印对话框,选择打印机,在“页面设置”区域把每张纸打印的页数改为4,纸张方向选择自动,缩放100%。如果预览里发现某页内容有超出边界的迹象,不要直接打印,回到PDF里编辑修正,比如调整白边或者重扫描那一张。
第六步,先打一张测试页。很多朋友觉得多打一页纸是浪费,但这一页能避免更大的浪费。测试方法很简单:在打印对话框中设置打印范围为第1页(或者只打合并文件的第一页),先输出一张看看。重点看三个区域:最上角的发票代码是否清晰,中间的金额数字是否完整,票面底部的二维码是否能扫描。确认没问题再把测试页范围改回全部,生产环境跑起来才有底。
4.3 扫描分辨率如何定:一个简单计算逻辑
扫描部分很多人拿不准,我把一个经验值分享出来。纸质发票最小字号一般在一号以下,正常视力大约需要票据打印长度不小于原始票面的80%,扫描分辨率300dpi是底线,600dpi更好,但你会发现文件体积大很多,处理速度反而下降。我的折中方案是普通A4发票用300dpi,那些字特别多、密密麻麻的银行回单用600dpi。
如果打印出来字迹发虚,先排除两个原因:一是原始扫描分辨率不够,重新扫一次;二是打印时缩放比例不是100%,PDF页面被自动缩放得太小。只要保持“PDF内容不压缩、扫描时分辨率够、输出时版式缩放合理”这个三角关系,字迹发虚基本可控。
5. 常见问题与排查技巧实录
5.1 高频问题速查表
这里把我踩过的坑按症状整理成一张表,方便大家直接对照。
| 症状 | 常见原因 | 解决办法 |
|---|---|---|
| 打印出来二维码扫不动 | 票据尺寸缩太小,或分辨率低于300dpi | 改用2页/4页版式,重新扫描原件 |
| 合并后页面顺序乱 | 文件名未按规则排序 | 统一用“日期+姓名+类别+序号”命名后再合并 |
| 有些票据内容被切掉边缘 | 打印缩放选了“适合页面”且比例失调 | 改为100%缩放,检查PDF页面边距 |
| 打印机总是多吐一张空白页 | PDF末页有隐藏空白 | 合并后检查文档末页,删除多余页面 |
| 横向票据掺在竖向页面里 | 文件方向未分组 | 合并前按横向/竖向分类,或打印时关闭自动旋转 |
| 图片转PDF后整体偏白、字看不清 | 图片压缩过度或扫描太暗 | 重新扫描,使用300dpi,关闭“减小文件大小”选项 |
第一条我专门展开说:二维码扫描识别的原理是靠深浅色块的对比度,如果票据被缩小到整体尺寸只有原票面的四分之一,二维码的每个模块可能只剩不到1毫米,大多数扫码设备就识别不出。打印之前我自己会用“四合一输出后放大屏幕检查”的方式判断:把PDF放大到200%,观察右下角二维码区域,如果黑白色块边界模糊,放大后还有灰阶过渡,那打印出来大概率扫不出。这种情况宁可用每张纸打2页,多费一点纸,也别让财务收不了单。
5.2 实际排查两个案例的过程记录
第一个案例是有一次合并了27张电子发票,打印后发现第14张和第15张顺序颠倒了。排查时我意识到问题出在命名上:这两张发票一个是电子发票,一个是销售人员自己拍照转的PDF,拍照文件生成时间晚,但业务应该发生在前面。我的处理办法是先把两张发票的业务日期提取出来,按业务日期重命名,而不是按文件创建时间。现在我在落地这个流程时,每次命名前都会先检查发票票面的开票日期,而不只看文件属性里的创建时间,这个细节值得大家借鉴。
第二个案例更刁钻:合并后打印一切正常,但财务扫描系统提示“文件页数超限”,因为系统单条报销记录只允许50页以内。我帮同事处理时,把每页4张票据的版式改成每页6张,总页数从52页压到34页,就通过了系统校验。这个思路说明,批量合并打印不仅是为省纸,遇到系统限制时也能从容应对。
5.3 双面打印要不要用
很多办公室打印机支持自动双面打印,但用在我这套流程里要小心。如果每张A4纸正反面各打4张票据,虽然纸张用量再减一半,但后续粘贴报销单时需要反复翻看正反面,非常别扭。而且如果有一页需要重打,背面那页也废了,反而更费纸。我的经验是:默认单面打印,只有那些不需要粘贴、直接归入档案的批量凭证,才考虑双面打印。
如果是低碳环保的要求必须双面,我会打印前在PDF里手动调整页面顺序:把第一个四分格放奇数页票据,第二个四分格放偶数页票据,正反面对应好再输出,但这套操作比较复杂,现实中除非一次性打印几百张,不然不建议普通用户耗费这个精力。
6. 我在这套流程里打磨出的小经验
文章写到这里,最后分享一些纯属于个人“用时间换出来的”细节。
第一,文件夹里保留一份“合并前”的原始文件,永远不要只留合并结果。因为打印完成后如果需要单独重新出一张票,比如某张发票被财务退回,你还能在原文件夹里快速定位,重新打印单张,不用把整个合并文件拆开。我习惯每次合并前先复制一份到“待归档”目录,这个习惯救过我许多次。
第二,Windows自带打印对话框里的“每张纸打印的页数”其实是打印机驱动提供的,不同品牌驱动界面差异很大。有的打印机驱动叫“多合一打印”,有的叫“每张纸页数”,还有一些国产打印机需要到“高级设置”里翻。如果一个机型找不到这个选项,就手动用PDF软件自带的“小册子排版”或“N合一”功能,比如在Adobe Acrobat里可以选择“每张纸打印多页”,效果跟驱动程序一致。
第三,遇到一批发票文件很大、合并时电脑卡顿的情况,别硬等。先检查是不是有几个照片转的PDF体积特别庞大,比如单张超过20MB。这种情况下先把那几张照片重新转成压缩版PDF,控制在2MB以内,再重新合并。卡顿的主要原因是合并工具需要把多页内容写入一个文件,文件太大会占满内存,尤其老电脑上特别明显。
第四,针对那些一个月里会固定收到大量发票的人,我建议直接把“票据整理”做成一个半自动流程:建好一个待合并目录,放入PDF后运行一个批处理脚本,自动按开票日期重命名、自动合并、自动按每页四张输出一份打印版。虽然第一次搭建要花半小时,但之后每个月能省出至少一下午的机械式操作时间。我自己现在基本就是这个状态:月底收到的发票扔进文件夹,双击脚本,两分钟后拿打印稿,所有票据排版整整齐齐。
批量合并打印本身不是什么高深技术,但它确实把报销里最“隐形”的时间成本降下来了。如果这篇经验能让你下个月处理票据时少按几十次Ctrl+P、少翻几次垃圾桶,那我觉得写得很值。