CodeGym /Cursos /Python SELF ES /Fundamentos para crear PDFs con texto para automatizar in...

Fundamentos para crear PDFs con texto para automatizar informes

Python SELF ES
Nivel 44 , Lección 2
Disponible

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

Python

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.

Python

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.

Python

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

Python

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

Python

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

Python

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:

Python

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:

Python

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.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION