如何使用pyPdf合并两个横向pdf页面

时间:2011-05-18 07:26:11

标签: python pdf-generation landscape pypdf

我在使用pyPdf合并两个PDF文件时遇到问题。当我运行以下代码时,水印(page1)看起来很好,但是page2已经顺时针旋转了90度。

任何想法发生了什么?

Example of what's going wrong

from pyPdf import PdfFileWriter, PdfFileReader

# PDF1: A4 Landscape page created in photoshop using PdfCreator, 
input1 = PdfFileReader(file("base.pdf", "rb"))
page1 = input1.getPage(0)

# PDF2: A4 Landscape page, text only, created using Pisa (www.xhtml2pdf.com)
input2 = PdfFileReader(file("text.pdf", "rb"))
page2 = input2.getPage(0)

# Merge
page1.mergePage(page2)

# Output
output = PdfFileWriter()
output.addPage(page1)
outputStream = file("output.pdf", "wb")
output.write(outputStream)
outputStream.close()

5 个答案:

答案 0 :(得分:5)

您可以在将页面合并到另一个页面时对其进行转换。我定义了这个函数,在合并时围绕一个点旋转页面:

def mergeRotateAroundPointPage(page, page2, rotation, tx, ty):
    translation = [[1, 0, 0],
                   [0, 1, 0],
                   [-tx,-ty,1]]
    rotation = math.radians(rotation)
    rotating = [[math.cos(rotation), math.sin(rotation),0],
                [-math.sin(rotation),math.cos(rotation), 0],
                [0,                  0,                  1]]
    rtranslation = [[1, 0, 0],
                   [0, 1, 0],
                   [tx,ty,1]]
    ctm = utils.matrixMultiply(translation, rotating)
    ctm = utils.matrixMultiply(ctm, rtranslation)

    return page.mergeTransformedPage(page2, [ctm[0][0], ctm[0][1],
                                             ctm[1][0], ctm[1][1],
                                             ctm[2][0], ctm[2][1]])

然后你这样称呼它:

mergeRotateAroundPointPage(page1, page2, 
                page1.get('/Rotate') or 0, 
                page2.mediaBox.getWidth()/2, page2.mediaBox.getWidth()/2)

答案 1 :(得分:2)

我找到了解决方案。我的代码很好 - 我只需要改变我生成原始PDF文件的方式。

而不是使用PdfCreator&创建PDF。 Photoshop,我将我的photoshop图像复制并粘贴到MS Word 2007中,然后使用它的导出功能为page1创建PDF文件。它现在很棒!

因此,PdfCreator必须生成与pyPdf不兼容的PDF文件。

答案 2 :(得分:0)

您可以在页面对象中使用rotateClockwise或rotataeCounterClockwise函数。

page2 = input2.getPage(0).rotateCounterClockwise(90)

答案 3 :(得分:0)

由于你正在使用pyPdf,这应该可以解决旋转页面的问题:

output.addPage(input1.getPage(1).rotateClockwise(90))

答案 4 :(得分:0)

我想补充一点,我使用Photoshop保存PDF,但版本1.4兼容。这制作了一个巨大的PDF文件,但它确实有效。

所以pyPDF没有正确阅读。