Como reducir de tamaño un archivo pdf ¡Sin morir en el intento!

Les voy a contar lo que me pasó el otro día. Un usuario me pidió ayuda para reducir de tamaño un archivo pdf ya que era muy grande para poder enviarlo por correo. Le dije — ¡No hay problema! pero después de un rato, algo que parecía sencillo, se complicó bastante.

El archivo en cuestión constaba de 26 hojas escaneadas en buena calidad y supongo que el mismo programa con el que escaneo las hojas le generó el pdf. En total el archivo era de unos 26 MB y ya había ocasionado algunos problemas para su envío. Algunas cuentas de correo tienen límites en el tamaño de los archivos adjuntos, por lo general, se recomienda enviar archivos menores a 20 MB.

Separando el PDF en varias imágenes.

Mi primer enfoque fue separar el archivo PDF generando un archivo jpg por cada una de sus hojas, para luego reducirlas de tamaño y crear nuevamente un archivo PDF. Pero por alguna razón esta tarea puso a tope los CPU’s de mi computadora al grado de afectar otros procesos. Algo parecido ya me había pasado cuando quise generar un archivo PDF a partir de las imágenes jpg.

PDF a imágenes JPG

Con mi experiencia anterior supuse que ese consumo tan exagerado de recursos era provocado por ImageMagick así que busqué una solución usando GraphicsMagick en su lugar.

Para lograr separar las imágenes usé esta instrucción:

gm convert -density 300 -resize 1200 archivo.pdf +adjoin %02d.jpg

Como pueden ver, de una vez aproveché para ajustar la densidad de la imagen a unos 300 dpi y un ajuste en el tamaño. +adjoin me permite generar un archivo por cada página del pdf y la expresión %02d.jpg nombra los archivos incrementalmente con nombres de archivos de dos dígitos (que pueden ser más).

Aún así, no me libro de un importante consumo de recursos, aunque solo por un breve instante.

equipo al tope
¡Mi computadora echando humo!

Lo más importante es que el resultado de esta operación sean imágenes sean legibles, luego se hacen tantos ajustes y reducciones que el resultado es un montón de hojas borrosas que no sirven de nada.

Una vez que revisé las imágenes, que me parecieron de un tamaño adecuado y visualmente legibles iba a proceder a crear un nuevo archivo PDF usando las instrucciones de este artículo: Convertir todas las imágenes de un directorio a PDF. peeeeeeerooooo …

¡Hay una forma más simple!

PDF a PDF más pequeño

Estaba a punto pegar todas las imágenes del directorio a un pdf cuando me di cuenta de que era posible hacerlo directamente, luego entonces mi instrucción anterior se convirtió en esto:

gm convert -density 300 -resize 1200 archivo.pdf archivo_nuevo.pdf

Y así, directamente, sin pasar por la generación de archivos jpg pude crear un pdf más pequeño que el anterior.

La opción en línea.

También se pueden usar los servicios de una página como ILovePDF para hacer más pequeños los archivos. Además ofrece otras herramientas como la de combinar, girar, convertir o separar archivos PDF.  Si tu archivo no es exageradamente grande o confidencial también es una buena opción.

Usando LibreOffice

Gracias al comentario de sayozo pude comprobar que también LibreOffice hace un buen trabajo en la reducción de tamaño de un PDF. De hecho es muy simple, basta con abrir el archivo PDF usando cualquier aplicación de LibreOffice (aunque al final termina abriendo Draw).

Opciones de exportación a PDF
Opciones de exportación a PDF.

Luego elegir el menú ArchivoExportar a PDF y ajustar los valores de Compresión JPEG y Reducir resolución de imágenes. Generalmente valores más bajos generar archivos más pequeños.

Solo revisen que sigan siendo legibles, bajar mucho estos valores puede generar archivos ilegibles o borrosos.

Espero que este consejo les ahorre tiempo y algo de espacio en su disco duro 😉 .

Convertir todas las imágenes de un directorio a PDF

Varias veces he tenido la necesidad de convertir todas las imágenes de un directorio a PDF, al principio no fue fácil, lo primero que se me ocurrió fue pegar todas las imágenes a un documento de Writer en LibreOffice para luego generar el PDF y este método funciona si son solo dos o tres imágenes, pero cuando son varias decenas el proceso se vuelve tedioso y poco práctico.

Luego recordé que muchas operaciones sobre imágenes se pueden automatizar usando el paquete ImageMagick que tiene un buen de tiempo en el mundo de linux, anteriormente lo había utilizado para redimensionar imágenes, pero no estaba seguro sobre si era posible generar un PDF, afortunadamente lo es utilizando el programa convert.

Para poder ejecutar este comando es necesario tener instalado el paquete  que se encuentra disponible en la mayoría de las distribuciones de Linux.

Convertir todas las imágenes de un directorio a PDF con imagemagick
Instalación del paquete imagemagick desde el Centro de software de Ubuntu

El proceso es muy simple realmente, basta con  abrir una terminal y ubicarse en el directorio donde se encuentran las imágenes y teclear algo muy parecido a esto:

convert *.jpg archivo-pdf.pdf

El comando se encargará de convertir, en este caso, todas las imágenes jpg del directorio al formato PDF.

Tip. Si quieren conservar un orden de aparición de las imágenes dentro del documento PDF entonces les recomiendo que nombren las imágenes con números consecutivos como 001.jpg , 002.jpg ,003.jpg … etc, de esa manera el comando convert respeta el orden de aparición.

Convertir todas las imágenes de un directorio a PDF - La instrucción convert
Ejecutando el comando para realizar la conversión a PDF.

convert es una instrucción muy potente, no solo se utiliza para convertir imágenes en distintos formatos, se puede utilizar para muchas cosas más, redimensionar, crear, editar, convertir, etc.

Todo el proceso dura unos cuantos segundos, lo he intentado con carpetas que contienen hasta medio centenar de imágenes a una excelente velocidad. Espero que este consejo les sea de utilidad.

Cuando son muchas imágenes o son muy grandes (o ambas)

Me acaba de pasar un caso curioso, tenía la tarea de convertir 448 imágenes con un tamaño de 1700 x 2200 píxeles y el consejo anterior no funcionó.

Mi computadora se puso a trabajar tan intensamente que perdí el control sobre ella, el puntero del ratón dejó de responder, el disco duro no parpadeaba ¡Se quedó encendido!. Dejé que continuara con el trabajo hasta que lo terminara.  Pero ¡Oh decepción! en lugar de obtener un flamante archivo PDF obtuve un bonito mensaje de error.

convert: unable to extend pixel cache 'No existe el archivo o el directorio' @ fatal/cache.c/CacheSignalHandler/3625.

Intenté varias cosas pero nada funcionó hasta que leí este artículo en los foros de Ubuntu [SOLVED] Cannot convert .jpg to .pdf en el que recomiendan el uso del software GraphicsMagick que por alguna razón ya estaba instalado en mi Manjaro.

Parece que una parte del problema son los archivos temporales, Manjaro tiene una partición temporal (tmpfs) que parece que es insuficiente para la tarea, por eso es necesario especificarle al programa un directorio temporal en el disco duro que tenga el espacio suficiente.

export MAGICK_TMPDIR=/my/big/directory

Para luego generar el archivo PDF con:

gm convert *.jpg -adjoin -compress JPEG archivo.pdf

Después de unos angustiantes 5 minutos en el que la computadora parecía que echaba humo, al fin terminó de generar el archivo PDF sin mayor problema.

Ahora tendré que leer un poco más sobre GraphicsMagick, suena muy interesante. 🙂