使用PyPDF2将两个PDF合并为单个A4纵向PDF的问题排查
问题解决方法
原有代码问题
- 混用
PyPDF2和pdfrw两个独立的PDF处理库,逻辑割裂,依赖冗余 - 调用的
PdfFileMerger仅支持按顺序追加完整PDF页面,没有页面尺寸适配、排版调整逻辑,无法实现单页拼接、规格统一的需求 - 遍历目录合并的逻辑会把目标路径下所有PDF文件全部追加,没有定向读取指定的
left.pdf和right.pdf,容易出现多余页面 - 未定义A4纵向标准尺寸,也没有对应页面缩放、坐标定位逻辑,无法输出符合要求的纵向A4合并结果
核心参数说明
标准PDF打印规格下,A4尺寸以pt为单位:
- 纵向A4:宽
595pt,高842pt - 横向A4:宽
842pt,高595pt
如果要实现两个单页PDF拼接为单张纵向A4,只需要将两个源页面等比缩放后,分别放置在A4页面的上半区、下半区即可;如果需要将两个PDF的多页内容按顺序合并、所有页面统一为A4纵向规格,逐页做尺寸适配后追加即可。
可直接运行的实现代码
首先安装依赖:
pip install PyPDF2
以下代码实现两个单页PDF拼接为单张纵向A4文件的效果(对应之前横向拼接的纵向版本需求):
import os from PyPDF2 import PdfReader, PdfWriter, PageObject # 定义A4纵向尺寸 A4_PORTRAIT_WIDTH = 595 A4_PORTRAIT_HEIGHT = 842 HALF_A4_HEIGHT = A4_PORTRAIT_HEIGHT / 2 # 初始化读写器,创建空白A4纵向页面 writer = PdfWriter() blank_page = PageObject.create_blank_page(width=A4_PORTRAIT_WIDTH, height=A4_PORTRAIT_HEIGHT) # 读取两个待合并的PDF left_pdf = PdfReader(os.path.join("output", "left.pdf")) right_pdf = PdfReader(os.path.join("output", "right.pdf")) page_top = left_pdf.pages[0] page_bottom = right_pdf.pages[0] # 缩放页面适配半区尺寸 page_top.scale_to(width=A4_PORTRAIT_WIDTH, height=HALF_A4_HEIGHT) page_bottom.scale_to(width=A4_PORTRAIT_WIDTH, height=HALF_A4_HEIGHT) # 将两个页面分别合并到空白A4页的上、下位置(PDF坐标原点在页面左下角) blank_page.merge_translated_page(page_top, tx=0, ty=HALF_A4_HEIGHT, over=True) blank_page.merge_page(page_bottom, over=True) # 输出结果 writer.add_page(blank_page) with open("merged_portrait_a4.pdf", "wb") as f: writer.write(f)
如果你需要的是将两个PDF的所有页面按顺序合并,所有页面统一调整为A4纵向规格,用以下代码即可:
import os from PyPDF2 import PdfReader, PdfWriter A4_PORTRAIT_WIDTH = 595 A4_PORTRAIT_HEIGHT = 842 writer = PdfWriter() target_files = [os.path.join("output", "left.pdf"), os.path.join("output", "right.pdf")] for file_path in target_files: reader = PdfReader(file_path) for page in reader.pages: # 缩放页面适配A4纵向尺寸,横向页面可调用page.rotate(90)调整方向 page.scale_to(width=A4_PORTRAIT_WIDTH, height=A4_PORTRAIT_HEIGHT) writer.add_page(page) with open("merged_all_pages_a4_portrait.pdf", "wb") as f: writer.write(f)
注意事项
- 如果源PDF页面比例和A4比例不一致,
scale_to方法会自动拉伸填满区域,如果需要保持原比例留白,可以自行计算缩放比例后调用scale_by方法 - 不需要额外安装
pdfrw库,仅用PyPDF2即可完成全部需求
内容的提问来源于stack exchange,提问作者irvandi
相关产品推荐
相关产品推荐

