OCRmyPDF: guida completa per convertire scansioni in PDF/A ricercabili con estrazione sidecar e batch processing
OCRmyPDF è uno strumento open source che prende un documento scansionato — una semplice immagine — e lo trasforma in un PDF/A ricercabile, con un livello di testo invisibile posizionato con precisione sotto l’immagine originale. In pratica: apri il file, selezioni le parole, copi il testo, fai ricerca full-text su migliaia di pagine. Funziona.
Il tutorial seguente costruisce un workflow completo, partendo dall’installazione delle dipendenze fino al batch processing di decine di PDF. Usiamo una scansione sintetica generata al volo per testare tutto senza sporcarci le mani con file reali.
Installazione delle dipendenze di sistema
Su Ubuntu o Google Colab servono alcuni pacchetti di sistema. Il cuore del riconoscimento è Tesseract, il motore OCR open source sviluppato da Google. Poi servono Ghostscript (per la gestione dei PDF), unpaper (pulizia delle scansioni), pngquant (compressione immagini), poppler-utils (manipolazione PDF) e qpdf (controllo qualità).
La funzione install_dependencies() elenca e installa tutto automaticamente:
- tesseract-ocr con i modelli per inglese, tedesco e francese
- ghostscript, unpaper, pngquant
- poppler-utils e qpdf
- Python: ocrmypdf, img2pdf e Pillow (versione <12 per compatibilità)
Opzionale ma consigliato: jbig2enc, un codificatore JBIG2 che riduce la dimensione dei PDF contenenti scansioni in bianco e nero. Il build script lo compila da sorgente se non è già presente nel sistema.
Generazione di una scansione sintetica
Per testare OCRmyPDF senza dover trovare un documento scannerizzato, il tutorial genera direttamente un PDF immagine partendo da testo campione. Usa Pillow per disegnare tre pagine A4 a 200 DPI con caratteri DejaVu Sans. Le pagine includono:
- Testo normale — una spiegazione dell’OCR
- Testo con dati numerici — una pagina che riporta statistiche d’archivio (1.482 pagine, 92% scansite a 200-300 DPI)
- Testo descrittivo sul risultato finale del processo
Per simulare una scansione reale, la funzione render_page() aggiunge una leggera sfocatura gaussiana (GaussianBlur(0.6)), una rotazione di 6 gradi sulla seconda pagina (tipico errore di alimentazione documenti) e 6.000 punti scuri casuali per imitare il rumore del sensore. Il risultato è un PDF che sembra uscito da uno scanner consumer — e che mette alla prova la capacità di OCRmyPDF di raddrizzare, pulire e riconoscere.
Esecuzione dell’OCR con OCRmyPDF
Il cuore del sistema è la funzione do_ocr(), un wrapper attorno a ocrmypdf.ocr() che disabilita la progress bar e cronometra l’esecuzione. La chiamata base è semplicissima:
ocrmypdf.ocr('input.pdf', 'output.pdf')
Ma il tutorial mostra come sfruttare parametri più avanzati:
- –output-type pdfa — genera un PDF/A-3b conforme allo standard ISO per l’archiviazione a lungo termine
- –sidecar output.txt — estrae il testo riconosciuto in un file esterno, utile per indicizzazione o analisi automatiche
- –deskew — raddrizza automaticamente le pagine ruotate (funziona sulle nostre pagine con rotazione di 6°)
- –clean — applica un filtro di rimozione rumore (utile per le macchie simulate)
- –skip-text — se il PDF ha già un livello di testo, lo lascia intatto e non rifà l’OCR
- –force-ocr — sostituisce qualsiasi livello di testo esistente con una nuova scansione OCR
- –tesseract-config — passa configurazioni personalizzate (es.
tesseract_config='--oem 1'per usare solo il motore LSTM)
Il tutorial include anche la verifica della conformità PDF/A tramite file_claims_pdfa() (controlla l’intestazione XMP) e il confronto dimensioni dei file prima e dopo l’OCR.
Batch processing: OCR su più PDF
La parte finale del workflow gestisce l’elaborazione di una cartella di PDF con pattern *.pdf. Per ogni file:
- Viene eseguito l’OCR con output in una cartella parallela
ocr/ - Il testo viene estratto in sidecar
.txt - Viene verificata la validità del PDF risultante con
check_pdf() - Vengono stampati i tempi e le dimensioni per ogni file
Il batch usa subprocess per lanciare OCRmyPDF da riga di comando, con un timeout configurabile per evitare che un PDF corrotto blocchi tutta la coda.
Cosa cambia per chi lavora con documenti digitalizzati
Se gestisci archivi di documenti cartacei scannerizzati, OCRmyPDF risolve il problema principale: le scansioni non sono ricercabili. Con questo workflow:
- Trasformi centinaia di pagine in PDF/A standard, validi per archiviazione legale
- Estrai il testo automaticamente (sidecar) per indicizzarlo in ElasticSearch, Solr o un database SQL
- Pulisci scansioni rumorose e raddrizzi pagine storte senza intervento manuale
- Processi intere cartelle in batch, schedulabili con cron
Il codice completo del tutorial è disponibile nel repository e funziona su qualsiasi sistema Linux con Python 3.8+.
