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:

screen-shot-2016-10-27-at-4-15-30-pm

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:

screen-shot-2016-10-27-at-4-34-21-pm

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

screen-shot-2016-10-27-at-4-38-04-pm

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:

screen-shot-2016-10-27-at-4-56-07-pm

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.

Categorized in:

Tagged in:

, ,