为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
相关产品推荐
相关产品推荐

