Skip to main content

Generador de PDFs usando WeasyPrint, diseñado para formularios y reportes con componentes genéricos.

Project description

🚀 assemblerpdf

Generador de PDFs dinámicos utilizando WeasyPrint con componentes HTML genéricos, modulares y reutilizables.

Esta librería permite ensamblar PDFs complejos utilizando un conjunto de componentes reutilizables (grid_row, input, textarea, checkbox, radio, etc.), con soporte para la fuente Inter descargada automáticamente, y con soporte para la instalación automatizada y manual de las dependencias del sistema operativo (Pango, Cairo, etc.).


⚡ Instalación

1. Instalar la librería en Python

Puedes instalar la librería en modo editable localmente para desarrollo:

pip install -e .

2. Instalar dependencias del sistema operativo (Requisito para WeasyPrint)

WeasyPrint requiere librerías nativas del sistema (Cairo, Pango y GdkPixbuf) para renderizar PDFs de alta calidad.

Método Automatizado (Recomendado)

Puedes dejar que assemblerpdf intente detectar tu sistema operativo e instalar automáticamente las librerías del sistema y descargar las fuentes corriendo el siguiente script interactivo en Python:

import assemblerpdf
assemblerpdf.install_dependencies()

Método Manual (Por si falla la autoinstalación)

🪟 Windows
  1. Descarga e instala MSYS2 desde msys2.org (o instálalo vía PowerShell ejecutando winget install MSYS2.MSYS2).
  2. Abre la consola de MSYS2 (UCRT64 o MINGW64) y ejecuta:
    pacman -S --noconfirm mingw-w64-x86_64-pango mingw-w64-x86_64-shared-mime-info
    
  3. La librería assemblerpdf agregará automáticamente C:\msys64\mingw64\bin al path de DLLs en runtime de Python. Si tienes MSYS2 en otra ruta, asegúrate de añadir su directorio /bin a tu variable de entorno PATH.
🍎 macOS

Si utilizas Homebrew, abre tu terminal y ejecuta:

brew install weasyprint
🐧 Linux (Debian / Ubuntu / Mint)

Asegura los paquetes de Cairo y Pango usando apt:

sudo apt-get update
sudo apt-get install -y libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info
🐧 Linux (Fedora / RHEL / CentOS)

Usa dnf para instalar las dependencias nativas:

sudo dnf install -y pango cairo gdk-pixbuf2 libffi-devel

🛠️ Guía de Uso

1. Instanciar el Ensamblador (BaseFormAssembler)

El ensamblador principal es BaseFormAssembler. Al instanciarlo, puedes configurarlo con metadatos fijos que se aplicarán de manera consistente en la decoración (encabezados, pies de página con número de página y bordes decorativos en cada hoja).

from assemblerpdf import BaseFormAssembler

# 1. Definir el contexto global de datos para renderizado de variables
context = {
    "primerNombre": "Juan",
    "primerApellido": "Pérez",
    "numeroRadicado": "RAD-2026-000123"
}

# 2. Inicializar el ensamblador con opciones de personalización
assembler = BaseFormAssembler(
    context=context,
    codigo="GSC-FT-11-V10",          # Código del documento impreso en el pie de página
    fecha="Oficialización: 22/10/2024", # Fecha en el pie de página
    version="10",                      # Versión en el pie de página
    auto_decorations=True,             # Activa bordes y folio automático de página (Pág X de Y)
    custom_css_content="""
        /* CSS adicional para sobreescribir estilos por defecto si es necesario */
        .form-label {
            font-weight: bold;
            color: #002857;
        }
    """
)

2. Métodos del Ensamblador

Añade contenido a tu PDF de forma secuencial utilizando sus métodos principales:

A. add_component(template_name, component_context)

Agrega un componente HTML individual utilizando un contexto de variables locales.

  • template_name: Nombre de la plantilla en assemblerpdf o sistema (ej. header.html, section.html, checkbox.html, textarea.html).
  • component_context: Diccionario con los parámetros del componente.
