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

Merge two PDF files into one page with rotation and translation

我有两个 PDF,我需要将它们合并为一个,尺寸为 1 宽 x 2 高。如果您听说过帐篷卡,这是在制作帐篷卡 PDF。

我有以下脚本分别执行各个部分,但没有生成正确旋转的实际 PDF。想象一个 5"x5" 的切面,生成一个 5"x10" 的 PDF,上半部分倒置:

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

使用 PyPDF2,这似乎很容易,但是虽然我已经能够让这些部分正常工作(旋转、平移、背面高于正面、双高乘以单宽),但我无法做到让他们一起工作。

被注释掉的行是我试过的其他东西,它们似乎在页面的顶部产生了空白,"back" 应该是,"front" 正确 displaying/orienting 通常,仅在 x2 高度的底部 translated_page outfile.

#!/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

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

-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 页面宽度尺寸为中心,而不是角而不是 a/the 角。