You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Reportlab canvas.DrawImage无法调整图片大小问题求助

我希望在canvas中添加一个logo,使其在报表的每一页重复显示,但问题是该PNG图片尺寸过大。我尝试在canvas.DrawImage命令内调整其大小,但每次图片都以原始尺寸显示。

以下是我尝试的代码,但没有效果:

def on_page(canvas, doc, pagesize=A4):
    page_num = canvas.getPageNumber()
    image = Image('/opt/rspro/home/e8409/projects/CRAMM logo.png')
    image._restrictSize(1 * inch, 2 * inch)
    canvas.drawImage(image, 0,0)
    canvas.showPage()

from reportlab.platypus import PageTemplate

portrait_template = PageTemplate(
  id='portrait', 
  frames=portrait_frame,
  onPage=on_page, 
  pagesize=A4)


from reportlab.platypus import BaseDocTemplate

doc = BaseDocTemplate(
  'report.pdf',
  pageTemplates=[
    portrait_template
  ]
)

希望能得到帮助——我不想编写大量独立于reportlab命令的代码来调整图片大小。


解决方案

问题出在你使用了_restrictSize这个私有方法,它不会直接作用于图片的绘制尺寸。ReportLab的canvas.drawImage本身就支持直接指定目标宽度和高度,无需额外调用其他方法。

修改你的on_page函数,直接在drawImage中传入widthheight参数即可实现缩放:

def on_page(canvas, doc, pagesize=A4):
    page_num = canvas.getPageNumber()
    # 直接指定缩放后的宽高
    canvas.drawImage('/opt/rspro/home/e8409/projects/CRAMM logo.png', 0, 0, width=1*inch, height=2*inch)
    canvas.showPage()

如果需要保持图片的宽高比,可以只传入其中一个维度,ReportLab会自动计算对应的另一个维度:

# 保持宽高比,仅设置宽度
canvas.drawImage('/opt/rspro/home/e8409/projects/CRAMM logo.png', 0, 0, width=1*inch)

另外需要注意,_restrictSize是ReportLab内部的私有方法,不建议在业务代码中使用,后续版本可能会发生变更。


内容的提问来源于stack exchange,提问作者vashts85

火山引擎 最新活动