Come promesso un paio di post fa sono a pubblicare il lavoro fatto per la creazione di una "Smart Folder" per la creazione automatica di documenti PDF abilitati alla ricerca "full text" a partire da pdf che contengono solamente l'immagine della scansione.
Questo post non vuole essere un HOWTO di tipo "copia e incolla" anche se cercherò di essere il più preciso possibile, bensì una traccia per colui che è interessato all'argomento e alla creazione in generale di Cartelle attive.
Gli ingredienti che userò sono:
- un computer (fisico o virtuale non importa) con linux -- io ho provato la soluzione con Ubuntu 12.04 LTS sia 32 che 64 bit;
- il software di manipolazione delle immagini imagemagick
- il software di manipolazione dei pdf pdftk
- il software di manipolazione delle scansioni unpaper
- altro software per la manipolazione delle immagini exactimage
- il software di OCR cuneiform
- il software incron (per il monitoraggio del filesystem)
- opzionale il software sendxmpp per la messaggistica
L'idea è la seguente: creare una cartella in cui "deporre" un file pdf uscito da una scansione piuttosto brutale e ripulirlo, farlo passare al vaglio di un OCR, quindi ricreare un pdf che contenga l'immagine alla quale viene associato "sotto e nascosto" il testo riconosciuto dall'OCR possibilmente secondo la stessa disposizione. In questo modo quando si cercherà una parola nel pdf, questa verrà evidenziata nel punto giusto.
Cominciamo.
Per prima cosa ho utilizzato tutti e soli pacchetti presenti nei repository ufficiali della distribuzione Ubuntu 12.04 LTS, quindi sussi i pacchetti sopra elencati sono stati installati mediante apt-get
sudo apt-get install imagemagick pdftk unpaper exactimage cuneiform incron sendxmpp
Creare una cartella destinata alla conversione:
mkdir ~/OCR
mkdir ~/OCR/lavoro
mkdir ~/OCR/fatti
Salvare il seguente script in una posizione adeguata (per esempio ~/bin/OCRPdf.sh)
#!/bin/bash
FILE=$1
WORK=$(date +"%H%M%S%N")
LASTFOUR=$(echo $FILE|sed 's/^.*\(....\)$/\1/')
if [ $LASTFOUR = ".pdf" ]; then
DIRECTORY=$(dirname "$FILE")
cd "$DIRECTORY"
mkdir ./lavoro/$WORK
cp "$FILE" ./lavoro/$WORK/
cd lavoro/$WORK/
pdfimages "$FILE" images
for i in $(ls images-*); do
LARG=$(identify -format "%[fx:w]" $i)
ALTE=$(identify -format "%[fx:h]" $i)
if [ "$LARG" -gt "$ALTE" ]; then
convert $i -rotate -90 $i
fi
unpaper --overwrite $i $i
cuneiform -l ita -f hocr -o $i.hocr $i
hocr2pdf -i $i -o $i-ocr.pdf < $i.hocr
done
pdftk images-*-ocr.pdf cat output "$FILE"
mv "$FILE" ../../fatti/
cd ..
rm -rf $WORK
echo "OPERAZIONE OCR-PDF terminata sul file $(basename "$FILE"). Verificare il risultato in $DIRECTORY/fatti"|sendxmpp -t -u mionomeutentegmail -o gmail.com mionomeutentegmail
fi
creare il file
~/.sendxmpprc
per configurare l'invio delle notifiche via google talk e inserire una riga analoga alla seguente:
mioutentegmail@gmail.com;talk.google.com miapasswordgmail
naturalmente sostituento mionomeutentegmail e miapasswordgmail con i valori oportuni.
Cambiare i diritti del file così che altri non possano accedere alla password:
chmod 600 ~/ .sendxmpprc
Abilitare il proprio utente a usare incron aggiungendo una riga nel file
/etc/incron.allow
riportando il proprio username
aggiungere il proprio utente al gruppo incron:
usermod -a -G incron miousername
Attivare il monitoraggio della cartella ~/OCR mediante il comando
incrontab -e
creare una riga analoga alla seguente:
~/OCR IN_CREATE,IN_MOVED_TO ~/bin/OCRPdf.sh $@/$#
Il gioco è fatto: mettete un pdf "grezzo" nella cartella OCR e questo verrà masticato, digerito e quindi messo una volta trasformato nella cartella fatti dentro a OCR. Se tutto è stato configurato bene vi arriverà un messaggio su google talk!
Un suggerimento:
Se si unisce questa soluzione al fatto che la cartella monitorata sia tra quelle di Dropbox e che Dropbox sia tenuto sempre online tramite dropbox.py che non necessita di avere effettuato la login grafica per rimanere online si otterrà un sistema remoto di ocr via rete tutto personale!
Questo post è stato scritto un po' troppo in fretta per essere perfetto. Prego chi lo utilizzasse di inserire commenti così che possa correggere eventuali imprecisioni.