使用PyPDF2添加PDF水印时页面合并异常及层级问题求助
问题分析与修复方案
核心错误点
写入操作放在循环内部
你在每页处理完成后就执行writer.write,这不仅是冗余操作,还可能导致中间状态的文件被重复写入。正确的做法是所有页面处理完毕后再统一写入文件。页面合并的顺序与尺寸不匹配
- 原代码中用水印页面(尺寸通常较小)合并原文档页面,会导致原页面被强制缩放到水印页面的尺寸,所有内容挤在小区域内;再加上每次循环复用同一个水印页面实例,最终所有原页面内容都会叠加到同一页上。
- 调整合并顺序后,原页面作为基础合并水印,但PyPDF2的
mergePage方法是将传入的页面绘制在当前页面的顶层,所以水印会直接覆盖原文本。
修复后的代码
from PyPDF2 import PdfFileWriter, PdfFileReader writer = PdfFileWriter() # 读取原文档和水印文档 with open('sample_doc1.pdf', 'rb') as main_file, open('watermark.pdf', 'rb') as watermark_file: pdf_reader = PdfFileReader(main_file) watermark_reader = PdfFileReader(watermark_file) watermark_page = watermark_reader.getPage(0) # 遍历原文档的每一页 for page_num in range(pdf_reader.getNumPages()): current_page = pdf_reader.getPage(page_num) # 创建与原页面尺寸一致的空白页,作为合并的基础 merged_page = PdfFileWriter().addBlankPage( width=current_page.mediaBox.getWidth(), height=current_page.mediaBox.getHeight() ) # 先合并水印到空白页(水印作为底层) merged_page.mergePage(watermark_page) # 再合并原页面到顶层(原文本覆盖在水印上方) merged_page.mergePage(current_page) # 将合并后的页面添加到writer writer.addPage(merged_page) # 所有页面处理完成后,统一写入输出文件 with open("output.pdf", 'wb') as file_output: writer.write(file_output)
关键说明
- 使用
addBlankPage创建与原页面尺寸一致的空白页,避免水印页面尺寸过小导致原页面被压缩。 - 先合并水印到空白页,再合并原页面,确保水印处于底层(背景),原文本在顶层不会被遮挡。
- 将
writer.write移出循环,确保一次性写入所有处理完成的页面。
内容的提问来源于stack exchange,提问作者codingray
相关产品推荐
相关产品推荐

