Acelerando los desarrollos con contenedores : Gotenberg

Publicado por Víctor Madrid el

Arquitectura de SolucionesAceleradores de DesarrolloDockerGotenbergPDFConvertir

En este artículo se va a mostrar cómo poder disponer de un contenedor de forma rápida para utilizarlo durante el desarrollo o bien en cualquier entorno de ejecución con vistas a disponer de un componente software capaz de generar PDFs a partir de diferentes documentos.

En resumen ... vamos a tener un conversor a PDF local. Esto que ya parece algo tan típico y tan superado a fecha de 2025, veremos que tendrá un nuevo enfoque y que no será ninguna tontería si lo empezamos a integrar con automatismos en los flujos de trabajo.

La herramienta de la que estamos hablando se llama Gotenberg.

CABECERA

¿Qué es Gotenberg?

Gotenberg es una herramienta Open Source basada en contenedores que facilita disponer de un API REST de conversión a PDF para cierta tipología de documentos:

  • Imágenes: PNG, JPG, etc.
  • Web: HTML y Markdown
  • Microsoft Office: Word, Excel, Powerpoint, etc.
  • Formato Abierto: ODT, ODS, etc.
  • Etc.

Por lo tanto, se estaría eliminando la necesidad de realizar estos procesos manuales de conversión a PDF que siempre son un "roba tiempo" y en los que muchas veces se hace mal. Con su correcta implementación se estarían optimizando los flujos de trabajo al poder automatizar ciertos procesos 😃

Consideraciones

  • Conversión desde diferentes fuentes de origen
  • Soporte a diferentes tipos de protocolos: HTTP/1, HTTP/2 , etc.
  • Proporciona una serie de endpoints bastante versátiles
    • Posibilidad de trabajar con múltiples ficheros en una petición
    • Configuración individual para cada petición
    • Fusión de múltiples ficheros en un único fichero
    • Dispone de endpoints concretos de la aplicación ver métricas, versión, etc.
  • Facilita su integración desde cualquier lenguaje o aplicación que pueda realizar peticiones HTTP
  • Dispone de características de personalización
    • Uso de cabeceras en la petición
    • Opciones de configuración de la herramienta
  • Despliegue con Docker
    • Facilita su integración en entornos modernos
    • Facilita la escalabilidad y su uso en entornos distribuidos
  • Tiene un diseño modular, donde cada módulo se configura de forma independiente
  • Facilita establecer generar webhooks para la subida de ficheros asíncrona
  • Maneja documentos grandes, pero puede ser necesario tener que realizar algún tipo de ajuste del contenedor
  • Se le puede añadir autenticación a nivel de herramientas Nginx o Traefik
  • Dispone de monitorización básica pero se le puede integrar con herramientas como Prometheus y Grafana

Referencias:

A containerized API for seamless PDF conversion | Gotenberg
A containerized API for seamless PDF conversion
GitHub - gotenberg/gotenberg: A developer-friendly API for converting numerous document formats into PDF files, and more!
A developer-friendly API for converting numerous document formats into PDF files, and more! - gotenberg/gotenberg
What is Gotenberg? | Gotenberg
Gotenberg is a containerized API for seamless PDF conversion.

Este es el índice que se va a utilizar para estructurar este artículo

  • 1. Introducción
  • 2. Stack Tecnológico
  • 3. Ejemplos de Uso
  • 4. Conclusiones

1. Introducción

En este apartado se tratarán los siguiente puntos :

  • 1.1. Introducción al uso de contenedores como aceleradores del desarrollo
  • 1.2. ¿Qué necesidades tenemos para tener un "Gotenberg" con contenedores?

1.1. Introducción al uso de contenedores como aceleradores del desarrollo

Para centralizar esta información en un único punto y así poder facilitar su consulta se ha diseñado un artículo específico

1.2. ¿Qué necesidades tenemos para requerir un "Gotenberg" con contenedores?

Los motivos principales que me llevaron a tratar de investigar en tener un Gotenberg dentro de un contenedor fueron los siguientes:

  • Disponer de una instalación inmutable
  • Replicar la instalación del producto del cliente en local o en un servidor propio (versionado, entorno, etc.)
    • Uso con contenedores
  • Minimizar en un entorno previo los posibles cambios de configuración que pudiéramos requerir --> Perdiendo el miedo a los cambios :-)
  • Asegurarse de que a todo el mundo le funcionaba de primeras
  • Aprovechar todas las funcionalidades de la propia herramienta
  • Disponer de un API complejo para pruebas
  • ...

2. Stack Tecnológico

Este es el stack tecnológico elegido para implementar la funcionalidad "n8n":

  • Docker - Tecnología de Contenedores/Containers
  • Docker Hub - Repositorio de Docker Público donde se ubican las imágenes oficiales
  • Gotenberg - API REST para convertir a PDF

3. Ejemplos de Uso

Para enseñar a utilizarlo y así practicar se ha habilitado un repositorio, este repositorio se reutilizará para otros artículos de "Acelerando los desarrollos con contenedores".

La parte de que tiene que ver con este artículo se encuentra en el apartado de docker/gotenberg/8.17

Este proyecto consta de un fichero Docker Compose con los siguientes elementos:

