Python – Crear un PDF con ReportLab

Para crear un PDF simple con Python usaremos RerportLab, que es una de las bibliotecas más ampliamente usadas.  El código de este ejemplo es sencillo:

import time
from reportlab.lib.enums import TA_JUSTIFY
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch

doc = SimpleDocTemplate("/home/decodigo/Documentos/python/prueba.pdf", pagesize=letter,
                        rightMargin=72, leftMargin=72,
                        topMargin=72, bottomMargin=18)
Story = []
logotipo = "/home/decodigo/Documentos/python/python_logo.png"

nombreRevista = "Programación Avanzada"
numero = 4
precio = "10.00"
fechaLimite = "27/09/2017"
obsequio = "Taller de Python"

formatoFecha = time.ctime()
nombreCompleto = "José Rodriguez"
partesDeDireccion = ["Calle con número 123", "Colonia, Código Postal 12345"]

imagen = Image(logotipo, 1 * inch, 1 * inch)
Story.append(imagen)

estilos = getSampleStyleSheet()
estilos.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
texto = '%s' % formatoFecha

Story.append(Paragraph(texto, estilos["Normal"]))
Story.append(Spacer(1, 12))

# Se construye la dirección
texto = '%s' % nombreCompleto
Story.append(Paragraph(texto, estilos["Normal"]))
for part in partesDeDireccion:
  texto = '%s' % part.strip()
  Story.append(Paragraph(texto, estilos["Normal"]))

Story.append(Spacer(1, 12))
texto = 'Estimado %s:' % nombreCompleto.split()[0].strip()
Story.append(Paragraph(texto, estilos["Normal"]))
Story.append(Spacer(1, 12))

texto = 'Nos gustaría darle la bienvenida como suscriptor a nuestra revista %s ! \
        Recibirá %s números con un precio introductorio de $%s. Por favor responda antes de \
        %s para comenzar a recibir su suscripción y obtenga además su obsequio: %s.' % (nombreRevista,
                                                                                        numero,
                                                                                        precio,
                                                                                        fechaLimite,
                                                                                        obsequio)
Story.append(Paragraph(texto, estilos["Justify"]))
Story.append(Spacer(1, 12))

texto = 'Gracias y esperamos haberle servido.'
Story.append(Paragraph(texto, estilos["Justify"]))
Story.append(Spacer(1, 12))
texto = 'Sinceramente,'
Story.append(Paragraph(texto, estilos["Normal"]))
Story.append(Spacer(1, 48))
texto = 'Daniel López'
Story.append(Paragraph(texto, estilos["Normal"]))
Story.append(Spacer(1, 12))
doc.build(Story)




En este ejemplo se hacen algunas declaraciones que son importantes. Primero se declara y se crea el tipo de documento que usremos:

doc = SimpleDocTemplate("/ruta/prueba.pdf", pagesize=letter,
                        rightMargin=72, leftMargin=72,
                        topMargin=72, bottomMargin=18)

En las líneas de código anteriores especificamos el nombre de archivos PDF que vamos a crear y sus dimensiones.

Declaramos además la ruta del una imagen en formato png (un cuadrado con transparencia de 180×180 pixeles) del que más adelante definiremos posición y dimensiones dentro del documento.

logotipo = "/ruta/python_logo.png"
imagen = Image(logotipo, 1 * inch, 1 * inch)
Story.append(imagen)

También declaramos y usamos de forma dinámica al menos dos estilos para el texto. “Normal” que viene por default y uno que agregamos dinámicamente llamado “Justify”.

estilos = getSampleStyleSheet()
estilos.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))

Puedes observar que el contenido de nuestro documento se va construyendo gradualmente con la ayuda de la variable Story.

Story.append(imagen)
.
Story.append(Paragraph(texto, estilos["Normal"]))
Story.append(Spacer(1, 12))

Vamos agregando Parrafos, imágenes o simples espacios.

Finalmente usamos build para generar nuestro documento:

doc.build(Story)

Y debes obtener algo como esto:Crear un PDF con ReportLab

Desde luego, cuando copies el código no olvides cambiar la ruta del archivo PDF que se va a generar y la de la imagen, que puedes cambiar por otra de un tamaño similar pero con la misma extensión. Esperamos que este ejemplo sencillo sea de utilidad para que puedas construir documentos más elaborados.

Más información en: http://www.reportlab.com