Formularios PDF

Post image

Reportlab

Reportlab te permite crear documentos PDF desde Python. De código abierto, constituye una amplia librería con infinidad de utilidades.

Instalación

pip install reportlab

Repositorio

https://hg.reportlab.com/hg-public/

API

Permite generar documentos PDF directamente desde Python. Dispone de un lenguaje de plantillas llamado RML

Documentación: https://www.reportlab.com/dev/docs/

Hola Mundo!

from reportlab.pdfgen import canvas
c = canvas.Canvas("hola-mundo.pdf")
c.drawString(50, 50, "¡Hola, mundo!")

c.save()

Esto da como resultado un pdf con el texto de “¡Hola Mundo!” en la parte inferior izquierda de la página.

El origen de coordenadas (0,0) se encuentra en el extremo inferior izquierdo.

Algunos datos

El ancho y alto de la página, por defecto, son las correspondientes a un A4.

  • Las dimensiones están expresadas en puntos.
    • Un A4 tiene:
      • Widht: 595.2 ptos
      • Height: 841.8 ptos

Se puede establecer, al crear la instancia del canvas, la dimensión de cada una de las hojas, mediante el parámetro pagesize, que es una tupla (width, height).

Líneas y figuras geométricas

# línea
c.line(x1, y1, x2, y2)

# rectángulo
c.rectangle(x, y, width, height)

# rectángulo con esquinas redondeadas
c.roundRect(x, y, width, height,radio)

# círculo
c.circle(x,y,radio)

# elipse
c.ellipse(x1, y1, x2, y2)

Estilos

#  RGB entre 0.0 y 1.0.
c.setFillColorRGB(1, 0, 0)
c.drawString(x, y, "Texto en rojo")
c.rect(x1, y1, x2, y2, fill=True)
# color del borde
c.setStrokeColorRGB(0.7, 0, 0.7)

Textos

El método _drawString() está bien para dibujar alguna palabra, pero si se trata de textos más extensos no sirve, puesto que no acepta saltos de línea. Para estos casos se utiliza drawText()

# En primer lugar: crear objeto y posicionarlo:
t = c.beginText(200,200)

# Estilos, si procede:
text.setFont("Courier", 10)

# con el método textLine añadimos líneas de texto al objeto
t.textLine = ("Línea 1")
t.textLine = ("Línea 2")

#  o así:
t.textLines("Línea1\nLínea 2\nLínea3")

# para dibujar:
c.drawText(t)

Imágenes

# png, jpg, gif
c.drawImage("imagen.jpg", x, y)

# establecer ancho y alto
c.drawImage("imagen.jpg", x, y, width=50, height=50)
# Ejemplo que posiciona una imagen en la esquina superior izquierda:
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.utils import ImageReader

c = canvas.Canvas("posicionar-imagen.pdf", pagesize=A4)
w, h = A4

# Ancho y alto de la imagen.
img = ImageReader("imagen.jpg")
img_w, img_h = img.getSize()

# h - img_h es el alto de la hoja menos el alto de la imagen.
c.drawImage(img, 0, h - img_h)
c.save()

Tablas

xlist = [10, 60, 110, 160]
ylist = [h - 10, h - 60, h - 110, h - 160]
c.grid(xlist, ylist)

Formularios PDF interactivos con Python

Con el kit de herramientas de ReportLab se pueden realizar formularios interactivos y rellenables.

Checkbox


from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4

w, h = A4
x = 0
y = 0

def createCheckBox():
   x = w/2
   y = h - 20
   c = canvas.Canvas("checkbox.pdf")
   c.setFont("Courier", 12)

   c.drawCentredString(x, y,"CHECKBOXES CON PYTHON")

   y -= 20
   x = 10

   c.setFont("Courier", 9)
   form = c.acroForm

   c.drawString(x, y, "Lbl circle")
   form.checkbox(
       name='cb1',
       tooltip='Checkbox 1',
       x = x + 60,
       y = y - 5,
       size= 15,
       borderWidth=1,
       forceBorder=True,
       buttonStyle='circle'
   )
   c.save()

if __name__ == "__main__":
   createCheckBox()

También te puede interesar: