使用reportlab将.SVG文件嵌入到PDF中

时间:2013-05-13 01:58:35

标签: python pdf svg matplotlib reportlab

我在python中编写了一个脚本,生成matplotlib图并使用reportlab将它们放入pdf报告中。

我很难将SVG图像文件嵌入到我的PDF文件中。我使用PNG图像没有问题,但我想使用SVG格式,因为这样可以在PDF报告中生成质量更好的图像。

这是我收到的错误消息:

IOError: cannot identify image file

有人有建议或者您之前已经克服了这个问题吗?

4 个答案:

答案 0 :(得分:5)

昨天我成功使用svglib将SVG图像添加为reportlab Flowable。

所以这个绘图是reportlab Drawing的一个实例,见这里:

from reportlab.graphics.shapes import Drawing

reportlab Drawing继承Flowable:

from reportlab.platypus import Flowable

这是一个最小的例子,它还展示了如何正确缩放它(你必须只指定路径和因子):

from svglib.svglib import svg2rlg
drawing = svg2rlg(path)
sx = sy = factor
drawing.width, drawing.height = drawing.minWidth() * sx, drawing.height * sy
drawing.scale(sx, sy)
#if you want to see the box around the image
drawing._showBoundary = True

答案 1 :(得分:1)

skidzo's answer很有帮助,但不是一个完整的示例,该示例说明了如何在SVG文件中使用SVG文件作为可流动报告。希望这对其他尝试找出最后几个步骤的人有帮助:

from io import BytesIO

import matplotlib.pyplot as plt
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph
from svglib.svglib import svg2rlg


def plot_data(data):
    # Plot the data using matplotlib.
    plt.plot(data)

    # Save the figure to SVG format in memory.
    svg_file = BytesIO()
    plt.savefig(svg_file, format='SVG')

    # Rewind the file for reading, and convert to a Drawing.
    svg_file.seek(0)
    drawing = svg2rlg(svg_file)

    # Scale the Drawing.
    scale = 0.75
    drawing.scale(scale, scale)
    drawing.width *= scale
    drawing.height *= scale

    return drawing


def main():
    styles = getSampleStyleSheet()
    pdf_path = 'sketch.pdf'
    doc = SimpleDocTemplate(pdf_path)

    data = [1, 3, 2]
    story = [Paragraph('Lorem ipsum!', styles['Normal']),
             plot_data(data),
             Paragraph('Dolores sit amet.', styles['Normal'])]

    doc.build(story)


main()

答案 2 :(得分:0)

您需要确保在代码中导入PIL(Python Imaging Library),以便ReportLab可以使用它来处理像SVG这样的图像类型。否则它只能支持一些基本的图像格式。

那就是说,我记得在使用PIL和矢量图时遇到了一些麻烦。我不知道我是否尝试过SVG,但我记得EPS有很多麻烦。

答案 3 :(得分:0)

如skidzo所述,您可以使用 svglib 包完成此操作,您可以在此处找到:https://pypi.python.org/pypi/svglib/

根据网站的说法,Svglib是一个纯Python库,用于读取SVG文件并使用ReportLab开源工具包将它们(在合理的程度上)转换为其他格式。

您可以使用 pip 安装svglib。

这是一个完整的示例脚本:

<curnode,targetnode>