使用reportlab合并PDF页面时出现90度旋转问题求助
问题分析与解决方案
首先要说明:你代码里用的是PyPDF2库(不是你提到的reportlab),出现旋转问题的核心原因有两个可能,对应两种不同的需求场景:
场景1:你想生成包含两个独立页面的PDF(合并为多页文件)
你的代码错误使用了mergePage方法——这个方法是将一个页面叠加到另一个页面上(类似水印效果),而非添加新的独立页面。这是导致页面异常的首要原因。
修正代码
from PyPDF2 import PdfFileReader, PdfFileWriter # 读取源PDF base_pdf = PdfFileReader(open("base.pdf", "rb")) hello_pdf = PdfFileReader(open("hello.pdf", "rb")) new_pdf = PdfFileWriter() # 分别添加两个独立页面 new_pdf.addPage(base_pdf.getPage(0)) new_pdf.addPage(hello_pdf.getPage(0)) # 写入输出文件 with open("merged.pdf", "wb") as outputStream: new_pdf.write(outputStream)
如果此时仍有页面旋转,说明某个页面的PDF元数据中/Rotate属性不为0(视觉上是横向,但内部标记了旋转角度),需要先重置旋转:
from PyPDF2 import PdfFileReader, PdfFileWriter def normalize_page_rotation(page): # 获取页面内置旋转角度,默认0 rotate_angle = page.get('/Rotate', 0) if rotate_angle != 0: # 反向旋转抵消原有标记 page.rotateClockwise(-rotate_angle) return page base_pdf = PdfFileReader(open("base.pdf", "rb")) hello_pdf = PdfFileReader(open("hello.pdf", "rb")) new_pdf = PdfFileWriter() new_pdf.addPage(normalize_page_rotation(base_pdf.getPage(0))) new_pdf.addPage(normalize_page_rotation(hello_pdf.getPage(0))) with open("merged.pdf", "wb") as outputStream: new_pdf.write(outputStream)
场景2:你想将两个页面内容叠加到同一页(合并内容到单页)
此时mergePage的问题在于:源页面的/Rotate属性会被继承,即使视觉上尺寸方向一致,内部旋转标记会导致叠加时坐标错位、显示旋转。需要先统一两个页面的旋转状态,确保坐标对齐。
修正代码
from PyPDF2 import PdfFileReader, PdfFileWriter def normalize_page_rotation(page): rotate_angle = page.get('/Rotate', 0) if rotate_angle != 0: page.rotateClockwise(-rotate_angle) return page base_pdf = PdfFileReader(open("base.pdf", "rb")) hello_pdf = PdfFileReader(open("hello.pdf", "rb")) new_pdf = PdfFileWriter() # 先标准化两个页面的旋转状态 base_page = normalize_page_rotation(base_pdf.getPage(0)) hello_page = normalize_page_rotation(hello_pdf.getPage(0)) # 确保页面尺寸一致(可选,但能避免叠加错位) assert base_page.mediaBox == hello_page.mediaBox, "两个源页面尺寸不一致" # 执行页面叠加 base_page.mergePage(hello_page) new_pdf.addPage(base_page) with open("merged.pdf", "wb") as outputStream: new_pdf.write(outputStream)
内容的提问来源于stack exchange,提问作者Benjamin Shi
相关产品推荐
相关产品推荐

