Instalación de Stirling-PDF: Herramientas PDF Self-Hosted

Stirling-PDF es una completa suite de herramientas para manipulación de PDF autoalojada que cubre todas las operaciones habituales: fusionar, dividir, comprimir, convertir, rotar, aplicar OCR, firmar digitalmente y más. Desplegado en tu propio servidor, procesa documentos de forma privada sin enviar archivos a servicios externos como ILovePDF o Smallpdf. Esta guía cubre la instalación de Stirling-PDF en Linux con Docker.

Requisitos Previos

  • Servidor con Ubuntu 20.04+, Debian 11+ o CentOS 8+
  • Docker y Docker Compose instalados
  • Mínimo 1 GB de RAM (2 GB recomendados para OCR)
  • Puerto 8080 disponible
  • Espacio en disco para procesamiento de PDFs temporales

Instalación con Docker

# Ejecutar Stirling-PDF con Docker
docker run -d \
  --name stirling-pdf \
  --restart unless-stopped \
  -p 8080:8080 \
  -v ~/stirling-pdf/trainingData:/usr/share/tessdata \
  -v ~/stirling-pdf/extraConfigs:/configs \
  -v ~/stirling-pdf/logs:/logs \
  -e DOCKER_ENABLE_SECURITY=false \
  -e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
  -e LANGS=es_ES \
  frooodle/s-pdf:latest

# Acceder al panel en http://TU-SERVIDOR:8080

Instalación con Docker Compose

mkdir -p ~/stirling-pdf && cd ~/stirling-pdf

cat > docker-compose.yml << 'EOF'
version: '3.3'

services:
  stirling-pdf:
    image: frooodle/s-pdf:latest
    container_name: stirling-pdf
    restart: unless-stopped
    ports:
      - 8080:8080
    volumes:
      - ./trainingData:/usr/share/tessdata  # Datos de entrenamiento OCR
      - ./extraConfigs:/configs             # Configuración adicional
      - ./logs:/logs                        # Logs de la aplicación
    environment:
      # Idiomas para OCR (descargar automáticamente los datos de idioma)
      LANGS: es_ES
      # Habilitar autenticación (true para producción)
      DOCKER_ENABLE_SECURITY: "false"
      # Instalar LibreOffice para conversiones avanzadas de Office a PDF
      INSTALL_BOOK_AND_ADVANCED_HTML_OPS: "false"
      # Zona horaria
      TZ: Europe/Madrid
      # Nombre del sistema en la interfaz
      SYSTEM_ROOTURIPATH: "/"
EOF

# Crear directorios
mkdir -p ~/stirling-pdf/{trainingData,extraConfigs,logs}

# Iniciar
docker compose up -d
docker compose logs -f stirling-pdf

Acceder a la interfaz en http://TU-SERVIDOR:8080.

Operaciones Disponibles

Stirling-PDF ofrece más de 50 operaciones organizadas en categorías:

Organización de Páginas

# Fusionar múltiples PDFs via API
curl -X POST http://localhost:8080/api/v1/general/merge-pdfs \
  -F "[email protected]" \
  -F "[email protected]" \
  -F "[email protected]" \
  -o fusionado.pdf

# Dividir un PDF por rangos de páginas
curl -X POST http://localhost:8080/api/v1/general/split-pdf-by-pages \
  -F "[email protected]" \
  -F "pageNumbers=1,5-10,15" \
  -o dividido.zip

# Extraer páginas específicas
curl -X POST http://localhost:8080/api/v1/general/remove-pages \
  -F "[email protected]" \
  -F "pageNumbers=2,4,6" \
  -o sin-paginas.pdf

# Rotar páginas
curl -X POST http://localhost:8080/api/v1/general/rotate-pdf \
  -F "[email protected]" \
  -F "angle=90" \
  -o rotado.pdf

Conversión de Formatos

# Convertir imagen a PDF
curl -X POST http://localhost:8080/api/v1/convert/img/pdf \
  -F "[email protected]" \
  -F "fitOption=fillPage" \
  -o imagen-a-pdf.pdf

