Generowanie plików PDF z wejścia SVG

Próbuję wygenerować plik PDF z pliku wejściowego SVG z Pythonem w aplikacji Django.

Znalazłem już 2 działające rozwiązania: cairo+rsvg i imagemagick, ale oba mają jeden problem: mają jakieś dziwne zależności, których nie chcę instalować na serwerze, na przykład DBUS i GTK.

Więc proszę o inną metodę generowania PDF z SVG bez konieczności instalowania tych wszystkich głupich zależności na serwerze.

Author: Julian, 2011-04-29

3 answers

Rozważałeś svglib ?

Wygląda całkiem obiecująco, zwłaszcza, że reportlab jest featured pdf tool W dokumentach Django.

>>> from svglib.svglib import svg2rlg
>>> from reportlab.graphics import renderPDF
>>>
>>> drawing = svg2rlg("file.svg")
>>> renderPDF.drawToFile(drawing, "file.pdf")
 26
Author: arie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-12 15:37:12

Tak, sugerowałbym również użycie svglibi reportlab library do tego zadania, chociaż jest bardzo mało dokumentacji biblioteki svglib. Sugerowałbym wykonanie następujących czynności w Twoim widoku 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

W ten sposób nigdy nie musisz zapisywać pliku tymczasowego na serwerze, aby użytkownik mógł pobrać go lokalnie. Podany przykład svglib wymaga podania ścieżki do pliku... ale dlaczego po prostu nie podać samego pliku?

Mam udokumentowałem kroki, które zrobiłem używając Django i biblioteki Raphael SVG tutaj .

 14
Author: simoes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 17:14:54

Będziesz musiał dodać "import string" dla wersji 0.6.3 do pracy z Pythonem 2.7.

Możesz używać mojego frok, dopóki pypy nie zostaną zaktualizowane.

pip install git+git://github.com/ddehghan/libsvg.git
 1
Author: David Dehghan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-02 09:03:43