我正在使用Python报告实验室 https://bitbucket.org/rptlab/reportlab/canvas 生成带有水印的覆盖文档,将其合并到源 pdf 文档中(带有PyPDF2 https://github.com/mstamy2/PyPDF2)。最近,我遇到了包含旋转页面的文档的问题(pdf 中的页面对象存在 /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
我得到了下一个结果:截屏 http://monosnap.com/image/URyr6faJRlZV6fk3KmjyCh9VxA5MIH
And for rotation_angle = 0
(根本不关心旋转)我有:截屏 http://monosnap.com/image/c2BcwCzH8vqpRfOcYiAGOnC7CmaIZE
如何更改脚本来解决这种情况?