Transformar jpg a pdf en distintos directorios

Encontrábame en la siguiente situación: tenía varios directorios con archivos de imágenes y necesitaba transformar todas las imágenes de cada directorio en un documento pdf. Para ejemplificar un poco mejor:

~/varios/trabajo1

01.jpg, 02.jpg, 03.jpg .... 50.jpg

~/varios/trabajo2

01.jpg, 02.jpg, 03.jpg .... 50.jpg

~/varios/trabajo3

01.jpg, 02.jpg, 03.jpg .... 50.jpg

En esta situación me enfrentaba a varios obstáculos:

  1. Transformar varios jpg a un sólo pdf
  2. Idear un sistema que fuera automatizado para no tener que ir directorio por directorio
  3. Luego de terminado el proceso, también de forma automatizada mover todos los pdf generados a un directorio aparte (~/varios/pdf)

Vamos por parte como dijo el cirujano:

1. jpeg > pdf

Luego de investigar un poco, di con la solución de este punto imagemagick, un set de aplicaciones para manipular varios formatos de imágenes – lo mejor- desde la línea de comandos.

¡Y lo digo en serio!

Ok, primero en caso de no tener instalada la aplicación, lo podemos hacer vía Synaptic o la línea de comandos:

sudo apt-get install imagemagick

Bueno, nos vamos a nuestra primera carpeta llena de jpgs y comenzamos:

convert -verbose *.jpg salida.pdf

Como vemos, la sintaxis es sencilla, los archivos de ingreso, en este caso serían todos (*) los archivos que terminen en .jpg se transformen en un pdf de nombre salida.pdf.

En mi caso, este proceso consumía el 100% de la CPU, por suerte se puede detener con Ctrl + Z que devuelve el control, y pueden reanudarlo con fg.

Luego de un rato, tendremos nuestro pdf.

2. Automatización

Todo bien, tengo lo que quería, pero necesito hacer lo mismo en varios directorios. Para ello necesitamos aprender sobre algunos comandos básicos y algo de scripting en bash. Bueno pues, así creamos un documento sencillo en el directorio base (en mi ejemplo en ~/varios) con lo siguiente:


#!/bin/bash

find -type d | while read FOLDER ; do
FILE=$(basename "${FOLDER}")
convert -verbose "${FOLDER}"/*.jpg ./pdf/"${FILE}.pdf"
done

Nota: Para el coloreado de sintaxis tuve que utilizar la de python, ya que el shortcode de wordpress.com no tiene bash ¬¬.

Podría bastar sólo con eso, pero la idea es enseñar a pescar ;). Vamos analizando cada línea:

#!/bin/bash

La primera línea cumple la función de indicarle al intérprete que vamos a utilizar el shell bash.

find -type d | while read FOLDER ; do

Como bien indica su nombre, el comando find es para buscar, asociado al parámetro -type, especificamos que tipo de ‘archivo’ específico buscamos, en nuestro caso utilizamos la d, que son los directorios. Luego tenemos una tubería (|), es decir, que el resultado del primer comando pase a lo que está a continuación de la barra vertical. Lo que para resumir significa que la salida de la búsqueda con find se almacenará en la variable FOLDER.

Como necesitamos que el proceso se haga iterativo, invocamos a while:

while read FOLDER ; do

Agregamos el parámetro read para asegurarnos que lo que revise sea línea por línea (fíjense como muestra la salida find). Nuestra condición será mientras exista la variable FOLDER (dado que es el resultado de find, y se supone, que no tienes infinitos directorios, el resultado no será infinita)…

FILE=$(basename "${FOLDER}")

Ahora creamos una variable FILE que será el nombre que tendrá nuestro pdf final, para mi caso particular lo más conveniente era que éste tuviese el mismo nombre que la carpeta que lo contiene (es decir si el directorio es foo y transformo todos los jpg en pdf, éste también se llamará foo; foo.pdf). Las dobles comillas son para no tener problemas en caso de que algún directorio contenga espacios.

convert -verbose "${FOLDER}"/*.jpg ./pdf/"${FILE}.pdf"

Esta vendría siendo la línea más importante, como vemos es bastante similar a lo que vimos en el primer punto, para comprender la vamos a dividir para observarla con más detalle:

convert -verbose

Que muestre la salida por la pantalla, nada del otro mundo.

"${FOLDER}"/*.jpg

Todos los archivos jpg dentro de la variable FOLDER, es decir, la salida de find, lo que significa que son todos los subdirectorios con las imágenes en cuestión.

./pdf/"${FILE}.pdf"

Se transformen en un archivo de nombre FILE.pdf, donde FILE es, como definimos anteriormente, el nombre de la carpeta que contiene las imágenes. Si se fijan con cuidado, verán que el archivo de salida, ya lo estoy guardando en una carpeta de nombre pdf que se encuentra dentro del directorio de donde estoy ejectuando el script.

done

Cuando el contenido de FOLDER se acaba, el script finaliza.

Si quisiéramos resumir el script y traducirlo a español sería algo así como:

Busca todos los directorios (find), ingrésalos en la variable FOLDER, mientras hayan datos en la variable convierte todos los archivos .jpg del directorio obtenido en la búsqueda en un pdf y guárdalo en otro directorio con el nombre FILE.pdf, que viene siendo el nombre de la carpeta que contenía los jpgs. Cuando se acaben los directorios a revisar, termina el bucle.

Para ir terminando, guardamos nuestro documento, le damos permiso de ejecución (chmod +x nombre) y luego lo ejecutamos (./nombre).

Con eso debiésemos estar ok, obviamente todo esto podría resumirse a publicar el script, pero insisto, entender como funciona es muchísimo más útil.

Fuentes:

9 comentarios en “Transformar jpg a pdf en distintos directorios

  1. Excelente,…siempre convierto imágenes a pdf con este comando, pero no tenia ninguna solución para realizar esto por Directorios!.
    Este script se irá guardando en mis favoritos…
    Muy buen BLOG.
    Saludos,

    Me gusta

  2. por cierto… me acabo de dar cuenta de algo… lo que hiciste no es ‘renombrar’ los jpg a pdf, sino que crear un pdf a partir de los jpg

    ;)

    para que no se preste para futuras confusiones ;)

    sl2!

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .