2011-04-29 17 views
21

Estoy tratando de generar un PDF desde un archivo de entrada SVG con Python en una aplicación Django.Generando archivos PDF desde la entrada SVG

Ya he encontrado 2 soluciones de trabajo: cairo + rsvg y imagemagick pero ambas tienen un problema: tienen algunas dependencias extrañas que no quiero instalar en un servidor, por ejemplo, DBUS y GTK.

Así que estoy pidiendo otro método para generar un PDF desde SVG sin tener que instalar todas estas dependencias estúpidas en un servidor.

+0

Esto es EXACTAMENTE mi problema, pero tengo otra limitación: ser compatible con Unicode (para textos no ingleses dentro de svg). – saeedgnu

Respuesta

25

¿Has considerado svglib?

Parece bastante prometedor, especialmente porque reportlab es el featured pdf tool en los documentos de Django.

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

Gracias por la respuesta. ¡No lo había sabido hasta ahora y funciona genial! – Julian

+0

agradable. me alegro de poder ayudar :-) – arie

+1

hmmm, esta biblioteca es buena, pero parece que tiene problemas con el texto no ascii (unicode)! Todavía estoy buscando una biblioteca compatible con Unicode ... – saeedgnu

13

Sí, me gustaría también sugieren el uso de svglib y la reportlab library para esta tarea, aunque hay muy poca documentación de la biblioteca svglib. De hecho, me sugeriría hacer lo siguiente en su vista de 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 

De esta manera no será necesario guardar un archivo temporal en el servidor para que el usuario sólo tiene que descargar localmente de todos modos. El ejemplo de svglib que se proporciona requiere proporcionar una ruta a un archivo ... pero ¿por qué no solo proporciona el archivo en sí?

He documentado los pasos que he tomado usando Django y la biblioteca SVG de Raphael here.

+0

El objeto HttpResponse es un objeto similar a un archivo para que pueda escribir directamente el PDF en él. – Julian

+1

+1 respuesta detallada –

+0

Parece que el enlace está roto. Va a una página predeterminada. – mehmet

1

Deberá agregar "cadena de importación" para la versión 0.6.3 para trabajar con python 2.7.

puedes usar mi vestido hasta que pypy se actualice.