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

为PDF每页插入二维码后页面丢失仅存单页的问题修复

问题解决:PDF插入二维码后仅保留1页

问题原因

循环中重复使用同一个watermark_page对象(即watermark.pages[0]),修改其mediabox后合并到原页面。由于PyPDF2的PageObject是可变对象,多次修改同一个实例会导致之前的合并操作被覆盖,最终只有最后一页被正确写入输出文件。

修复后的代码

from reportlab.pdfgen import canvas
from PyPDF2 import PdfReader, PdfWriter
import qrcode  # 原代码漏导入该库,此处补上

def generate_qr(data):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=10,
        border=4,
    )
    qr.add_data(data)
    qr.make(fit=True)
    img = qr.make_image(fill='black', back_color='white')
    return img

# 生成二维码并保存临时文件
qr_img = generate_qr('https://www.example.com')
qr_image_path = "qr_temp.png"
qr_img.save(qr_image_path)

# 创建带二维码的水印PDF
c = canvas.Canvas('watermark.pdf')
c.drawImage(qr_image_path, 15, 720, width=120, height=120)  # 自定义二维码位置
c.save()

# 读取水印和原PDF文件
watermark = PdfReader('watermark.pdf')
output = PdfWriter()
input_pdf = PdfReader('input.pdf')

# 为每一页添加二维码水印
for page_number in range(len(input_pdf.pages)):
    print(f"Watermarking page {page_number} of {len(input_pdf.pages)}")
    page = input_pdf.pages[page_number]
    # 关键修复:每次循环复制新的水印页副本,避免复用同一对象
    watermark_page = watermark.pages[0].copy()
    watermark_page.mediabox = page.mediabox  # 让水印页尺寸与原页面匹配
    page.merge_page(watermark_page)
    output.add_page(page)

# 写入输出PDF
with open("output.pdf", "wb") as outputStream:
    output.write(outputStream)

# 清理临时文件
import os
os.remove(qr_image_path)
os.remove('watermark.pdf')

额外说明

  • 补充了原代码遗漏的import qrcode,否则会运行报错;
  • 核心修改点是通过watermark.pages[0].copy()创建独立的水印页副本,确保每个原页面合并的都是全新的、尺寸匹配的水印对象,彻底避免对象复用导致的页面覆盖问题。

内容的提问来源于stack exchange,提问作者Nopmd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:25:20