Generating PDFs from SVG input
我正在尝试在Django应用程序中使用Python从SVG输入文件生成PDF。
我已经找到2个有效的解决方案:cairo + rsvg和imagemagick,但是它们都有一个问题:它们具有一些我不想安装在服务器上的奇怪的依赖项,例如DBUS和GTK。
因此,我正在寻求另一种从SVG生成PDF的方法,而不必在服务器上安装所有这些愚蠢的依赖项。
您考虑过svglib吗?
看起来很有希望,特别是因为reportlab是Django文档中的精选pdf工具。
1 2 3 4 5 | from svglib.svglib import svg2rlg from reportlab.graphics import renderPDF drawing = svg2rlg("file.svg") renderPDF.drawToFile(drawing,"file.pdf") |
是的,我也建议使用svglib和reportlab库来完成此任务,尽管关于svglib库的文档很少。我实际上建议在Django视图中执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | from svglib.svglib import SvgRenderer from reportlab.graphics import renderPDF import xml.dom.minidom @csrf_exempt def export_svg(request): # Get data from client side via POST variables svg = request.POST.get("svg") doc = xml.dom.minidom.parseString(svg.encode("utf-8" )) svg = doc.documentElement # Create new instance of SvgRenderer class svgRenderer = SvgRenderer() svgRenderer.render(svg) drawing = svgRenderer.finish() # Instead of outputting to a file, we simple return # the data and let the user download to their machine pdf = renderPDF.drawToString(drawing) response = HttpResponse(mimetype='application/pdf') response.write(pdf) # If one were to remove the 'attachment; ' from this line # it would simple invoke the browsers default PDF plugin response["Content-Disposition"]="attachment; filename=converted.pdf" return response |
这样,您永远不需要在服务器上保存临时文件,用户就可以直接在本地下载。给出的svglib示例需要提供文件的路径...但是为什么不仅仅提供文件本身呢?
我在这里记录了使用Django和Raphael SVG库所采取的步骤。
我的答案可能会帮助macOS上的某人:
我使用CairoSVG
首先,使用以下命令安装它:
1 | pip install cairosvg |
然后,您可以在Python中使用它:
1 2 | >>> import cairosvg >>> cairosvg.svg2pdf(url='image.svg', write_to='image.pdf') |
从其文档中:
on macOS, you’ll have to install
cairo andlibffi (withHomebrewfor example)
您需要为版本0.6.3添加"导入字符串"才能与python 2.7一起使用。
您可以使用我的frok,直到pypy更新为止。
1 | pip install git+git://github.com/ddehghan/libsvg.git |