请求修复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
相关产品推荐
相关产品推荐

