Python PyPDF2合并了旋转页面

时间:2014-05-13 12:48:33

标签: python pdf pdf-generation reportlab pypdf

我使用python ReportLab画布生成带水印的叠加文档,将其合并到源pdf文档中(使用PyPDF2)。最近我遇到了一个包含旋转页面的文档的问题(/ pdf中的Page对象存在Rotate键)。该文档在设备和打印机上看起来不错。但结果(合并)文档包含针对源文档轮换的水印。

因此,源页面在pdf中具有下一个结构:

6 0 obj
<</Length 45>>
stream
q
1 0 0 1 2 4 cm
799 0 0 603 0 0 cm
/x5 Do
Q

endstream
endobj
7 0 obj
<</Type/Page/Parent 1 0 R
/Resources << /XObject << /x5 5 0 R >> >>
/MediaBox [0 0 792 612]
/Rotate 270/Contents 6 0 R
>>
endobj

正如您所看到的页面旋转了270度。

我使用类似的脚本来生成和合并水印和源页面:

from six import BytesIO
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen.canvas import Canvas

# Set page rotation
rotation_angle = 270
# Render watermark layer
stream = BytesIO()
c = Canvas(stream, pagesize=A4)
if rotation_angle:
    c.setPageRotation(rotation_angle)
c.drawString(1 * inch, 8 * inch, "Hello World! " * 3)
c.showPage()
c.save()

stream.seek(0)
overlay = PdfFileReader(stream)
source = PdfFileReader(u'test.pdf')
writer = PdfFileWriter()

# Merge sorce and watermark pages
page0 = source.getPage(0)
if rotaion_angle:
    page0.mergeRotatedPage(overlay.getPage(0), rotation_angle, True)
else:
    page0.mergePage(overlay.getPage(0))
writer.insertPage(page0, 0)

# Write result to file
with open('merged.pdf', 'wb') as fp:
    writer.write(fp)
print "Done!"

这种rotation_angle = 270的方式我得到了下一个结果:screenshot

对于rotation_angle = 0(根本不关心轮换),我得到了:screenshot

如何更改脚本以修复此案例?

1 个答案:

答案 0 :(得分:1)

实际上我发现了类似的问题和解决方案here

所以我在下一步改变了代码

# Merge source and watermark pages
page0 = source.getPage(0)
over0 = overlay.getPage(0)
if rotaion_angle:
    page0.mergeRotatedAroundPointPage(
        over0,
        rotaion_angle,
        over0.mediaBox.getWidth() / 2,
        over0.mediaBox.getWidth() / 2)

    #page0.mergeRotatedPage(overlay.getPage(0), rotaion_angle, True)
else:
    page0.mergePage(over0)

方法mergeRotatedAroundPointPage可以解决问题。