源PDF MediaBox异常导致ReportLab水印与PyPDF2合并后旋转90度求助
解决PDF水印旋转错位问题(ReportLab + PyPDF2)
问题核心
源PDF和水印PDF的页面方向定义逻辑不一致:
- 源PDF:以纵向MediaBox(2384×5102)为基础,通过
Rotate 90属性实现横向显示 - 水印PDF:直接使用横向MediaBox(5102×2384),
Rotate属性为0
PyPDF2合并时会严格遵循PDF的原始属性,导致两者叠加出现90度旋转错位。
解决方案一:调整水印PDF属性匹配源PDF
生成水印时,采用和源PDF一致的纵向MediaBox,再通过Rotate属性实现横向显示,确保两者属性完全对齐。
from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A0 from PyPDF2 import PdfReader, PdfWriter # 1. 生成匹配源PDF属性的水印 # 用纵向A0尺寸(和源PDF的MediaBox一致) c = canvas.Canvas("watermark.pdf", pagesize=A0) # 旋转画布90度,确保水印内容横向显示 c.rotate(90) # 绘制水印内容(示例为文本,可替换为其他元素) c.drawString(1000, 500, "自定义水印文本") c.save() # 2. 合并PDF并统一Rotate属性 source_reader = PdfReader("source.pdf") watermark_reader = PdfReader("watermark.pdf") writer = PdfWriter() source_page = source_reader.pages[0] watermark_page = watermark_reader.pages[0] # 将水印页面的Rotate设为90,和源PDF一致 watermark_page.Rotate = 90 # 叠加页面 source_page.merge_page(watermark_page) writer.add_page(source_page) with open("merged.pdf", "wb") as f: writer.write(f)
解决方案二:调整源PDF属性匹配水印PDF
如果不想修改水印生成逻辑,可将源PDF转换为和水印一致的横向定义(Rotate=0 + 横向MediaBox)。
from PyPDF2 import PdfReader, PdfWriter source_reader = PdfReader("source.pdf") watermark_reader = PdfReader("watermark.pdf") writer = PdfWriter() source_page = source_reader.pages[0] watermark_page = watermark_reader.pages[0] # 重置源页面的Rotate属性为0 source_page.Rotate = 0 # 交换MediaBox的宽高,适配横向尺寸 mediabox = source_page.mediabox source_page.mediabox.upper_right = (mediabox.height, mediabox.width) # 叠加页面 source_page.merge_page(watermark_page) writer.add_page(source_page) with open("merged.pdf", "wb") as f: writer.write(f)
关键注意事项
- 合并前必须确保两个页面的MediaBox尺寸和Rotate属性完全一致,否则会出现错位、缩放问题
- 可通过以下代码打印页面属性,验证修改是否生效:
print(f"源页面MediaBox: {source_page.mediabox}") print(f"源页面Rotate: {source_page.Rotate}") print(f"水印页面MediaBox: {watermark_page.mediabox}") print(f"水印页面Rotate: {watermark_page.Rotate}")
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

