【问题标题】:How to save a ReportLab Canvas as PNG image?如何将 ReportLab 画布保存为 PNG 图像?
【发布时间】:2019-10-30 10:35:51
【问题描述】:

我正在使用reportlab 绘制通常用于打印的PDF。如何在不使用其他二进制工具转换生成的 pdf 的情况下将画布保存为 PNG 图像?

我认为我需要将其转换为 reportlab 绘图,但没有看到这样做的方法。

from reportlab.pdfgen import canvas
c = canvas.Canvas("form.pdf", pagesize=(100, 50))
c.drawString(20, 20, 'Example …')
c.save()  # but as image

【问题讨论】:

    标签: python canvas reportlab


    【解决方案1】:

    从'reportlab-userguide'中找到一段代码,不知道有用吗?

    from reportlab.graphics import renderPM
    d = Drawing(400, 200)
    d.add(Rect(50, 50, 300, 100, fillColor=colors.yellow))
    d.add(String(150, 100, 'Hello World', fontSize=18, fillColor=colors.red))
    d.add(String(180, 86, 'Special characters \
    \xc2\xa2\xc2\xa9\xc2\xae\xc2\xa3\xce\xb1\xce\xb2',
                 fillColor=colors.red))
    renderPM.drawToFile(d, 'example1.png', 'PNG')
    

    【讨论】:

    • 如果您不确定,那您为什么要发布它作为答案?
    • 因为这是一种从reportlab sava PNG的方法,它也可以像提交者想要的那样做同样的事情。
    • 感谢您的努力,但不幸的是,这是保存绘图的方法(在您引用的代码的第 2 行创建的内容)。我需要这个画布。
    【解决方案2】:

    似乎reportlab 包中没有将Canvas 对象转换为PNG 图像的函数。但是您可以使用其他包(例如pdf2image)将Canvas 转换为PNG 图像。

    安装

    要使用pdf2image 包,您应该安装poppler 和pdf2image 包。您可以找到安装说明here(“如何安装”部分)

    安装后,您可以使用这种方法解决您的问题:

    from reportlab.pdfgen import canvas
    from pdf2image import convert_from_bytes
    
    c = canvas.Canvas("form.pdf", pagesize=(100, 50))
    c.drawString(20, 20, 'Example …')
    image = convert_from_bytes(c.getpdfdata())[0]
    image.save('form.png')
    

    【讨论】:

    • 感谢您的提议,但 pdf2image(更好的说法是 poppler)是一个巨大的二进制依赖项。不幸的是,到目前为止,我无法控制我的应用程序运行的环境。我会尝试在问题中更清楚地说明这一点。
    【解决方案3】:

    我发现Yan Weitao's answer 中的建议很有帮助。这是您问题中示例的等价物:

    from reportlab.graphics.renderPM import drawToFile
    from reportlab.graphics.shapes import Drawing, String
    
    drawing = Drawing(width=100, height=50)
    drawing.contents.append(String(20, 20, 'Example …'))
    drawToFile(drawing, 'example.png')
    

    在深入了解drawToFile() 函数之后,我认为您也许可以使用reportlab.graphics.renderPM.PMCanvas 类而不是标准画布。它有一个saveToFile() 方法,但我的第一次尝试只是生成了一个空白图像,所以你必须做一些实验。

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 2019-10-19
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2015-02-12
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多