sabato 17 novembre 2007

Un insieme di jpg in un unico PDF

Si parla di archiviazione ottica, e quando il cliente mi ha sottoposto il problema lo ho considerato una sfida, ma subito Ubuntu, i forum e qualche ricerca con Google mi hanno aiutato.
Il problema e' il seguente: abbiamo un certo numero di cartelle (diciamo... per valori estremamente grandi di "un certo numero"), ognuna contenente dei files .jpg, le scansioni numerate di documenti cartacei particolarmente corposi; ad esempio nella cartella "Manuale" ci sono le scansioni di un manuale di un qualche componente elettronico, 194 pagine perfettamente scansionate, tutte alla stessa risoluzione, e numerate da 001.jpg a 194.jpg.
Per una questione di comodita' si vuole fare in modo che questa astrusa sequenza di file .jpg diventi un file .PDF per ogni cartella, ossia strizzare (metaforicamente, data la dimensione del file risultante) le 194 pagine dell'esempio in un unico file "Manuale.pdf".
L'ipotesi di importare le singole immagini su singole pagine sequenziali di un maxi-documento OpenOffice era quella originaria pensata, ma l'ipotesi e' crollata di fronte alla quantita' non indifferente di lavoro da porsi (qualcosa come 24mila e passa pagine...), ma poi le ricerche hanno dato i loro frutti, ecco come imitarmi quando puo' tornare utile: servono due utilita' ed un piccolo script bash.

Installate ImageMagick (ci serve l'utilita' convert) e un programma che si chiama pdftk (dalla sua pagina di manuale: "If PDF is electronic paper, then pdftk is an electronic staple-remover, hole-punch, binder, secret-decoder-ring, and X-Ray-glasses. Pdftk is a simple tool for doing everyday things with PDF documents."). Sotto Ubuntu Gutsy si risolve dando da shell
sudo apt-get install imagemagick pdftk
oppure selezionando i due pacchetti da Synaptic/Kynaptic/Adept.

A questo punto serve uno script, di cui questo e' un esempio:
#!/bin/sh
#
# Questo script, lanciato in una cartella che contiene una sequenza ordinata
# di files .jpg genera nella stessa cartella un file .pdf che rispetta la sequenza
#
# NOTA: non sono ammessi spazi nei nomi dei files!
# es. 001.jpg, 002.jpg va bene. "Pagina 001.jpg", "Pagina 002.jpg" no...
#
# Copyright by Grizzly aka Mirko Tuccitto [grizzly@g-sr.eu]
# This programme is free software released under the GNU General Public License v2.0

echo "Conversione delle singole immagini in un unico file .pdf"
echo

# Prima con convert/imagemagick crea un file .pdf per ogni file .jpg
for A in $(ls *.jpg); do
echo -n " > $A"
convert $A $A.pdf
echo ".pdf - ok!"
done

# Poi con pdftk giunta la sequenza di files .pdf in uno solo
echo
echo -n "Creazione di un unico file .pdf "

##### ATTENZIONE ALL'ESTENSIONE *MAIUSCOLA*
pdftk *.pdf cat output COMPLETO.PDF
##### NON CAMBIATE QUESTA RIGA A MENO DI NON COMMENTARE LA FASE DI RIMOZIONE!

echo "- ok!"

# Infine vengono rimossi i files .pdf intermedi
echo -n "Rimozione dei file .pdf intermedi "

##### ATTENZIONE ALL'ESTENSIONE *MINUSCOLA*
rm *.pdf
##### QUESTA FASE E' FACOLTATIVA

echo "- ok!"

# per una questione di pulizia
mv COMPLETO.PDF completo.pdf
Possono essere aggiunte diverse variazioni sul tema o diverse modifiche al codice sorgente, ma a grandi linee con questa procedura abbiamo concluso il lavoro suddividendolo su due PC ed in circa quattro ore (wow!)

A proposito: il visualizzatore di documenti Evince apre i files .pdf anche se sono compressi con gzip o bzip2... ((-:

3 commenti:

Anonimo ha detto...

Il Doctor Evil ne trae insegnamento.

Francesco ha detto...

Complimenti per la meticolosita' dell'articolo!
Uno script vale piu' di mille parole :D
Comunque, a parte gli scherzi, dovremmo fare tutti cosi', le conoscenze vanno condivise. Si ci potrebbe tirar su un bel blog dedicato.

Alla prox ;)

Grizzly ha detto...

Beh, questo e' il primo di diversi articoli che seguiranno su tutta una serie di situazioni a cui sto lavorando (-: