Generador Profesional de Documentos PDF
Sistema de templates reutilizables para producir PDFs con calidad de impresion (planes, guias, catalogos) a partir de fotos, notas y datos — sin abrir Word, sin diseñador.
El Reto
El cliente recibia notas a mano por WhatsApp y necesitaba convertirlas en documentos PDF profesionales: planes de bienestar personalizados, guias educativas, catalogos de productos. El flujo previo era HTML plano armado manualmente cada vez — sin templates, sin imagenes incrustadas, sin diseño consistente, sin posibilidad de iterar rapido.
El reto no era solo generar un PDF: era construir una libreria de templates reutilizables con calidad visual tipo Canva (Google Fonts, gradientes, sombras, SVGs) que pudieran combinarse con datos dinamicos (JSON) o quedarse como documento estatico. Y todo debia funcionar offline en Windows — sin depender de servicios externos ni de un navegador headless cada vez.
Caso especialmente complejo: en Windows, las dependencias GTK3/Pango que requiere WeasyPrint no se encuentran en PATH al importar Python. Habia que cargar las DLLs explicitamente desde la ruta de MSYS2 antes de importar el modulo, sin lo cual el render fallaba.
La Solucion
Construimos un workspace de templates HTML/CSS + un pipeline Python para renderizar cualquier template a PDF impresion-ready. Cada template vive en su propia carpeta con sus assets, y se puede regenerar en segundos cambiando los datos JSON de entrada.
Stack hibrido: Node.js compila los templates con Handlebars (inyectar datos en HTML), Python (WeasyPrint) renderiza el HTML a PDF con soporte de CSS Grid, Flexbox, @page rules, page-break-* y print-color-adjust. Para editar PDFs existentes (insertar texto, agregar imagenes a documentos ya generados) usamos PyMuPDF — sin recrear desde cero.
Las imagenes de WhatsApp se incrustan como base64 directamente en el HTML, lo que produce PDFs autocontenidos faciles de compartir. Cada documento se organiza en su subcarpeta con el ultimo PDF nombrado limpio + previews PNG + carpeta versions/ con historico fechado.
Features Clave
Libreria de Templates Reutilizables
Templates HTML/CSS que se guardan una vez y se reutilizan: plan-bienestar (4 paginas A4, datos via JSON), guia-bienestar (2 paginas estatica), catalogo de productos. Cada template lleva sus fonts, colores y assets propios.
Render WeasyPrint con Calidad de Impresion
WeasyPrint convierte HTML/CSS a PDF respetando @page (A4, margenes), saltos de pagina (page-break-after, page-break-inside), Google Fonts via @font-face y colores forzados con print-color-adjust: exact. Sin navegador, sin Playwright.
Edicion de PDFs Existentes con PyMuPDF
PyMuPDF (fitz) permite insertar texto, imagenes y modificar PDFs ya generados sin recrearlos. Cambios pequeños en segundos; rediseño completo cae al pipeline HTML/CSS + WeasyPrint.
Datos Dinamicos con Handlebars
Los templates con variables se compilan inyectando un JSON de datos. Para el plan de bienestar, basta editar plan.json (peso, objetivos, productos, plan de comidas) y regenerar — el PDF queda personalizado en menos de 5 segundos.
Imagenes Incrustadas en Base64
Fotos de WhatsApp se convierten a base64 y se inyectan inline. PDFs autocontenidos, sin paths rotos al compartir, listos para enviar por correo o WhatsApp.
Organizacion Automatica del Output
Cada tipo de documento tiene su subcarpeta. El PDF mas reciente siempre se llama igual (sin fecha) para encontrarlo facil; las versiones anteriores se mueven a versions/[fecha].pdf. Previews PNG en su propia carpeta. Nada queda suelto.
Como se Ve
Plan de Bienestar Personalizado (4 paginas A4)
Template con portada de marca, evaluacion de composicion corporal Omron, productos recomendados con imagenes, plan de comidas semanal y notas finales. Generado desde JSON en 3 segundos.
Guia Educativa de Bienestar (2 paginas)
Template estatico con seccion sobre proteina, calorias, productos y como tener resultados. Tipografia editorial, iconos SVG, gradientes de marca — sin emojis.
Pipeline de Generacion en Terminal
Comando node scripts/generate-pdf.js con nombre del template y ruta del JSON. Salida: HTML compilado intermedio, PDF final en output/[nombre]/[nombre].pdf, previews PNG opcionales.
Estructura del Workspace
Carpeta templates/ con cada template aislado (plan-bienestar, guia-bienestar, catalogo). Carpeta input/ por solicitud, output/ organizada por tipo de documento. Sin archivos sueltos.
Detalles Tecnicos
| Componente | Tecnologia |
|---|---|
| Templating | Handlebars (variables + helpers + partials) |
| Render PDF | WeasyPrint (Python) — HTML/CSS a PDF impresion-ready |
| Edicion PDF | PyMuPDF / fitz (insertar texto, imagenes, anotaciones) |
| Runtime templates | Node.js 20+ |
| GTK3/Pango (Windows) | MSYS2 + os.add_dll_directory antes de importar WeasyPrint |
| Diseño | HTML5 + CSS3 (Grid, Flexbox, @page, Google Fonts via @font-face) |
| Imagenes | Base64 inline para PDFs autocontenidos |
| Respaldo | Playwright headless (solo si WeasyPrint no soporta algo) |
Resultados
3+
Templates listos para reutilizar
<5 seg
Tiempo de regeneracion de un PDF
~800 KB
Tamaño promedio del PDF de plan
Tipo Canva, impresion-ready
Calidad
Cero (offline-first)
Dependencia de internet
Servicios relacionados
¿Generas el mismo documento todas las semanas, siempre desde cero?
Te armamos una libreria de templates reutilizables con calidad de impresion. Cambias los datos, regeneras en segundos.