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.
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")
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 .
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
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