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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:35:40