本文介绍如何利用 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 截图)紧凑排布于单页——形成「N 行 × 10 列」的网格布局。PyPDF(v3.0+)原生支持精确的页面坐标变换,无需借助 PIL 或 reportlab 等图像处理库,即可实现像素级定位拼接。
核心思路
- 创建一张空白目标页,宽度 = 单页宽度 × 列数(如 10),高度 = 单页高度 × 行数(如 n);
- 遍历每个源 PDF(1.pdf, 2.pdf, …),将其每一页按行列索引计算偏移量,通过 merge_transformed_page() 平移叠加至目标页指定位置;
- 注意:PyPDF 坐标系原点在左下角,因此第 i 行(从 0 开始)的 Y 偏移应为 (n - 1 - i) * page_height,以实现“第1个PDF在顶部”的自然阅读顺序。
完整可运行示例
from pypdf import PdfReader, PdfWriter, Transformation
# 配置参数(请根据实际 PDF 尺寸调整)
n = 3 # PDF 文件总数:1.pdf, 2.pdf, ..., n.pdf
pages_per_pdf = 10 # 每个 PDF 的页数(即网格列数)
page_width = 415 # 单页宽度(单位:PDF 默认用户单位,约等于 1/72 英寸)
page_height = 321 # 单页高度
# 创建输出对象与空白目标页
output = PdfWriter()
summary_page = output.add_blank_page(
width=page_width * pages_per_pdf,
height=page_height * n
)
# 逐个读取 PDF 并拼接页面
for i_pdf in range(n):
pdf_path = f"{i_pdf + 1}.pdf"
reader = PdfReader(pdf_path)
# 验证页数一致性(可选但推荐)
if len(reader.pages) != pages_per_pdf:
raise ValueError(f"{pdf_path} 页数不匹配:期望 {pages_per_pdf} 页,实际 {len(reader.pages)} 页")
for i_page, src_page in enumerate(reader.pages):
# 计算目标位置:第 i_pdf 行、第 i_page 列 → X = i_page * w, Y = (n-1-i_pdf) * h
tx = i_page * page_width
ty = (n - 1 - i_pdf) * page_height
transform = Transformation().translate(tx, ty)
summary_page.merge_transformed_page(src_page, transform)
# 写入结果
output.write("summary.pdf")
output.close()
print("✅ 已生成 summary.pdf:", n, "行 ×", pages_per_pdf, "列网格布局")关键注意事项
-
尺寸适配:page_width 和 page_height 必须与源 PDF 页面实际尺寸一致。可通过 reader.pages[0].mediabox.width 和 .height 动态获取(推荐用于生产环境):
box = reader.pages[0].mediabox page_width = float(box.width) page_height = float(box.height)
- 坐标系陷阱:Transformation().translate(x, y) 中的 y 是相对于目标页左下角的纵向偏移,因此需用 (n−1−i_pdf) 而非 i_pdf 实现从上到下的行序。
- 内存安全:若 PDF 较大或数量较多,建议在循环内显式删除 reader(del reader)并调用 gc.collect(),避免内存累积。
- 兼容性:本方案要求 pypdf >= 3.0.0;旧版 PyPDF2 不支持 Transformation,请务必升级。
通过上述方法,你可在无外部依赖的前提下,精准、高效地构建结构化 PDF 摘要页——兼顾专业性与可维护性,适用于自动化文档流水线。