assembler.add_component("header.html", {
    "titulo1": "FORMULARIO DE SOLICITUD DE INSCRIPCIÓN",
    "titulo2": "UNIDAD NACIONAL DE PROTECCIÓN"
})

assembler.add_component("section.html", {
    "titulo": "Datos de Radicación",
    "icono": "fa-solid fa-file-contract"
})

B. add_grid_row(columns)

Permite maquetar filas con múltiples columnas alineadas y anchos distribuidos de forma precisa.

  • columns: Lista de diccionarios, donde cada uno describe una columna con la siguiente estructura:
    • template: plantilla del componente.
    • context: variables locales para el componente.
    • ancho: porcentaje de la celda (ej. '50%', '25%').
assembler.add_grid_row([
    {
        "template": "input.html",
        "context": {"label": "Número de Radicado", "valor": context["numeroRadicado"], "name": "radicado"},
        "ancho": "70%"
    },
    {
        "template": "input.html",
        "context": {"label": "Fecha", "valor": "2026-06-03", "name": "fecha_rad"},
        "ancho": "30%"
    }
])

C. add_page_break()

Inserta un salto de página manual obligatorio en el PDF.

assembler.add_page_break()

D. add_raw_html(html_content)

Inyecta un fragmento de HTML crudo en el flujo del documento. Es ideal para textos de advertencia pequeños, firmas específicas o scripts.

assembler.add_raw_html('<p class="warning-text">* Recuerde firmar al final de este formulario.</p>')

3. Compilar el PDF (build)

El método build() compila las plantillas HTML a través de WeasyPrint y retorna los bytes del PDF. Puedes escribir los bytes en disco o retornarlos como respuesta HTTP (ej. HttpResponse en Django, FastAPI, Flask).

# Generar los bytes del documento
pdf_bytes = assembler.build()

# Guardar a archivo local
with open("documento_generado.pdf", "wb") as f:
    f.write(pdf_bytes)

🎨 Componentes Disponibles de la Librería

La librería incluye los siguientes componentes listos para su uso:

  • header.html: Encabezado corporativo configurable con títulos y logotipos en base64.
  • section.html: Encabezado de sección con soporte opcional de iconos de FontAwesome.
  • input.html: Campo de entrada con etiqueta que se vuelve un div estático en modo no interactivo (interactive=False).
  • textarea.html: Área de texto multilínea con auto-paginación inteligente para textos largos.
  • checkbox.html: Lista de opciones de selección múltiple con iconos de check.
  • radio.html: Opciones de selección única estilo botón de radio.
  • signature.html: Componente modular para renderizado de firmas en cuadrícula.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

assemblerpdf-1.0.18.tar.gz (224.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

assemblerpdf-1.0.18-py3-none-any.whl (249.7 kB view details)

Uploaded Python 3

File details

Details for the file assemblerpdf-1.0.18.tar.gz.

File metadata

  • Download URL: assemblerpdf-1.0.18.tar.gz
  • Upload date:
  • Size: 224.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for assemblerpdf-1.0.18.tar.gz
Algorithm Hash digest
SHA256 c12f24b6262503e22f45e02882fd08583fc97ccd61f1f0e719b5e3a46fd2736f
MD5 4d2917813a4f4ed4b9ebc20a69471353
BLAKE2b-256 32a8f30227150dbd75a7460e9f2a16d27ad4e4950dd4d72e34ee40cbb015eed7

See more details on using hashes here.

File details

Details for the file assemblerpdf-1.0.18-py3-none-any.whl.

File metadata

  • Download URL: assemblerpdf-1.0.18-py3-none-any.whl
  • Upload date:
  • Size: 249.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for assemblerpdf-1.0.18-py3-none-any.whl
Algorithm Hash digest
SHA256 6b95a2c746cf5f6ea270dcf1daa8ee90215d09e5f754b5d3357df0a9604766b3
MD5 7776c2af9f3c75dcdf073b93489c061e
BLAKE2b-256 92d4f1d443e267d663314ee1916ebb5532a719a9b3823e24240fc6033f0624d7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page