Home > Guide > OCR su file PDF tramite script nautilus

OCR su file PDF tramite script nautilus

Nell’articolo Scansione testo con OCR su Linux, ho spiegato come effettuare l’acquisizione di testo OCR direttamente al termine di una scansione effettuata con l’applicativo XSane, sfruttando ImageMagick e Tesseract. In Ubuntu 10.04 il software predefinito per la scansione è il nuovo Simple Scan, ottimo dal punto di vista della semplicità e della velocità d’uso, ma come ci si poteva aspettare, carente di funzionalità OCR. Peraltro Simple Scan consente di salvare le scansioni multipagina in formato PDF, e non TIFF, richiedendo di conseguenza la conversione a quest’ultimo formato per la maggior parte degli applicativi OCR gratuiti.

Con questo articolo, vedremo come creare uno “script nautilus“, cioè una sequenza di comandi richiamabile dal menu contestuale di Nautilus, cioè il tasto destro su un file o una cartella.

Nel menu vengono elencati tutti i file eseguibili presenti nella cartella nascosta .gnome2/nautilus-scripts dell’utente. Dopo aver aperto la propria Cartella home, attivare dal menu Visualizza la voce Mostra file nascosti, aprire quindi la cartella .gnome2, e al suo interno nautilus-scripts.

Creare un file vuoto (tasto destro > Crea documento > File vuoto), modificarlo nell’editor di testo inserendo lo script. Infine per renderlo eseguibile, accedere alle proprietà del file (tasto destro > Proprietà) e nella scheda Permessi attivare l’opzione Consentire l’esecuzione del file come programma.

Tornando allo script oggetto di questo articolo, esso richiede i pacchetti: imagemagick, tesseract-ocr, tesseract-ocr-ita (per il dizionario parole italiano), installabili quindi tramite il comando:

sudo apt-get install imagemagick tesseract-ocr tesseract-ocr-ita

Lo script nautilus da creare nella cartella .gnome2/nautilus-scripts, a cui io ho dato il nome “Scansione OCR” è il seguente:

#!/bin/sh
for arg
do
 if [ ${arg##*.} = "pdf" ]
 then
 convert -colorspace rgb -density 500 "$arg" -resize 50% -monochrome -median 1 /tmp/scansione_ocr_tmp.tif | zenity --progress --pulsate --text="Conversione in TIFF in corso..." --auto-close
 tesseract /tmp/scansione_ocr_tmp.tif "$arg".txt -l ita  | zenity --progress --pulsate --text="Acquisizione OCR in corso..." --auto-close
 rm /tmp/scansione_ocr_tmp.tif
 else
 tesseract "$arg" "$arg".txt -l ita  | zenity --progress --pulsate --text="Acquisizione OCR in corso..." --auto-close
 fi
done

Lo script completo è scaricabile a questo indirizzo: http://paste.ubuntu.com/8091658/

Funzionamento: lo script esegue anzitutto un controllo sull’estensione del file; se è PDF esegue la conversione in formato TIFF, nella cartella temporanea /tmp, lancia l’acquisizione OCR, quindi elimina il file TIFF temporaneo; se è un formato diverso (es. è già TIF), avvia direttamente l’acquisizione OCR.

La conversione PDF > TIFF viene eseguita tramite il comando convert della libreria ImageMagick; tra le opzioni ho specificato -monochrome, per ottenere un TIFF in bianco/nero (più facile da elaborare) e -median 1, per pulire l’immagine dalle imperfezioni tramite il Median Filter. I più esperti di ImageMagick, potranno arricchire il comando con ulteriori perfezionamenti.

L’acquisizione OCR genera quindi il testo in un file nella stessa cartella del PDF sorgente, chiamato <nomefilesorgente>.txt.

Infine, i comandi zenity servono per ottenere a video una finestra che indica lo stato dell’operazione.

Penso che questo script possa essere utile, sicuramente si più migliorare e perfezionare, ma semplifica il procedimento di acquisizione OCR, che il Linux resta un “punto critico”.


Aggiornamento 17/01/2015: i parametri precedente utilizzati per la conversione in TIFF, sembrano non andare più bene alla libreria Tesseract. Prendendo spunto dall’articolo “Using Tesseract OCR with PDF scans” ho quindi modificato lo script, rimuovendo -colorspace rgb e -monochrome, e aggiungendo -depth 8; inoltre ho modificato i DPI (density) a 300.

Lo script aggiornato è scaricabile a questo indirizzo: http://paste.ubuntu.com/9769367/

Categorie:Guide Tag:, , , ,
  1. lollox
    17/06/2010 alle 16:36

    Uso Lucid con Kernel 2.6.32.22-generic.

    Ho installato i pacchetti indicati e scaricato lo script già pronto. Ho quindi estratto lo script in ~/.gnome2/nautilus-scripts ed ho provato a fare ocr di un file pdf, ma senza avere nessun risultato: unico segno di vita una finestra che per un po’ (ma senza visualizzare alcuna barra di avanzamento) comunica: “Conversione TIFF in corso…” per poi sparire senza lasciare traccia.

    Dove ho sbagliato?

    ciao

    • 17/06/2010 alle 20:48

      Ciao, anzitutto la barra di avanzamento è normale che non scorra, è solo un indicatore! Allora per capire dove sta il problema prova ad aprire il lanciare a mano i comandi, sostituendo $arg con il percorso al file PDF da scansionare. Togli pure gli avvisi con zenity. Esempio:

      convert -colorspace rgb -density 500 ~/Documenti/prova.pdf -resize 50% -monochrome -median 1 /tmp/scansione_ocr_tmp.tif
      tesseract /tmp/scansione_ocr_tmp.tif ~/Documenti/prova.pdf.txt -l ita
      rm /tmp/scansione_ocr_tmp.tif

      Vedi quindi se ti dà qualche errore… buona fortuna🙂

  2. lollox
    18/06/2010 alle 10:02

    Il primo comando ( convert -colorspace rgb -density 500 ~/Scrivania/testo.pdf -resize 50% -monochrome -median 1 /tmp/scansione_ocr_tmp.tif ) non restitiusice nessun output.

    Il secondo comando ( tesseract /tmp/scansione_ocr_tmp.tif ~/Scrivania/testo.pdf.txt -l ita ) invece restituisce il seguente messaggio di output con l’errore:

    Tesseract Open Source OCR Engine
    check_legal_image_size:Error:Only 1,2,4,5,6,8 bpp are supported:16
    Segmentation fault

    • 19/06/2010 alle 09:48

      Mi sa che è un bug di Tesseract… verifica di avere l’ultima versione (2.04). Verifica anche il TIFF in /tmp/ sia effettivamente stato creato in bianco e nero, strano che ti rilevi 16bpp

  3. lollox
    20/06/2010 alle 13:04

    la versione è la 2.04 (l’ultima disponibile per ubuntu) il file viene creato (/tmp/scansione_ocr_tmp.tif).

  4. lollox
    20/06/2010 alle 13:38

    Ho visto che aprendo il file con gimp lo modifica in 8bpp e quindi poi il riconoscimento ocr con tesseract funziona correttamente. Forse, quindi, c’è da inserire un parametro nel primo comando (convert -colorspace rgb -density 500 ~/Scrivania/testo.pdf -resize 50% -monochrome -median 1 /tmp/scansione_ocr_tmp) per indicare di convertire in immagine tiff a 8bpp oppure usare un comando intermedio che operi questa conversioneprima di eseguire tesseract…

  5. vaquerito
    01/10/2010 alle 14:07

    con questo puoi passare sia un pdf che una qualunque immagine,anche piu file, e ottenere la conversione.

    funziona anche se lo assegni ad una nautilus-action.

    Non mi èancora chiaro se tesseract funzioni meglio da immagini a colori o in scala di grigi, ho avuto risultati alterni

    #!/bin/sh
    tmp_file=”/tmp/tmpscan01.tif”

    ocr_wait(){
    zenity –progress –pulsate –text=”Conversione in TIFF in corso…” –auto-close
    }

    function ocr(){
    arg=”$1″
    tesseract “$tmp_file” “$arg” -l ita | zenity –progress –pulsate –text=”Acquisizione OCR in corso…” –auto-close
    rm $tmp_file
    }

    for arg
    do
    if [ ${arg##*.} = “tif” ];then
    ocr “$arg”
    else if [ ${arg##*.} = “pdf” ];then
    convert -colorspace rgb -density 500 “$arg” -resize 50% -monochrome -median 1 $tmp_file | ocr_wait
    ocr “$arg”
    else
    convert “$arg” $tmp_file | ocr_wait
    ocr “$arg”
    fi
    fi
    done

  6. asa
    08/08/2011 alle 14:45

    ciao, avrei bisogno di una mano e di prgrammazione sò ben poco.
    il mio problema è il seguente: ho delle dir e sotto dir che all’interno contegono dei pdf che però non hanno l estensione .pdf (anche se lo sono) come è possibile modificare lo script in modo che lanciando lo script dalla dir principale mi passi tutti i file sotto l’ocr e li risalvi con lostesso nome che hanno, i vari file, ma con dentro il testo trovato dall’ocr?

    • 09/08/2011 alle 21:08

      Ciao, puoi provare con questo codice, che converte comunque sempre in TIFF e dopo aver salvato il testo lo rinomina nel file originale:

      #!/bin/sh
      for arg
      do
      convert -colorspace rgb -density 500 “$arg” -resize 50% -monochrome -median 1 /tmp/scansione_ocr_tmp.tif | zenity –progress –pulsate –text=”Conversione in TIFF in corso…” –auto-close
      tesseract /tmp/scansione_ocr_tmp.tif “$arg”.txt -l ita | zenity –progress –pulsate –text=”Acquisizione OCR in corso…” –auto-close
      rm /tmp/scansione_ocr_tmp.tif
      rm “$arg”
      mv “$arg”.txt “$arg”
      done

  1. No trackbacks yet.

Lascia un commento

Effettua il login con uno di questi metodi per inviare il tuo commento:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: