如何使用PyMuPDF(fitz)实现两个PDF文件逐页叠加?
使用PyMuPDF(fitz)实现PDF逐页叠加的解决方案
可以使用PyMuPDF实现该需求,相比PyPDF2处理速度提升非常明显,稳定性也更强。
你之前使用的insertPDF方法作用是将第二个PDF的所有页面追加到第一个PDF末尾,属于页面拼接,和叠加需求不匹配。叠加需要逐页将上层PDF的内容绘制到背景PDF的对应页面上,核心调用show_pdf_page方法实现。
完整实现代码
import fitz def overlay_pdfs(background_path, foreground_path, output_path): # 打开背景PDF和上层内容PDF doc_bg = fitz.open(background_path) doc_fg = fitz.open(foreground_path) # 校验两个PDF页数一致,也可根据需求修改为取最小页数处理 if len(doc_bg) != len(doc_fg): raise ValueError("两个PDF的页数必须一致") # 逐页叠加 for page_num in range(len(doc_bg)): page_bg = doc_bg[page_num] # 将上层PDF的对应页绘制到背景页上 page_bg.show_pdf_page( rect=page_bg.rect, # 上层内容填充整个背景页 src=doc_fg, pno=page_num, # 指定上层PDF的对应页码 keep_proportion=True # 保持上层页面比例,可根据需求调整 ) # 保存合并结果 doc_bg.save(output_path) # 释放文件资源 doc_bg.close() doc_fg.close() # 调用示例 overlay_pdfs( background_path="替换为你的背景PDF路径.pdf", foreground_path="替换为要叠加的上层PDF路径.pdf", output_path="替换为输出文件路径.pdf" )
常用参数调整说明
- 如需设置上层内容透明度,可添加
opacity参数,例如opacity=0.8表示上层内容半透明 - 如需调整上层内容的放置位置、大小,可修改
rect参数的值,自定义坐标和尺寸 - 如需旋转上层内容,可添加
rotate参数,传入旋转角度数值即可
方案优势
- 处理速度远快于PyPDF2,百页级PDF处理通常几秒内即可完成
- 兼容性更强,支持绝大多数加密、带特殊字体的PDF文件,不会出现PyPDF2常见的合并后字体丢失、内容错位问题
- 可定制性更高,支持调整叠加位置、缩放比例、透明度、旋转角度等多种参数
内容的提问来源于stack exchange,提问作者Demetry Pascal
相关产品推荐
相关产品推荐