# PDF a imagen (PNG)
curl -X POST http://localhost:8080/api/v1/convert/pdf/img \
  -F "[email protected]" \
  -F "imageFormat=png" \
  -F "singleOrMultiple=multiple" \
  -o paginas.zip

# Convertir HTML a PDF
curl -X POST http://localhost:8080/api/v1/convert/url/pdf \
  -F "urlInput=https://ejemplo.com/pagina" \
  -o pagina-web.pdf

# Convertir Word/Excel a PDF (requiere LibreOffice instalado)
# Activar en docker-compose: INSTALL_BOOK_AND_ADVANCED_HTML_OPS=true
curl -X POST http://localhost:8080/api/v1/convert/file/pdf \
  -F "[email protected]" \
  -o documento-convertido.pdf

Optimización y Compresión

# Comprimir un PDF (reducir tamaño)
curl -X POST http://localhost:8080/api/v1/general/compress-pdf \
  -F "[email protected]" \
  -F "optimizeLevel=2" \
  -o documento-comprimido.pdf
# Niveles: 1 (bajo), 2 (medio), 3 (alto), 4 (máximo)

# Reparar un PDF dañado
curl -X POST http://localhost:8080/api/v1/general/repair \
  -F "fileInput=@documento-dañado.pdf" \
  -o documento-reparado.pdf

Seguridad y Firmas

# Agregar contraseña a un PDF
curl -X POST http://localhost:8080/api/v1/security/add-password \
  -F "[email protected]" \
  -F "ownerPassword=contrasena-propietario" \
  -F "userPassword=contrasena-usuario" \
  -F "encryptionType=AES" \
  -o protegido.pdf

# Eliminar contraseña de un PDF
curl -X POST http://localhost:8080/api/v1/security/remove-password \
  -F "[email protected]" \
  -F "password=contrasena-correcta" \
  -o sin-contrasena.pdf

# Agregar marca de agua de texto
curl -X POST http://localhost:8080/api/v1/general/add-stamp \
  -F "[email protected]" \
  -F "stamp=CONFIDENCIAL" \
  -F "color=#FF0000" \
  -F "fontSize=30" \
  -F "rotation=45" \
  -F "opacity=0.3" \
  -o marcado.pdf

Configuración de OCR

Stirling-PDF usa Tesseract para OCR. Configurar los idiomas adicionales:

# Los datos de entrenamiento de Tesseract se descargan automáticamente
# Especificar idiomas en la variable de entorno LANGS

# Ver los datos de idioma disponibles
docker exec stirling-pdf ls /usr/share/tessdata/

# Descargar datos de idioma manualmente si falla la descarga automática
wget https://github.com/tesseract-ocr/tessdata/raw/main/spa.traineddata \
  -O ~/stirling-pdf/trainingData/spa.traineddata

# OCR via API
curl -X POST http://localhost:8080/api/v1/misc/ocr-pdf \
  -F "[email protected]" \
  -F "languages=spa" \
  -F "ocrType=skip-text" \
  -o documento-con-texto.pdf
# ocrType: skip-text (solo páginas sin texto), force-ocr (todo), auto

Opciones de OCR disponibles en la interfaz:

  • Idioma: Español, inglés, etc. (múltiples idiomas simultáneos)
  • Tipo OCR: Solo páginas sin texto / Forzar en todas / Automático
  • PDF/A: Generar PDF compatible con archivo a largo plazo

Uso de la API REST

Stirling-PDF tiene una API REST completa con documentación Swagger:

# Documentación interactiva de la API
# http://TU-SERVIDOR:8080/swagger-ui/index.html

# Verificar que la API está funcionando
curl http://localhost:8080/api/v1/info | python3 -m json.tool

# Script de ejemplo: procesar múltiples PDFs por lotes
#!/bin/bash
ENTRADA_DIR="/mnt/documentos/entrantes"
SALIDA_DIR="/mnt/documentos/procesados"
SERVIDOR="http://localhost:8080"

