
本文介绍如何利用 pypdf 的页面变换功能,将多个同尺寸 pdf 文件的每页内容按行排列(如第1行放第1个pdf的10页、第2行放第2个pdf的10页),合并为一张高分辨率单页 pdf。全程纯 python 实现,无需外部依赖。
本文介绍如何利用 pypdf 的页面变换功能,将多个同尺寸 pdf 文件的每页内容按行排列(如第1行放第1个pdf的10页、第2行放第2个pdf的10页),合并为一张高分辨率单页 pdf。全程纯 python 实现,无需外部依赖。
在生成报告摘要、教学材料或批量预览场景中,常需将多个结构一致的 PDF(例如每份含 10 页 A4 截图)紧凑整合为一张可打印/查看的“网格总览页”。PyPDF(v3.0+)原生支持精细的页面坐标变换,无需借助图像渲染或第三方绘图库,即可通过 merge_transformed_page() + Transformation().translate() 实现精准布局。
核心思路
- 创建一张空白目标页,宽度 = 单页宽 × 列数(如 10),高度 = 单页高 × 行数(如 PDF 文件数 n);
- 遍历每个源 PDF(1.pdf, 2.pdf, …),再遍历其每一页;
- 将当前页按行列索引计算偏移量(x = 列索引 × 单页宽,y = (n − 行索引 − 1) × 单页高),平移后合并至目标页左下角为原点的坐标系中;
- 注意:PyPDF 坐标系原点在左下角,因此行序需倒置(即第 i 个 PDF 放在从上往下数第 i 行 → y 坐标应为 (n - i - 1) * height)。
完整可运行代码示例
from pypdf import PdfReader, PdfWriter, Transformation
# 配置参数
n = 3 # PDF 文件总数:1.pdf, 2.pdf, ..., n.pdf
pages_per_pdf = 10 # 每个 PDF 的页数(即网格列数)
page_width = 415 # 单页宽度(单位:PDF 默认用户单位,约 1/72 英寸)
page_height = 321 # 单页高度
# 创建输出器与单页画布
writer = PdfWriter()
summary_page = writer.add_blank_page(
width=page_width * pages_per_pdf,
height=page_height * n
)
# 逐个读取 PDF 并布局
for pdf_idx in range(n):
filename = f"{pdf_idx + 1}.pdf"
reader = PdfReader(filename)
# 验证页数一致性(可选但推荐)
if len(reader.pages) != pages_per_pdf:
raise ValueError(f"{filename} 页数不匹配:期望 {pages_per_pdf} 页,实际 {len(reader.pages)} 页")
for page_idx, src_page in enumerate(reader.pages):
# 计算目标位置:第 pdf_idx 行(从顶向下)、第 page_idx 列(从左向右)
# y 坐标需翻转:PyPDF 原点在左下,所以第0行(顶部)对应 y = (n-1)*h
tx = page_idx * page_width
ty = (n - pdf_idx - 1) * page_height
# 应用平移变换并合并
summary_page.merge_transformed_page(
src_page,
Transformation().translate(tx, ty)
)
# 写入结果
with open("summary.pdf", "wb") as f:
writer.write(f)
print("✅ 网格摘要 PDF 已生成:summary.pdf")关键注意事项
-
单位与尺寸适配:page_width/page_height 需根据实际 PDF 页面尺寸设定。可通过 reader.pages[0].mediabox.width 和 .height 动态获取(推荐用于通用脚本):
w = float(reader.pages[0].mediabox.width) h = float(reader.pages[0].mediabox.height)
- 缩放与裁剪:若源页尺寸不一致,可在 merge_transformed_page 前添加 .scale() 或 .cropbox 调整;
- 内存效率:对大量 PDF 或大页面,建议逐文件处理后显式删除 reader 对象,避免内存累积;
- 字体与矢量保真:此方法直接复用原始 PDF 内容流,完全保留文字、矢量图形及超链接(如有),优于截图拼接方案。
通过上述方式,你不仅能高效构建结构化 PDF 摘要页,还能灵活扩展为 m×n 动态网格、带边框/标题的复合布局,真正发挥 PyPDF 在 PDF 文档级合成中的强大能力。










