1. Fundamentos del uso de ReportLab
Trabajando con Canvas
La herramienta principal para generar documentos PDF en ReportLab es la clase canvas. Proporciona métodos para añadir texto, líneas, rectángulos y otros elementos gráficos.
Creación de un archivo PDF simple con texto
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Creamos un nuevo archivo PDF
pdf_file = canvas.Canvas("basic_report.pdf", pagesize=A4)
width, height = A4
# Añadimos texto
pdf_file.setFont("Helvetica", 12) # Establecemos la fuente y tamaño
pdf_file.drawString(100, height - 100, "¡Hola! Este es un informe creado con ReportLab.")
# Guardamos y cerramos el PDF
pdf_file.save()
En este ejemplo se crea un archivo PDF simple con el texto "¡Hola! Este es un informe creado con ReportLab." en la primera página.
2. Añadiendo texto al PDF
ReportLab permite configurar fácilmente el texto, incluyendo tamaño, fuente y color. Esto es importante para crear informes estructurados, ya que los headers, subheaders y el texto principal pueden tener diferentes aspectos.
Configuración de la fuente y tamaño del texto
Usa el método setFont() para establecer la fuente y tamaño del texto. ReportLab soporta fuentes estándar como Helvetica, Times-Roman y Courier.
pdf_file.setFont("Helvetica-Bold", 16) # Fuente en negrita
pdf_file.drawString(100, height - 50, "Informe de ventas") # Header
Cambiando el color del texto
ReportLab permite establecer el color del texto con el método setFillColorRGB(), el cual acepta valores RGB de 0 a 1.
pdf_file.setFillColorRGB(0, 0, 1) # Color azul
pdf_file.drawString(100, height - 150, "Este texto es azul.")
3. Trabajando con bloques de texto y texto multilínea
Si el texto es largo, puedes formatearlo como un bloque usando drawString() y especificando las coordenadas para cada línea. Sin embargo, para un ajuste automático del texto es más conveniente usar drawText() y TextObject.
Añadiendo texto multilínea con TextObject
text = """
Informe de ventas del año 2023.
Este informe contiene información detallada sobre las ventas, análisis de datos y proyecciones.
"""
# Creación del objeto de texto
text_object = pdf_file.beginText(100, height - 200)
text_object.setFont("Helvetica", 12)
text_object.setFillColorRGB(0, 0, 0)
# Añadiendo texto
for line in text.split("\n"):
text_object.textLine(line)
pdf_file.drawText(text_object)
En este ejemplo se crea un objeto de texto TextObject que ajusta automáticamente cada línea de texto.
4. Creando informes de varias páginas
Los informes con varias páginas permiten incluir más datos y crear una estructura del documento más fácil de leer. En ReportLab, para pasar a una nueva página se usa el método showPage().
Creando un archivo PDF de varias páginas
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Creamos PDF
pdf_file = canvas.Canvas("multi_page_report.pdf", pagesize=A4)
width, height = A4
# Página 1
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Página 1: Introducción")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Esta es la primera página del informe.")
pdf_file.showPage() # Pasar a nueva página
# Página 2
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Página 2: Datos")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Esta es la segunda página del informe.")
# Guardar y cerrar el PDF
pdf_file.save()
En este ejemplo se crea un PDF con dos páginas, cada una con su propia cabecera y texto. El método showPage() finaliza la página actual y comienza una nueva.
5. Añadiendo datos dinámicos al PDF
Para automatizar informes, ReportLab permite añadir datos dinámicos, por ejemplo, desde una lista o un diccionario. Esto es útil para crear informes con tablas o listas de datos que pueden actualizarse regularmente.
Añadiendo datos desde una lista
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
data = [
{"Mes": "Enero", "Ventas": 200},
{"Mes": "Febrero", "Ventas": 300},
{"Mes": "Marzo", "Ventas": 250},
]
pdf_file = canvas.Canvas("sales_report.pdf", pagesize=A4)
width, height = A4
# Cabecera
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Informe de ventas")
# Añadiendo datos
pdf_file.setFont("Helvetica", 12)
y_position = height - 150
for item in data:
line = f"{item['Mes']}: Ventas = {item['Ventas']}"
pdf_file.drawString(100, y_position, line)
y_position -= 20
# Guardar el PDF
pdf_file.save()
Este código crea un archivo PDF añadiendo datos de ventas para cada mes en líneas separadas.
6. Añadiendo imágenes
Además de texto, en el documento PDF pueden incluirse imágenes y gráficos. Probemos añadiendo una imagen:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
def create_pdf_with_image(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Aquí estará tu imagen:")
# Ruta a tu imagen
image_path = "example_image.jpg"
c.drawImage(image_path, 100, height - 300, width=200, height=150)
c.showPage()
c.save()
file_path = "image_example.pdf"
create_pdf_with_image(file_path)
¡Simple, no? Ahora tenemos un PDF con una imagen.
Ahora que sabes cómo crear un PDF con texto e imágenes, piensa cómo podrías aplicarlo en la vida real. Imagina que trabajas en una empresa de análisis y necesitas generar informes de ventas cada mes. En vez de preparar manualmente el documento cada vez, puedes escribir un script que recoja automáticamente los datos y genere el informe en PDF. Esto no solo ahorra tiempo, sino que también aumenta la precisión y consistencia de los datos en el informe.
7. Añadiendo tablas al PDF
Ahora hagamos un pequeño cambio respecto al texto simple. ¿Qué pasa si queremos añadir datos, como una lista de productos y precios? Vamos con un ejemplo sencillo:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
items = [("Plancha", 42.99), ("Hervidor", 15.00), ("Televisor", 250.00)]
def create_pdf_with_table(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Lista de productos y sus precios:")
y = height - 150
for item in items:
c.drawString(100, y, f"{item[0]} - {item[1]:.2f} $")
y -= 20
c.showPage()
c.save()
file_path = "table_example.pdf"
create_pdf_with_table(file_path)
Aquí añadimos una lista simple de productos con precios. ¡Imagina las posibilidades! Puedes generar tablas completas con datos obtenidos de una base de datos, como tu querido pandas DataFrame.
8. Uso de plantillas para automatizar informes
Uno de los enfoques más poderosos para la automatización de informes es el uso de plantillas. Básicamente, puedes crear plantillas de documentos con estructura y diseño, y luego llenarlas con datos usando tu script.
Creación de un documento plantilla
Crea una plantilla básica que contenga elementos estáticos como logotipos y headers fijos. Luego, automáticamente llena esos espacios con datos dinámicos, como fechas, gráficos o listas. Esto se puede organizar, por ejemplo, usando Jinja2 para el texto de la plantilla, y luego generar el documento PDF final.
Para crear plantillas con ReportLab, puedes usar una combinación de datos estáticos y dinámicos. Por ejemplo, un fondo predefinido para el informe con logotipos de marca y elementos permanentes que se superponen al contenido dinámico generado desde los datos de tu aplicación.
GO TO FULL VERSION