Automatizar marcas de agua en PDF con Ghostscript
Ghostscript es una herramienta potente y de código abierto para manipular PDF, que ofrece capacidades sólidas de marcas de agua, compresión y procesamiento de documentos. Esta guía explora cómo aprovechar Ghostscript para agregar una marca de agua de texto visible a cada página y, de forma opcional, reducir la resolución de las imágenes para obtener un resultado más pequeño. Trabaja sobre copias: reescribir un PDF puede alterar formularios, anotaciones, color y firmas.
Instalar y configurar Ghostscript
Instala un paquete de Ghostscript con soporte vigente y parches de seguridad. En Ubuntu y sistemas basados en Debian:
sudo apt-get update
sudo apt-get install ghostscript
Para usuarios de macOS con Homebrew:
brew install ghostscript
Verifica la instalación y la versión:
gs --version
Crear una marca de agua con un procedimiento EndPage
Ghostscript puede ejecutar un procedimiento PostScript EndPage después de dibujar cada página del
PDF. A diferencia de una anotación independiente o de un comando ejecutado después del PDF, esto
dibuja el texto en cada página emitida. Crea
watermark.ps en tu directorio de trabajo:
%!PS-Adobe-3.0
<< /EndPage {
2 eq {
pop false
} {
pop
gsave
initgraphics
4 dict begin
/size currentpagedevice /PageSize get def
/label (CONFIDENTIAL) def
size 0 get 2 div size 1 get 2 div translate
/Helvetica-Bold findfont 36 scalefont setfont
/side size aload pop 2 copy gt { exch } if pop def
/factor side 0.8 mul label stringwidth pop div def
factor 1 lt { factor dup scale } if
45 rotate
0.75 setgray
label dup stringwidth pop -2 div 0 moveto show
end
grestore
true
} ifelse
} >> setpagedevice
Restablecer el estado gráfico mantiene la colocación independiente de la rotación de la página del PDF. El texto se reduce en las páginas estrechas para que la marca de agua completa quede dentro de la página.
Aplicar la marca de agua de forma segura
Ejecuta esto en un directorio que no contenga un watermarked.pdf existente. Carga el procedimiento antes del
PDF de entrada. Omitir las anulaciones de tamaño de papel conserva las dimensiones de página del
archivo de entrada:
gs -dSAFER \
-dBATCH \
-dNOPAUSE \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.7 \
-dPDFSETTINGS=/prepress \
-sOutputFile=watermarked.pdf \
-f watermark.ps input.pdf
Optimizar la compresión de PDF
Ghostscript ofrece ajustes preestablecidos que sacrifican calidad de imagen a cambio de tamaño de archivo. No se garantiza que el resultado sea más pequeño, y este comando independiente no agrega una marca de agua:
gs -dSAFER \
-dBATCH \
-dNOPAUSE \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.7 \
-dPDFSETTINGS=/ebook \
-sOutputFile=compressed.pdf \
input.pdf
Opciones disponibles de -dPDFSETTINGS:
/screen: salida de baja resolución, con un objetivo de submuestreo de 72 dpi para color y escala de grises./ebook: salida de resolución media, con un objetivo de submuestreo de 150 dpi para color y escala de grises./printer: salida orientada a impresión, con un objetivo de submuestreo de 300 dpi para color y escala de grises./prepress: configuración orientada a preimpresión; no garantiza que todos los valores de color se mantengan sin cambios./default: salida de uso general, no promete conservar todos los ajustes originales.
Consulta la documentación de salida PDF de Ghostscript para ver la configuración completa de los ajustes preestablecidos. Inspecciona visualmente el resultado antes de reemplazar un documento original.
Script de automatización mejorado
Guarda esto como process.sh junto a watermark.ps y luego ejecuta bash process.sh input.pdf new-results.
El directorio de salida no debe existir todavía. Una etapa fallida elimina únicamente la salida de
esta invocación; el PDF original y los directorios de resultados existentes permanecen intactos.
#!/bin/bash
set -euo pipefail
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <input-pdf> <new-output-directory>" >&2
exit 1
fi
INPUT_FILE=$1
OUTPUT_DIR=$2
WATERMARK_FILE=$PWD/watermark.ps
STAMPED_FILE=stamped.pdf
COMPRESSED_FILE=compressed.pdf
[[ $INPUT_FILE = /* ]] || INPUT_FILE=$PWD/$INPUT_FILE
[[ $OUTPUT_DIR = /* ]] || OUTPUT_DIR=$PWD/$OUTPUT_DIR
if [ ! -f "$INPUT_FILE" ]; then
echo "Error: Input PDF not found" >&2
exit 1
fi
if [ ! -f "$WATERMARK_FILE" ]; then
echo "Error: watermark.ps not found in the working directory" >&2
exit 1
fi
if ! mkdir -m 700 -- "$OUTPUT_DIR"; then
echo "Error: Use a new output directory" >&2
exit 1
fi
cleanup() {
local status=$?
if [ "$status" -ne 0 ]; then
rm -f -- "$OUTPUT_DIR/$STAMPED_FILE" "$OUTPUT_DIR/$COMPRESSED_FILE"
rmdir -- "$OUTPUT_DIR"
fi
}
trap cleanup EXIT
cd -P -- "$OUTPUT_DIR"
OUTPUT_DIR=$PWD
process_pdf() {
local output=$1
local settings=$2
shift 2
if ! gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite \
-dCompatibilityLevel=1.7 -dPDFSETTINGS="$settings" \
-sOutputFile="$output" -f "$@"; then
echo "Error: PDF processing failed" >&2
exit 1
fi
}
echo "Adding watermark..."
process_pdf "$STAMPED_FILE" /prepress "$WATERMARK_FILE" "$INPUT_FILE"
echo "Optimizing file size..."
process_pdf "$COMPRESSED_FILE" /ebook "$OUTPUT_DIR/$STAMPED_FILE"
echo "Processing complete: $OUTPUT_DIR/$COMPRESSED_FILE"
Consideraciones de seguridad
Al procesar PDF con Ghostscript:
- Mantén
-dSAFERhabilitado; restringe el acceso a archivos, pero no es un sandbox completo. - Verifica los archivos de entrada antes de procesarlos
- Usa permisos de archivo adecuados para los archivos de salida
- Mantén Ghostscript actualizado a la última versión para recibir parches de seguridad
- Revisa el número de páginas, las dimensiones, la marca de agua visible y el contenido renderizado después del procesamiento.
Ejecuta los documentos no confiables con una cuenta restringida del sistema operativo o en un
contenedor aislado con límites de tiempo y memoria. Trata watermark.ps como código ejecutable:
asegúrate de que su contenido sea confiable y no insertes en él entradas de usuario sin escapar.
Una marca de agua visible no cifra un documento ni impide copiarlo.
Compatibilidad de versiones
Usa una versión de Ghostscript con mantenimiento y comprueba la versión instalada. Notas clave de compatibilidad:
- Se recomienda el nivel de compatibilidad de PDF
1.7para los flujos de trabajo modernos - Las firmas digitales existentes se invalidan cuando se reescribe el PDF.
- Los flujos de trabajo heredados de PostScript siguen teniendo soporte, pero pueden requerir actualizaciones
Conclusión
Ghostscript puede estampar cada página de un PDF y aplicar un ajuste preestablecido de compresión en un flujo de trabajo repetible. Conserva el archivo de entrada, haz que el proceso falle de forma visible si falla cualquiera de las dos etapas e inspecciona el resultado antes de publicarlo.
Si necesitas procesamiento automatizado de documentos a gran escala, considera explorar los servicios de procesamiento de documentos de Transloadit, que gestionan las operaciones con PDF de forma segura y eficiente en la nube.
