使用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
相关产品推荐
相关产品推荐