Herramienta gotenberg

  • Se establece la imagen de n8n con una versión establecida: gotenberg/gotenberg:8.17.1
    • Esta es la versión con la que se configuró la imagen
    • Se aconseja estar actualizado a nivel de la herramienta
  • Se define el nombre del contenedor como: gotenberg
  • Se define la política de restart
  • Se establece comandos de ejecución de la herramienta
    • Se configuran aspectos como : nivel de logs, etc.
  • Se define el puerto:
    • 3000 para las peticiones HTTP a la API

Ejemplo de fichero "docker-compose.yaml"

# Use Case: Basic Installation
services:
   # Project URL: https://github.com/gotenberg/gotenberg
   # Docs URL: https://gotenberg.dev/docs/getting-started/introduction
   gotenberg:
      image: gotenberg/gotenberg:8.17.1
      container_name: gotenberg
      restart: always
      networks: ['demo']
      command:
         # *** General ***
         - gotenberg
         - --log-level=debug # Logging levels
         - --api-timeout=10s
      ports:
         - 3000:3000
      #volumes:
         # *** Volume configuration ***
         #- ./gotenberg-data:/home/gotenberg

#volumes:
#   gotenberg-data:

networks:
   demo:
      name: demo
      driver: bridge

Para ver como lanzarlo ver fichero README dentro del proyecto.

3.1. Scripts de Soporte

N/A

3.2. Investigar lo que se usa

Cuando uno crea un contenedor basado en una imagen, ya se ha visto que consideraciones se deben tener para llegar a entender que es lo que hace.

Si tienes alguna duda vuelve a revisar el apartado "Soporte de Análisis de Contenedores" del artículo de introducción : Acelerando los desarrollos con contenedores: Introducción

Ejemplo de ejecución para mostrar la información del proceso ejecutado tras realizar un "up"

Ejemplo de inspección sobre el contenedor creado

Ejemplo de investigación general dentro del contenedor

Se podrán validar algunos de los aspectos configurados como puede ser la cadena de conexión a la base de datos, etc.

3.3. Verificar resultados

Se accede a la URL del SonarQube con:

http://localhost:3000/

De esta forma podemos verificar que se encuentran arrancado y funcionando

Se podría invocar alguno de los endpoints de gestión: /health, /version, etc.

http://localhost:3000/health

o

curl --request GET http://localhost:3000/health

3.4. Pruebas de Funcionamiento

La herramienta proporciona 3 posibles caminos para las conversiones

  • 3.4.1. Conversión con Chromiun
  • 3.4.2. Conversión con LibreOffice
  • 3.4.3. Conversión a PDF/A y PDF/UA

3.4.1. Conversión con Chromiun

Esta conversión engloba conversiones a PDF de documentos tipo web.

Ver documentación (Se detallan los endpoints cubiertos, propiedades de la página o páginas de resultado, trabajo con múltiples "Media Type", etc.)

El propio módulo de Chromiun tiene su configuración específica

Consideraciones:

  • Engloba conversiones utilizando de fuente: una URL, un fichero de HTML, un fichero de Markdown o una captura de pantalla
  • Facilita trabajar con múltiples ficheros
  • Incluye cabeceras de uso en la petición de respuesta
  • Algunos de las conversiones tienen limitaciones, por lo que conviene revisar la información de cada endpoint
  • Trabaja con formatos de PDF/A y PDF/UA

3.4.2. Conversión con LibreOffice

Esta conversión engloba conversiones a PDF de documentos tipo Office.

Ver documentación (Se detallan los endpoints cubiertos, propiedades de la página o páginas de resultado, compresión de calidad, merge, etc)

El propio módulo de LibreOffice tiene su configuración específica

Consideraciones:

  • Engloba conversiones utilizando de fuente: Word, Excel, Powerpoint, etc.
    • Oficiales y formatos libres
    • Dispone de muchos formatos permitidos
    • Permite compresión de calidad
    • Trabaja con formatos de PDF/A y PDF/UA

3.4.3. Conversión a PDF/A y PDF/UA

Esta conversión engloba conversiones a PDF de documentos PDF.

Ver documentación (Se detallan los endpoints cubiertos, lectura de metadatos, merge, split, etc)

El propio módulo de LibreOffice tiene su configuración específica

Consideraciones:

  • Engloba operaciones con PDFs: merge, split, etc.

3.5. Práctica

Ejemplo de URL

Queremos generar un PDF a partir de la página web mostrada de : www.enmilocalfunciona.io

Ejemplo de petición cURL con algunos modificadores

curl \
--request POST http://localhost:3000/forms/chromium/convert/url \
--form url=https://www.enmilocalfunciona.io/ \
--form landscape=true \
--form marginTop=1 \
--form marginBottom=1 \
-o ./resultado.pdf

Resultado

4. Conclusiones

Si alguna vez soñaste con convertir documentos a PDF sin perder horas de tu vida en procesos manuales, Gotenberg puede ser uno de los mejores compañeros. Facilita un API REST muy potente con el que convertir una gran tipología de documentos a PDF.

Uno de sus puntos fuertes es su despliegue mediante contenedores Docker lo que facilita enormemente su uso, sin llegar a entender cómo funciona por dentro...jejeje.

En esta versión enseñamos una configuración básica, pero posteriormente se puede adaptar mucho más a cada casuística incluyendo aspectos de autenticación, proxys, monitorización, etc.

Gotenberg puede ser esa herramienta que nunca supiste que necesitabas 😃

Autor

Víctor Madrid

Miembro de la Dirección Técnica en knm. Aprendiz de mucho y maestro de nada. Técnico, artista y polifacético a partes iguales ;-)