我在使用pyPdf合并两个PDF文件时遇到问题。当我运行以下代码时,水印(page1)看起来很好,但是page2已经顺时针旋转了90度。
任何想法发生了什么?
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()
答案 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没有正确阅读。