关于python:从SVG输入生成PDF

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 installcairoandlibffi(withHomebrewfor example)


您需要为版本0.6.3添加"导入字符串"才能与python 2.7一起使用。

您可以使用我的frok,直到pypy更新为止。

1
pip install git+git://github.com/ddehghan/libsvg.git