【问题标题】:Merge two PDF files into one page with rotation and translation通过旋转和平移将两个 PDF 文件合并为一页
【发布时间】:2020-04-10 14:39:27
【问题描述】:

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

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

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

使用 PyPDF2,这似乎很容易,但是虽然我已经能够让这些部分正常工作(旋转、平移、回到前面、双倍高度乘单倍宽度),但我无法得到它们大家一起努力。

注释掉的行是我尝试过的其他东西,它似乎会在页面的顶部产生一个空白的“后部”应该是的部分,“前部”正确显示/定向正常,仅在底部x2 高度 translated_page 输出文件。

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

【问题讨论】:

    标签: python python-3.x pdf pypdf2


    【解决方案1】:

    解决方案涉及我正在应用的转换矩阵;基本上,我是从 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 页面宽度尺寸为中心,而不是角而不是角。

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2011-01-31
      • 2013-06-13
      • 2014-11-16
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多