
Cómo generar PDFs en n8n con Gotenberg
Integra Gotenberg en tus workflows de n8n para crear PDFs de manera automatizada
En un artículo anterior estuvimos analizando un workflow de n8n para generar transcripciones con FFmpeg y tu LLM de confianza. En este artículo, te compartiré mi flujo de trabajo para crear archivos PDF utilizando n8n y Gotenberg.
Gotenberg
Gotenberg es una API basada en Docker que condensa múltiples herramientas para el manejo y creación de archivos PDF. Es una solución ideal para desplegar en un HomeLab, una Raspberry Pi o en tu VPS de preferencia.
Lo primero que necesitarás para automatizar la creación de documentos es una instancia de Gotenberg. Para ello, puedes seguir la guía de instalación oficial. A continuación, te adjunto el archivo docker-compose.yml que utilizo en mi entorno local:
services:
gotenberg:
restart: always
ports:
- "80:80"
image: gotenberg/gotenberg:8
command: gotenberg --api-port=80 --api-timeout=20s --log-level=debugSi pretendes desplegar Gotenberg en AWS, la documentación sugiere utilizar la versión específica para AWS Lambda. Puedes verificar la documentación técnica para obtener más detalles sobre esta implementación.
La documentación oficial recomienda no exponer la instancia de Gotenberg directamente a Internet; lo ideal es tratarla como un recurso interno, similar a una base de datos.
Como referencia, adjunto el consumo de memoria RAM de Gotenberg en estado de reposo:
Promedio de 200 MB de RAM consumidos.
Al procesar un PDF de una sola página, el consumo de memoria puede ascender hasta los 650 MB:

Workflow de n8n

Mi propuesta es bastante sencilla: este subworkflow puede ser invocado desde cualquier otro flujo de trabajo. El proceso consiste en enviar el contenido en formato Markdown, el cual se convertirá internamente y retornará el archivo PDF al workflow principal.
Puedes descargar el workflow desde mi repositorio y probarlo directamente en tu instancia de n8n. El único ajuste requerido es modificar la URL dentro del nodo HTTP Request para que apunte a tu instancia de Gotenberg.
Para la mayoría de los casos de uso, generar los PDFs a partir de Markdown es suficiente. No obstante, si necesitas un control visual más riguroso, también puedes generarlos a partir de HTML. Aquí te comparto un ejemplo básico de su implementación:

También puedes descargarlo de mi repositorio para tus pruebas locales.
Tips y Optimización
Para obtener un control granular sobre el archivo generado, te recomiendo revisar las Page properties disponibles para personalizar el resultado final.
A través de estas propiedades puedes personalizar:
- El tamaño de página (A4, Letter, etc.).
- Los márgenes del documento.
- La generación de PDFs de una sola página (single page).
Por defecto, Gotenberg genera los archivos con un nombre aleatorio. Si necesitas que el output tenga un nombre específico, añade el siguiente encabezado (header) a tu solicitud HTTP: Gotenberg-Output-Filename: nombre_del_archivo.pdf
Fondos y Estilos
Si deseas generar PDFs con un fondo de color, patrones o degradados (en lugar del blanco predeterminado), debes agregar la propiedad printBackground: true al cuerpo del request. Para asegurar que los colores se rendericen correctamente, te sugiero incluir la siguiente regla CSS en tu plantilla:
body {
-webkit-print-color-adjust: exact;
}Performance y Resolución de Problemas
En mis pruebas identifiqué que algunos documentos complejos se generaban con la información superpuesta o con cortes inesperados. En esos casos, la solución es añadir la propiedad skipNetworkIdleEvent: false a la petición. Esto obliga a Gotenberg a esperar a que la red esté inactiva antes de realizar la generación del PDF, garantizando que todos los recursos (como fuentes externas o imágenes) se hayan cargado. Esto mejorará el resultado final.
Gotenberg ofrece muchas más capacidades, como capturas de pantalla de URLs específicas o realizar merge de multiples documentos. Te invito a profundizar en su documentación oficial.
Mientras tanto, cuéntame: ¿Planeas utilizar Gotenberg para la generación de reportes en tus workflows? ¿Tienes alguna duda técnica sobre la implementación? Te leo en los comentarios.
Articulos relacionados
Transcribe Audios Largos con N8N y FFmpeg sin Límites de Tamaño
Aprende a crear un subworkflow de n8n que segmente y transcriba largos archivos de audio automaticamente
No más .env perdidos: Una solución self-hosted
Mi experiencia usando Infisical para gestionar variables de entorno: instalación, configuración y uso real en proyectos JavaScript
Construyendo un Hitbox Casero 🕹️🛠️
Mi experiencia construyendo mi propio Hitbox utilizando GP2040-CE e impresión 3D.