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

使用PyPDF2旋转平移PDF制作打印手册的坐标参数问题

问题:A5转A4跨页手册的排版修正

我需要编写Python函数,将排版好的A5 PDF制作成可打印的A4手册:生成A4跨页,从A5 PDF中选取指定两页,经旋转和平移后并排摆放。

现有代码如下:

import os
os.chdir('D:\\')

from PyPDF2 import PdfFileReader, PdfFileWriter, PageObject

reader = PdfFileReader(open('My_A5_document.pdf','rb'))

# Size of an A4
new_page = PageObject.createBlankPage(None, 595, 841)

new_page.mergeRotatedTranslatedPage(reader.getPage(1), 90, 0, 0, False)
new_page.mergeRotatedTranslatedPage(reader.getPage(2), 90, 0, 0, False)

writer = PdfFileWriter()
writer.addPage(new_page)

with open('out.pdf', 'wb') as f:
    writer.write(f)

但mergeRotatedTranslatedPage表现不符合预期:无平移时页面位于A4左下侧甚至超出页面。不清楚该方法是先平移后旋转还是先旋转后平移,也不知道旋转中心,需要确定参数a和b的值。


解决方案

核心逻辑说明

mergeRotatedTranslatedPage的执行顺序是:先以被合并页面的左下角为原点旋转指定角度,再将旋转后的页面整体平移(tx, ty)。PDF坐标规则为:原点在页面左下角,X轴向右,Y轴向上。

标准A5页面尺寸为420pt(宽)×595pt(高),A4为595pt(宽)×841pt(高)。顺时针旋转90度后,A5页面的有效区域会偏移到原点下方(Y负方向),因此必须通过平移将其拉回A4页面内。

修正后的代码(纵向A4上下布局)

import os
os.chdir('D:\\')

from PyPDF2 import PdfFileReader, PdfFileWriter, PageObject

reader = PdfFileReader(open('My_A5_document.pdf','rb'))

# 标准纵向A4:宽595pt,高841pt
new_page = PageObject.createBlankPage(None, 595, 841)

# 第一个A5页面:旋转90度后向上平移420pt,填满A4下半部分
new_page.mergeRotatedTranslatedPage(reader.getPage(0), 90, 0, 420, False)
# 第二个A5页面:旋转90度后向上平移841pt,填满A4上半部分
new_page.mergeRotatedTranslatedPage(reader.getPage(1), 90, 0, 841, False)

writer = PdfFileWriter()
writer.addPage(new_page)

with open('out.pdf', 'wb') as f:
    writer.write(f)

关键参数解释

  • 第一个页面的平移参数(0, 420):抵消旋转导致的Y方向负偏移,让页面左下角对齐A4左下角,刚好填满A4下半区域(Y从0到420)。
  • 第二个页面的平移参数(0, 841):420pt抵消旋转偏移,额外421pt让页面位于第一个页面上方,刚好填满A4上半区域(Y从421到841)。

补充说明

PyPDF2的页面索引从0开始,若要选取原A5文档的第1、2页,需用reader.getPage(0)和reader.getPage(1),避免页面顺序错误。

如果需要横向A4的左右并排布局,可创建尺寸为841pt×595pt的横向A4页面,将A5页面旋转270度后分别平移:

new_page = PageObject.createBlankPage(None, 841, 595)
# 左侧页面
new_page.mergeRotatedTranslatedPage(reader.getPage(0), 270, 0, 0, False)
# 右侧页面(加1pt空隙)
new_page.mergeRotatedTranslatedPage(reader.getPage(1), 270, 421, 0, False)

内容的提问来源于stack exchange,提问作者Kosio Varbenov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:30:14