Hace unos días un amigo lector de mi blog pregunto esto en un post dedicado al estudio del manejo del sistema de archivos usando python:
Como no dejo su nombre ni su email, no se como contactarlo. No obstante me pareció una muy buena idea para hacer un post.
Veran hay muchas fuentes para lograr tan noble tarea y todas son muy fáciles de usar pythonland siempre tan generoso.
Pero la que yo realmente conozco porque la he usado es “Reportlab” reportlab es open source, y puede encontrarse en bitbucket (no en github) lo que parece extraño y a la vez genial. Si quieren echarle un ojo aca esta el repo
Bien como todo en la vida primero debemos instalar dicha librería en nuestro sistema y para ello hay varias opciones de hacerlo.
Con easy install:
easy_install reportlab
Con pip:
pip install reportlab
O bien pueden clonar el código fuente y luego correr el instalador:
//Sip.... mercurial (no git)
hg clone https://bitbucket.org/rptlab/reportlab
//luego para instalar
python setup.py install
Yo personalmente elegí pip, si el output es así, todo fue bien:
Luego ya manos al codigo podemos crear un archivo pdf con un string bastante simple con algunas líneas:
from reportlab.pdfgen import canvas
c = canvas.Canvas("hola_mundo.pdf")
c.drawString(100,750,"Hola mundo pdf!")
c.save()
Simple como estas 4 lineas ahora tenemos un archivo pdf en perfectas condiciones con su tamaño por default A4 el string se dibuja en la posición 100, 750 del papel eso es 100pt hacia la derecha y 750pt hacia arriba desde la esquina inferior izquierda del papel (o la hoja). Cabe mencionar que 1 pt = 1/72 pulgadas
Ahora que ya sabemos lo básico podemos crear líneas y palabras y posicionarlas a nuestro antojo en el archivo, veamos un ejemplo.
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
canvas = canvas.Canvas("form.pdf", pagesize=letter)
canvas.setLineWidth(.3)
canvas.setFont('Helvetica', 12)
canvas.drawString(30,750,'CARTA DE PRUEBA')
canvas.drawString(30,735,'RICARDOGEEK.COM')
canvas.drawString(500,750,"27/10/2016")
canvas.line(480,747,580,747)
canvas.drawString(275,725,'ESTIMADO:')
canvas.drawString(500,725,"<NOMBRE>")
canvas.line(378,723,580,723)
canvas.drawString(30,703,'ETIQUETA:')
canvas.line(120,700,580,700)
canvas.drawString(120,703,"<ASUNTO DE LA CARTA GENERICO>")
canvas.save()
Aquí dibujamos una serie de lineas y strings para que al final produzcan algo asi:
Cabe notar que configuramos un poco mas la pagina en esta sección:
canvas = canvas.Canvas("form.pdf", pagesize=letter)
canvas.setLineWidth(.3)
canvas.setFont('Helvetica', 12)
Aquí le decimos al constructor como queremos que se llame nuestro archivo, y que además utilice tamaño carta para la hoja en lugar del default A4, también que el ancho de cada línea sera de 0.3 pt y que el font sera Helvetica 12.
También cabe explicar que la función line toma como parámetros dos puntos, el punto inicial y el punto final:
canvas.line(x1, y1, x2, y2)
O bien si quieren hacer muchas líneas en una sola llamada:
canvas.lines(linelist)
aquí una lista de todas las figuras geométricas básicas que podemos formar usando funciones de la librería:
canvas.grid(xlist, ylist)
canvas.bezier(x1, y1, x2, y2, x3, y3, x4, y4)
canvas.arc(x1,y1,x2,y2)
canvas.rect(x, y, width, height, stroke=1, fill=0)
canvas.ellipse(x1,y1, x2,y2, stroke=1, fill=0)
canvas.wedge(x1,y1, x2,y2, startAng, extent, stroke=1, fill=0)
canvas.circle(x_cen, y_cen, r, stroke=1, fill=0)
canvas.roundRect(x, y, width, height, radius, stroke=1, fill=0)
Las posibilidades que nos provee reportlabs son muchas y se ven limitadas únicamente por nuestra imaginación (y paciencia). Existe una guía detallada sobre cómo usar las funciones mas avanzadas, puedes verla haciendo click aquí
Conclusion
Generar y manipular archivos en pdf usando python no es cosa del otro mundo, lo único que requiere es que tengamos mucha paciencia porque hay que ir a prueba y error poniendo los elementos en la página hasta que alcanza la forma deseada.
Espero que esto le ayude a nuestro anónimo amigo, y si tienen preguntas no se olviden de dejar comentarios.
Saludos.
Hey mate, just thought I would let you know that you’re sharing your books with the world in a certain directory on your web server. You might want to change the permissions or at least password protect it.
Buen día, mi inquietud es sobre la exportación del reporte, con esto quiero decir, normalmente el pdf se guarda en la carpeta raíz del documento, para luego poder visualizarlo, esto hace que cada cambio que se ejecuta me genere un documento, hay forma de exportar el documento no guardarlo, sino convertirlo de una forma que me permita visualizarlo sin necesidad de guardarlo primero??
Buen día, mi inquietud es sobre la exportación del reporte, con esto quiero decir, normalmente el pdf se guarda en la carpeta raíz del proyecto, para luego poder visualizarlo, esto hace que cada cambio que se ejecuta me genere un documento, hay forma de exportar el documento no guardarlo, sino convertirlo de una forma que me permita visualizarlo sin necesidad de guardarlo primero??
buen dia, hay forma de evitar que se demore tanto en generar un reporte de 70 paginas por ejemplo.. es que el tiempo que se demora actualmente es de 7 a 8 minutos… que solucion podria haber a este problema??
Muchas Gracias, me gusto y me ayudó mucho el post.
Saludos
ok es ta bueno
Muchas gracias, me ayudo su solicion
Como utilizar REPORTLAB para convertir un archivo (o reporte) HTML a PDF. La verdad es que encuentro demasiado tedioso eso del posicionamiento de objeto con esas coordenadas, se gasta mucho tiempo en eso, sobre todo si se trata de un reporte medianamente complejo