我在python中编写了一个脚本,生成matplotlib图并使用reportlab
将它们放入pdf报告中。
我很难将SVG图像文件嵌入到我的PDF文件中。我使用PNG图像没有问题,但我想使用SVG格式,因为这样可以在PDF报告中生成质量更好的图像。
这是我收到的错误消息:
IOError: cannot identify image file
有人有建议或者您之前已经克服了这个问题吗?
答案 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>