Python PyPDF2 合并旋转页面
我正在使用Python的ReportLab库来生成带有水印的覆盖文档,并将其合并到源PDF文档中(使用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
,我得到了以下结果:截图
而对于rotation_angle = 0
(完全不考虑旋转),我得到了:截图
我该如何修改脚本来解决这个问题呢?
1 个回答
4
其实我发现了一个类似的问题和解决办法,在这里可以找到。
所以我把代码改成了下面这样:
# 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 可以解决这个问题。