2012-01-13 20 views
9

Estoy creando algunos SVG en lotes y necesito convertirlos en un documento PDF para imprimir. He estado tratando de usar svglib y su método svg2rlg, pero acabo de descubrir que es absolutamente espantoso preservar los gráficos vectoriales en mi documento. Apenas puede colocar el texto correctamente.Convertir SVG a PDF (svglib + reportlab no es lo suficientemente bueno)

Mi SVG generado dinámicamente está bien formado y he probado svglib en la entrada sin procesar para asegurarme de que no sea un problema que estoy presentando.

¿Cuáles son mis opciones más allá de svglib y ReportLab? Tiene que ser gratis o muy barato, ya que estamos agotados en el proyecto del que esto es parte. No podemos pagar la tarifa de 1k/año para ReportLab Plus.

Estoy usando Python, pero en este momento, estoy feliz siempre que se ejecute en nuestro servidor Ubuntu.

Editar: Probado Prince. Mejor, pero sigue ignorando la mitad del documento.

+0

Podría usar una combinación de los siguientes enfoques http://stackoverflow.com/a/6599172/1104941 y http://www.blog.pythonlibrary.org/2012/01/07/reportlab-converting-hundreds- of-images-into-pdfs/Este último usa ReportLab, pero me pregunto si puede escaparse sin la versión Plus dado que solo está generando archivos PDF. Puede ir directamente al pdf con El Cairo, pero no puedo decir con certeza de ahí el comentario en lugar de una respuesta. – sgallen

Respuesta

1

CairoSVG es el que estoy usando:

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

Lo probé ahora, pero desafortunadamente es tan débil para renderizar mis archivos SVG. – Oli

+0

¿Estás seguro de que tus archivos SVG están realmente formateados correctamente? La representación de Cairo es bastante sólida. Además, estoy usando WeasyPrint para PDF, aunque todavía está un poco incompleto, pero funciona bien a pesar de las limitaciones ... – plaes

+2

Para cualquiera aquí en 2016, esto ya no funciona. – Lucas

6

utilizo inkscape para esto. En su opinión Django gustaría hacer:

from subprocess import Popen 

x = Popen(['/usr/bin/inkscape', your_svg_input, \ 
    '--export-pdf=%s' % your_pdf_output]) 
try: 
    waitForResponse(x) 
except OSError, e: 
    return False 

def waitForResponse(x): 
    out, err = x.communicate() 
    if x.returncode < 0: 
     r = "Popen returncode: " + str(x.returncode) 
     raise OSError(r) 

Es posible que tenga que pasar como parámetros para Inkscape todos los archivos de fuentes que usted se refiere en su .svg, así que tenlo en cuenta si el texto no aparece correctamente en el. salida en pdf

1

rst2pdf usa reportlab para generar archivos PDF. Puede usar inkscape y pdfrw para leer archivos PDF.

pdfrw en sí tiene algunos ejemplos que muestran la lectura de archivos PDF y el uso de reportlab a la salida.

Abordar el comentario de Martin a continuación (puedo editar esta respuesta, pero no tienen la reputación de comentar un comentario en él ...):

reportlab no sabe nada acerca de los archivos SVG. Algunas herramientas, como svg2rlg, intentan recrear una imagen SVG en un PDF dibujándolas en el lienzo del informe. Pero puede hacerlo de otra manera con pdfrw: si puede usar otra herramienta para convertir el archivo SVG en una imagen PDF, entonces pdfrw puede tomar ese PDF convertido y agregarlo como un formulario XObject en el PDF que está generando con reportlab. En lo que se refiere a reportlab, en realidad no es diferente de colocar una imagen JPEG.

Algunas herramientas harán cosas terribles con sus archivos SVG (rastrillándolos, por ejemplo). En mi experiencia, Inkscape generalmente hace un trabajo bastante bueno y los deja en formato vectorial. Incluso puedes hacer esto sin cabeza, p. "inkscape my.svg -A my.pdf".

Todo el motivo por el que escribí pdfrw en primer lugar fue para este caso de uso exacto: poder reutilizar imágenes vectoriales en nuevos archivos PDF creados por reportlab.

+0

¿Cómo soluciona esto el problema del OP? Creo que él no * quiere * usar el informe porque falta la calidad de manejo de SVG. –

0

Sólo para hacerle saber y para el próximo número, que encontrar una solución para este problema:

# I only install svg2rlg, not svglib (svg2rlg is inside svglib as well) 
import svg2rlg 

# Import of the canvas 
from reportlab.pdfgen import canvas 

# Import of the renderer (image part) 
from reportlab.graphics import renderPDF 

rlg = svg2rlg.svg2rlg("your_img.svg") 
c = canvas.Canvas("example.pdf") 
c.setTitle("my_title_we_dont_care") 

# Generation of the first page 
# You have a last option on this function, 
# about the boundary but you can leave it as default. 
renderPDF.draw(rlg, c, 80, 740 - rlg.height) 
renderPDF.draw(rlg, c, 60, 540 - rlg.height) 
c.showPage() 

# Generation of the second page 
renderPDF.draw(rlg, c, 50, 740 - rlg.height) 
c.showPage() 

# Save 
c.save() 

disfrutar de un poco con la posición (80, 740 - h), es sólo la posición.

Si el código no funciona, puede verlo en la biblioteca de informes del render. Usted tiene una función en reportlab para crear directamente un PDF a partir de su imagen:

renderPDF.drawToFile(rlg, "example.pdf", "title") 

Puede abrirlo y leerlo. No es muy complicado. Este código proviene de esta función.

+0

svg2rlg no parece funcionar con python3 – IARI

Cuestiones relacionadas