通过旋转和平移将两个PDF文件合并到一个页面中

2024-05-16 02:38:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个PDF,我需要合并成一个,1宽2高的尺寸。如果你听说过一个帐篷卡,这是生产一个帐篷卡PDF

我有下面的脚本,它分别处理不同的部分,但不生成具有正确旋转的实际PDF。想象一个5“x5”的平面,生成一个5“x10”的PDF,上半部分倒置:

-  -  -  -  -
|           |
|           |
|           |   < Upside-down "back"
|           |
|           |
-  -  -  -  -   < Imaginary line
|           |
|           |
|           |   < Right-side up "front
|           |
|           |
-  -  -  - -

使用PyPDF2似乎很容易,但尽管我已经能够让这些部件工作(旋转、平移、前上方、单宽双高),但我无法让它们一起工作

注释掉的行是我尝试过的其他东西,它似乎会在页面顶部产生一个空白部分,其中“back”应该在那里,“front”正常显示/定向,仅在x2 heighttranslated_pageoutfile的底部

#!/usr/bin/python3

import PyPDF2

from PyPDF2.pdf import PageObject

front_reader = PyPDF2.PdfFileReader(open('front.pdf', 'rb'))
front = front_reader.getPage(0)

back_reader = PyPDF2.PdfFileReader(open('back.pdf', 'rb'))
back = back_reader.getPage(0)

tent_height = front.mediaBox.getHeight() + back.mediaBox.getHeight()

translated_page = PageObject.createBlankPage(None, back.mediaBox.getWidth(), tent_height)
# translated_page.mergeScaledTranslatedPage(back, 1, 0, front.mediaBox.getHeight())
# translated_page.mergeRotatedTranslatedPage(back, 180, 0, 0)
translated_page.mergeRotatedPage(back, 180)
translated_page.mergePage(front)

writer = PyPDF2.PdfFileWriter()
writer.addPage(translated_page)

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

这是上面提到的文件。我错过了什么

http://jf.dialogs.com/pdf-rotate-pypdf2.zip


Tags: importpdfpagebackopenreaderwriterfront
1条回答
网友
1楼 · 发布于 2024-05-16 02:38:48

解决方案涉及我正在应用的转换矩阵;基本上,我是把它从0, 0原点翻译过来的,它将它向下旋转到底部的左象限,而mediabox占据了顶部的右象限:

-x,  y | x,  y
       -
-x, -y | x, -y

下面的步骤解决了这个问题

#!/usr/bin/python3

import PyPDF2

from PyPDF2.pdf import PageObject

front_reader = PyPDF2.PdfFileReader(open('front2.pdf', 'rb'))
front = front_reader.getPage(0)

back_reader = PyPDF2.PdfFileReader(open('back2.pdf', 'rb'))
back = back_reader.getPage(0)

tent_width = front.mediaBox.getWidth()
tent_height = front.mediaBox.getHeight() + back.mediaBox.getHeight()
tent_rotate_offset = front.mediaBox.getHeight()

translated_page = PageObject.createBlankPage(None, tent_width, tent_height)
translated_page.mergeRotatedTranslatedPage(back, 180, tent_width / 2, tent_rotate_offset)
translated_page.mergePage(front)

writer = PyPDF2.PdfFileWriter()
writer.addPage(translated_page)

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

我不知道为什么它只有一半宽。这将使x原点位于4.25”的变换之前,这表明旋转本身以front页面宽度维度为中心,而不是角点,而不是角点

相关问题 更多 >