不再担心数据泄露 用pypdf安全合并PDF文件

Posted by

在日常生活中,我们偶尔会遇到要把多个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)

Leave a Reply

您的邮箱地址不会被公开。 必填项已用 * 标注