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

请求修复PyPDF2给A2尺寸PDF添加居中水印时旋转90度的问题

修复PyPDF2处理大尺寸PDF页面时水印旋转问题

问题根源是PyPDF2默认的水印绘制逻辑未适配大尺寸页面的旋转属性(比如横向A2页面通常会设置90/270度旋转),导致水印被错误旋转。核心修复思路是先获取页面的实际旋转状态,再反向调整水印的旋转角度和位置坐标。

具体修复步骤及代码示例

假设你原本的水印脚本类似下面的基础版本(存在旋转问题):

from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import AnnotationBuilder

def add_watermark(input_pdf, output_pdf, watermark_text):
    reader = PdfReader(input_pdf)
    writer = PdfWriter()
    
    for page in reader.pages:
        watermark = AnnotationBuilder.free_text(
            text=watermark_text,
            rect=(0, 0, page.mediabox.width, page.mediabox.height),
            font_size=40,
            font_color=(0.5, 0.5, 0.5),
            border_color=None
        )
        page.add_annotation(watermark)
        writer.add_page(page)
    
    with open(output_pdf, "wb") as f:
        writer.write(f)

修改后的修复版本:

from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import AnnotationBuilder

def add_watermark(input_pdf, output_pdf, watermark_text):
    reader = PdfReader(input_pdf)
    writer = PdfWriter()
    
    for page in reader.pages:
        # 获取页面旋转角度,无旋转时默认0
        rotate_angle = page.get('/Rotate') or 0
        # 原始页面媒体框尺寸
        orig_w, orig_h = page.mediabox.width, page.mediabox.height
        
        # 根据旋转角度计算页面实际显示的宽高
        if rotate_angle in (90, 270):
            actual_w, actual_h = orig_h, orig_w
        else:
            actual_w, actual_h = orig_w, orig_h
        
        # 预设文本尺寸(可根据字体大小调整,或用reportlab动态计算)
        text_w, text_h = 200, 50
        # 计算实际页面中的居中坐标
        x_center = (actual_w - text_w) / 2
        y_center = (actual_h - text_h) / 2
        
        # 根据页面旋转角度,转换水印的位置和旋转方向
        if rotate_angle == 90:
            # 页面顺时针转90度,水印逆时针转90度抵消,同时调整坐标
            wm_x, wm_y = y_center, actual_w - x_center - text_w
            wm_rotate = -90
        elif rotate_angle == 270:
            # 页面逆时针转90度,水印顺时针转90度抵消,调整坐标
            wm_x, wm_y = actual_h - y_center - text_h, x_center
            wm_rotate = 90
        elif rotate_angle == 180:
            # 页面翻转180度,水印同步翻转
            wm_x, wm_y = actual_w - x_center - text_w, actual_h - y_center - text_h
            wm_rotate = 180
        else:
            # 无旋转,直接使用居中坐标
            wm_x, wm_y = x_center, y_center
            wm_rotate = 0
        
        # 创建带旋转的水印注释
        watermark = AnnotationBuilder.free_text(
            text=watermark_text,
            rect=(wm_x, wm_y, wm_x + text_w, wm_y + text_h),
            font_size=40,
            font_color=(0.5, 0.5, 0.5),
            border_color=None,
            rotate=wm_rotate  # 关键:设置水印旋转角度
        )
        
        page.add_annotation(watermark)
        writer.add_page(page)
    
    with open(output_pdf, "wb") as f:
        writer.write(f)

额外优化提示

  • 动态计算文本尺寸:如果需要精确匹配文本实际宽度,可引入reportlab库的Canvas和Font模块计算文本的宽高,替换代码中固定的text_w和text_h。
  • 多场景测试:针对A2、A1等不同尺寸的横向/纵向页面测试,确保水印始终居中且方向正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:37:54