Подтвердить что ты не робот

Создание PDF файлов из ввода SVG

Я пытаюсь создать PDF из входного файла SVG с Python в приложении Django.

Я уже нашел 2 рабочих решения: cairo + rsvg и imagemagick, но у них есть одна проблема: у них есть некоторые странные зависимости, которые я не хочу устанавливать на сервере, например DBUS и GTK.

Итак, я прошу другого метода для создания PDF файла из SVG без необходимости устанавливать все эти глупые зависимости на сервере.

4b9b3361

Ответ 1

Вы считали svglib?

Это выглядит довольно многообещающим, особенно, поскольку reportlab является признанным инструментом pdf в документах Django.

>>> from svglib.svglib import svg2rlg
>>> from reportlab.graphics import renderPDF
>>>
>>> drawing = svg2rlg("file.svg")
>>> renderPDF.drawToFile(drawing, "file.pdf")

Ответ 2

Да, я бы также предложил использовать svglib и reportlab библиотеки для этой задачи, хотя документации по svglib очень мало. Я бы предпочел сделать следующее в вашем представлении Django:

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 и библиотеку SVG Raphael здесь.

Ответ 3

Вам нужно будет добавить строку импорта для версии 0.6.3 для работы с python 2.7.

вы можете использовать мой frok до тех пор, пока pypy не будет обновлен.

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

Ответ 4

Мой ответ может помочь кому-то на macOS:

Я пользователь CairoSVG

Во-первых, установите его с помощью:

pip install cairosvg

Тогда вы можете использовать его в Python:

>>> import cairosvg
>>> cairosvg.svg2pdf(url='image.svg', write_to='image.pdf')

из его документации:

на macOS вам нужно установить cairo и libffi (например, с Homebrew)