You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyPDF2添加PDF水印时页面合并异常及层级问题求助

问题分析与修复方案

核心错误点

  1. 写入操作放在循环内部
    你在每页处理完成后就执行writer.write,这不仅是冗余操作,还可能导致中间状态的文件被重复写入。正确的做法是所有页面处理完毕后再统一写入文件。

  2. 页面合并的顺序与尺寸不匹配

    • 原代码中用水印页面(尺寸通常较小)合并原文档页面,会导致原页面被强制缩放到水印页面的尺寸,所有内容挤在小区域内;再加上每次循环复用同一个水印页面实例,最终所有原页面内容都会叠加到同一页上。
    • 调整合并顺序后,原页面作为基础合并水印,但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:35:21