miércoles, 19 de marzo de 2014

Compresión y optimización de documentos PDF

He tenido un problema con un documento extraído directamente con un escáner. El pdf final presentaba una buena calidad de visionado, pero a costa de un tamaño excesivo. La solución podría haber sido extraer cada página, que no era más que una imagen, tratarla individualmente, y generar un nuevo pdf (como ya hemos hecho en ocasiones, empezando como aquí o aquí).



Como tenía que ser algo rápido, primero lo intenté haciendo una conversión a través de pdftk pasando de pdf a un documento ps de gran volumen, y luego reconvertirlo a pdf, que suele quedar más "ligero"

pdf2ps fichero.pdf resultado.ps

ps2pdf resultado.ps fichero.mas.pequeno.pdf

Si bien es cierto que logré una reducción de tamaño, y que el resultado mantenía mucha calidad, la reducción era solo del 20% y el documento seguía aun poco manejable para enviarlo por la red. Así que decidí aplicar el script shrinkpdf. La reducción fue espectacular, quedando alrededor del 8% del volumen original, pero era completamente ilegible. Finalmente, en este enlace encontré este script

#!/bin/bash

DPI=150
PDF_DESTINATION=""

help() {
echo "optimize_pdf help"
echo "-h : show this help"
echo "-d : (optional) output pdf document resolution, by default : 150"
echo "-s : pdf source file, this file must exist"
echo "-o : pdf output file"
}

full_path() {
if [ -z $1 ]; then
exit;
else
if [ `expr substr ${1:-a} 1 2` != "/" ]; then
FULL_FILE=`pwd`"/"$1
fi
fi
echo $FULL_FILE
}

isNumeric(){ echo "$@" | grep -q -v "[^0-9]" ;}

while getopts "s:o:d:h" flag
do
case $flag in
#Source : source file
"s")
PDF_FILE=`full_path $OPTARG`
if [ ! -e $PDF_FILE ]; then
echo "Please provide a valid source file"
exit=1
fi
;;
#Output : output file
"o")
PDF_DESTINATION=$OPTARG
;;
#Dpi : desired resolution
"d")
if [ -z `isNumeric $OPTARG` ]; then
DPI=$OPTARG
else
echo "Please provide a numeric value for your DPI"
exit=1
fi
;;
"h")
exit=1
;;
esac
done

#Is there a target file?
if [ -z $PDF_DESTINATION ]; then
echo "Please provide a file name for output"
exit=1
fi

#At least one error, we're not going any further
if [ $exit ]; then
help
exit
fi

pdftops \
-paper match \
-nocrop \
-noshrink \
-nocenter \
-level3 \
-q \
"$PDF_FILE" - \
| ps2pdf14 \
-dEmbedAllFonts=true \
-dUseFlateCompression=true \
-dOptimize=true \
-dProcessColorModel=/DeviceRGB \
-dUseCIEColor=true \
-r72 \
-dDownsampleGrayImages=true \
-dGrayImageResolution=$DPI \
-dAutoFilterGrayImages=false \
-dGrayImageDownsampleType=/Bicubic \
-dDownsampleMonoImages=true \
-dMonoImageResolution=$DPI \
-dMonoImageDownsampleType=/Bicubic \
-dDownsampleColorImages=true \
-dColorImageResolution=$DPI \
-dAutoFilterColorImages=false \
-dColorImageDownsampleType=/Bicubic \
-dPDFSETTINGS=/prepress \
- "$PDF_DESTINATION"


La guardé como texto plano y la ejecuté directamente

. optimize_pdf.sh -s input.pdf -o output.pdf

y con el conseguí una reducción al 25% y con un documento visible de forma aceptable. Como se puede ver, es fácil manejar alguno de los parámetros, aunque por la premura de tiempo no toqué nada. Cubiertas las necesidades en 1 segundo de computación.

¡Qué haríamos sin el terminal y sin los usuarios que dominan bash y nos regalan estas utilidades!

No hay comentarios:

Publicar un comentario