for pdf in "$ENTRADA_DIR"/*.pdf; do
  nombre=$(basename "$pdf" .pdf)
  
  echo "Procesando: $nombre"
  
  # Comprimir y aplicar OCR
  curl -s -X POST "$SERVIDOR/api/v1/misc/ocr-pdf" \
    -F "fileInput=@$pdf" \
    -F "languages=spa" \
    -F "ocrType=skip-text" \
    -o "/tmp/${nombre}-ocr.pdf"
  
  curl -s -X POST "$SERVIDOR/api/v1/general/compress-pdf" \
    -F "fileInput=@/tmp/${nombre}-ocr.pdf" \
    -F "optimizeLevel=2" \
    -o "$SALIDA_DIR/${nombre}-procesado.pdf"
  
  rm "/tmp/${nombre}-ocr.pdf"
  echo "  → Guardado: $SALIDA_DIR/${nombre}-procesado.pdf"
done

Configuración de Seguridad

Para entornos de producción, activar la autenticación:

# Editar docker-compose.yml para habilitar seguridad
environment:
  DOCKER_ENABLE_SECURITY: "true"
  SECURITY_ENABLELOGIN: "true"
  SECURITY_USERNAME: "admin"
  SECURITY_PASSWORD: "contrasena-muy-segura"
  # Deshabilitar registro de nuevos usuarios
  SECURITY_INITIALLOGIN_USERNAME: "admin"
  SECURITY_INITIALLOGIN_PASSWORD: "contrasena-muy-segura"

docker compose down && docker compose up -d
# Usar autenticación en las llamadas API
curl -X POST http://localhost:8080/api/v1/general/merge-pdfs \
  -u "admin:contrasena-muy-segura" \
  -F "[email protected]" \
  -F "[email protected]" \
  -o fusionado.pdf

# O con token de sesión (obtener primero haciendo login)
curl -X POST http://localhost:8080/api/v1/login \
  -d "username=admin&password=contrasena" | grep -i "set-cookie"

Proxy Inverso con Nginx

# Obtener certificado SSL
sudo certbot --nginx -d pdf.tu-dominio.com

# Configuración de Nginx para Stirling-PDF
sudo tee /etc/nginx/sites-available/stirling-pdf << 'EOF'
server {
    listen 443 ssl http2;
    server_name pdf.tu-dominio.com;

    ssl_certificate /etc/letsencrypt/live/pdf.tu-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pdf.tu-dominio.com/privkey.pem;

    # Aumentar límite de subida para PDFs grandes
    client_max_body_size 500M;
    proxy_read_timeout 600s;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/stirling-pdf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Solución de Problemas

Stirling-PDF no inicia:

# Ver logs del contenedor
docker logs stirling-pdf --tail 50

# Verificar que el puerto no está en uso
sudo ss -tlnp | grep 8080

# Reiniciar el contenedor
docker compose restart stirling-pdf

El OCR falla o no reconoce el idioma:

# Verificar los datos de idioma disponibles
docker exec stirling-pdf ls /usr/share/tessdata/ | grep -E "spa|eng"

# Si falta el archivo de idioma, descargarlo manualmente
wget https://github.com/tesseract-ocr/tessdata/raw/main/spa.traineddata
docker cp spa.traineddata stirling-pdf:/usr/share/tessdata/

Error al convertir documentos Office:

# LibreOffice debe estar instalado para conversiones de Office
# Activar en docker-compose.yml:
# INSTALL_BOOK_AND_ADVANCED_HTML_OPS: "true"
# Esto aumenta el tiempo de inicio y el tamaño de la imagen

docker compose down && docker compose up -d
# La primera vez tardará más en iniciar mientras instala LibreOffice

Conclusión

Stirling-PDF elimina la necesidad de servicios externos para el procesamiento de PDFs, garantizando que tus documentos nunca abandonan tu infraestructura. Con más de 50 operaciones disponibles vía interfaz web o API REST, y soporte para OCR multilingüe y conversión de formatos, es una herramienta esencial para cualquier entorno self-hosted que maneje documentación importante.