martedì 28 agosto 2012

Creazione di una "Cartella attiva" per la conversione delle scansioni in PDF con OCR

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.


sabato 25 agosto 2012

Suggerimenti per una buona installazione base di un server Ubuntu


  1. Installare Ubuntu 12.04 Server (x64) sulla macchina virtuale o fisica. Quando richiesto verso la fine della installazione assicurarsi di selezionare OpenSSH se si vuole o si ha bisogno di connettersi in remoto al sistema.
  2. Una volta finito fare log in e aggiornare il software:

    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo apt-get dist-upgrade

  3. Installiamo etckeeper to per aiutarci a tenere traccia dei cambiamenti in etc, per questo eseguire:

    $ sudo apt-get install git etckeeper chkconfig

    Correggiamo la configurazione in /etc/etckeeper/etckeeper.conf in modo che funzioni con git:

    $ sudo vim /etc/etckeeper/etckeeper.conf

    Decommentare la linea git e commentare la linea bzr. Salvare e avviare:

    $ sudo etckeeper init
    $ sudo etckeeper commit "Baseline"

    Adesso etckeeper ha impostato un cronjob che parte quotidianamente e fa un auto-commit di qualsiasi modifica effettuata nella directory /etc.
  4. Poiché si tratta di un server è probabile che si voglia dare un IP statico, invece del default che imposta l'installazione che è tramite DHCP. Per questo editiamo /etc/network/interfaces.  Nell esempio usiamo un IP di 172.16.10.112 da sostituire con quello desiderato. $ sudo vim /etc/network/interfaces
    Supponendo che la scheda di rete sia riconosciuta come eth0, cambiare:
    iface eth0 inet dhcp
    In:

    iface eth0 inet static
    address 172.16.10.112
    netmask 255.255.255.0
    network 172.16.0.0
    broadcast 172.16.255.255
    gateway 172.16.10.20
    dns-nameservers 172.167.10.1 172.16.10.11
    dns-search domain.local

    Naturalmente cambiare i valori adattandosi alla LAN.Inoltre assicurarsi di inserire i valori giusti per i server DNS. Attenzione che il modo di indicare i DNS è cambiato dalla versione 12.10 per gli IP statici, quando si disabilita il lookup DHCP, questo significa che il file resolv.confrisulterà vuoto a ogni riavvio . La cosa più semplice è di aggiungere il prefisso “dns-” nelle linee di configurazione come indicato nell'esempio.
  5. Infine riavviare il servizio di rete:

    $ sudo /etc/init.d/networking restart
  6. Una grossa comodità nella history dei comandi avere anche data e ora dell'esecuzione del comando. Per fare questo è opportuno aggiungere una variabile di ambiente. Per questo editare il proprio file di configurazione della shell:

  7. $ vim ~/.bashrc

    e inserire la riga
    HISTTIMEFORMAT="%d/%m/%y %T "
    prima di
    HISTSIZE=2000
    HISTFILESIZE=4000

    Stessa cosa deve essere fatta per il file /etc/skel/.bashrc
    $ sudo vim /etc/skel/.bashrc
    e infine per l'utente root
    $ sudo su -
    # vim ~/.bashrc
    infine riavviare il server e goderselo!

incrontab ... black magic!!

Salve,
Era tanto che non scrivevo in questo blog. Sto postando solo per fare scoprire ai più curiosi un programma che può rivoluzionare con la sua semplicità l'uso di una macchina linux, soprattutto insieme a potenti strutture cloud come Dropbox.
La parola magica è "incrontab" la versione directory di crontab. Cioè esegue script configurati in modo simile a crontab ma su eventi di file in una cartella "osservata".

Appena ho un po' più di tempo vi scriverò come ho fatto sì che da uno smartphone si possa convertire una semplice scansione in pdf si possa ottenerne una versione con il testo ricercabile in pochi secondi, il tutto con una notifica via google talk quando l'operazione è finita.

Saluti a presto