在日常生活中,我们偶尔会遇到要把多个PDF合并成一个文件的情况。比如出差报销时,很多情况下要把机票、住宿和发票整理成一份文件。很多人第一反应是去搜索“PDF合并在线工具”等关键词,但点进去后就会发现,这些网站需要用户把文件上传到服务器。虽然这些网站十分方便,但如果文件里有个人信息、签名、银行卡号等敏感信息,那就等于把隐私交给了别人。
其实,这种操作完全可以自己在本地完成,而且非常简单。只需要利用Python的几十行代码,就能轻松把多个PDF文件合并成一个文件。
本篇博客将使用pypdf库,分享一个能够自动识别横竖版并统一页面尺寸为A4的简洁脚本。只需要把下面的代码保存为一个 .py 文件,放在需要合并的PDF所在的文件夹中运行,就能轻松完成全部操作。
与一般的PDF合并不同,这个脚本会在合并的同时,对每页进行缩放与居中处理,让横版页面横着、竖版页面竖着,都保持整齐一致。此外,代码在生成文件后会进行一次“重构”,这是为了照顾到Adobe Acrobat这类对PDF格式要求极高的软件。这样一来,不论你用哪种阅读器打开,都能正常显示,不会报错。
from pypdf import PdfReader, PdfWriter, Transformation
from pypdf.generic import RectangleObject
import os
A4_WIDTH = 595.28 # pt
A4_HEIGHT = 841.89 # pt
# 自由调整合并文件的顺序
pdf_files = [
"第1个PDF.pdf",
"第2个PDF.pdf",
"第3个PDF.pdf",
"第4个PDF.pdf"
]
temp_output = "merged_temp.pdf"
final_output = "merged_file.pdf"
writer = PdfWriter()
for filename in pdf_files:
reader = PdfReader(filename)
for page in reader.pages:
w, h = float(page.mediabox.width), float(page.mediabox.height)
# 自动判定横版或竖版
if w > h:
target_w, target_h = A4_HEIGHT, A4_WIDTH
else:
target_w, target_h = A4_WIDTH, A4_HEIGHT
# 计算缩放比
scale = min(target_w / w, target_h / h)
tx = (target_w - w * scale) / 2
ty = (target_h - h * scale) / 2
transform = Transformation().scale(scale).translate(tx, ty)
page.add_transformation(transform)
# 页面大小设置为A4
page.mediabox = RectangleObject((0, 0, target_w, target_h))
writer.add_page(page)
# 输出PDF文件
with open(temp_output, "wb") as f:
writer.write(f)
# 针对Acrobat的重构
final_reader = PdfReader(temp_output)
final_writer = PdfWriter()
for page in final_reader.pages:
final_writer.add_page(page)
with open(final_output, "wb") as f:
final_writer.write(f)
os.remove(temp_output)
print("已合并完成")
print("已生成文件:", final_output)