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:
- Transformar varios jpg a un sólo pdf
- Idear un sistema que fuera automatizado para no tener que ir directorio por directorio
- 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 FOLDE
R.
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:
- Help with batch JPG to PDF script | Vía Ubuntu Forums
xD
viste que no es dificil programar :p
;)
el otro dia tambien me puse a experimentar con bash, es entrete ;)
pero lamentablemente debo hacerlo en vb.net…
saludos!!
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Jorge: Que bueno que te haya servido! :).
Angelo: Sip, tienes razón, lo acabo de arreglar =P.
Me gustaMe gusta
¡Excelente!
Me gustaMe gusta
excelente aporte.
Me gustaMe gusta
gracias, che.
Me gustaMe gusta
gracias me sacaste de un apuro, lo malo es que es muy lento
Me gustaMe gusta
Muy útil, gracias.
Me gustaMe gusta