我使用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
如何更改脚本以修复此案例?
答案 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可以解决问题。