Tesseract OCR per PDF
e PDF ricercabili.
La guida completa e testata all'OCR dei PDF con Tesseract: rasterizzare le pagine, creare PDF ricercabili, usare OCRmyPDF e pdfsandwich, eseguirlo end-to-end in Python e correggere gli errori più comuni.
In breve (un comando)
Per un PDF multipagina reale, OCRmyPDF è la via più rapida.
pip install ocrmypdf # oppure: apt install ocrmypdf
ocrmypdf input.pdf output.pdfNiente OCRmyPDF? Rasterizza e usa la CLI di Tesseract direttamente — vedi sotto.
Perché i PDF devono essere rasterizzati
Tesseract riconosce immagini, non contenitori PDF.
Un PDF è un contenitore: può includere testo vettoriale, font incorporati o immagini di pagine scansionate. Tesseract legge immagini raster (TIFF, PNG, JPEG, WebP…), quindi le pagine devono prima essere convertite in immagini. Scegli il rasterizzatore in base a ciò che hai installato:
| Strumento | Installazione | Note |
|---|---|---|
pdftoppm (poppler) | apt install poppler-utils | Veloce, scriptabile, la scelta classica |
pdftocairo (poppler) | poppler-utils | Simile a pdftoppm, output Cairo |
| ImageMagick | apt install imagemagick | convert -density 300 in.pdf out.tif |
| PyMuPDF | pip install pymupdf | Python puro, senza binari esterni |
| pdf2image | pip install pdf2image | Wrapper Python su poppler |
# PDF -> un PNG per pagina a 300 DPI
pdftoppm -png -r 300 input.pdf paginaIl DPI è il più importante: 300 DPI è il compromesso standard; 600 DPI per font piccoli o archiviazione; evita sotto i 200 DPI.
Creare un PDF ricercabile con la CLI di Tesseract
Un'immagine diventa una pagina PDF ricercabile con la configurazione di output pdf.
# Immagine -> PDF ricercabile
tesseract pagina-1.png output pdf
# Solo livello di testo (senza immagine visibile)
tesseract scansione.png output textonly_pdf
# Più pagine in un PDF: passa una lista di immagini
tesseract listaimmagini.txt output pdfPer un PDF multipagina, metti ogni percorso immagine su una riga in listaimmagini.txt. Riferimento completo dei formati: documentazione.
Metodo B — OCRmyPDF (consigliato per PDF reali)
OCRmyPDF gestisce rasterizzazione, OCR, raddrizzamento, rotazione e livello di testo invisibile in un comando.
ocrmypdf input.pdf output.pdf # base
ocrmypdf -l eng+ita input.pdf output.pdf # lingue
ocrmypdf --deskew --rotate-pages input.pdf output.pdf
ocrmypdf --optimize 2 input.pdf output.pdf # riduce il file
ocrmypdf --skip-text input.pdf output.pdf # mantiene le pagine con testoOCRmyPDF usa Tesseract e richiede Ghostscript e gli strumenti poppler. Opzioni utili: --force-ocr, --redo-ocr, --pages 1-10.
Metodo C — pdfsandwich
Un wrapper più leggero che aggiunge un livello di testo e applica preprocessamento come il raddrizzamento.
pdfsandwich scansione.pdf # genera scansione_ocr.pdf
pdfsandwich -lang eng+ita scansione.pdfMetodo D — Python end-to-end
Usa pdf2image per rasterizzare e pytesseract per costruire il PDF ricercabile, poi unisci con pypdf.
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader
pages = convert_from_path("input.pdf", dpi=300) # richiede poppler
writer = PdfWriter()
for page in pages:
pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf", lang="ita")
writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("output.pdf", "wb") as f:
writer.write(f)Su Windows, passa la cartella bin di poppler con poppler_path=. Più dettagli nella guida pytesseract.
Quale metodo usare?
| Metodo | Ideale per | Configurazione | Multipagina |
|---|---|---|---|
| OCRmyPDF | PDF reali, automazione | Ghostscript + poppler | Sì, in un comando |
| pdfsandwich | Livello di testo rapido con preprocessamento | poppler + ImageMagick | Sì |
| CLI di Tesseract | Immagini o liste di immagini | Solo Tesseract | Con una lista di immagini |
| Python (pdf2image) | Pipeline e logica personalizzata | poppler + pytesseract | Ciclo e unione |
Fedeltà del layout e sovrapposizione del testo
Perché i PDF ricercabili a volte sembrano disallineati e come mantenere la geometria.
- Il livello di testo invisibile è posizionato usando i riquadri delle parole dell'OCR; con un DPI errato la sovrapposizione può spostarsi.
- Usa l'output
hOCRoALTOquando servono coordinate esatte per evidenziazione o archiviazione. pdftoppm -r 300e la stessa dimensione di pagina mantengono la sovrapposizione allineata.- Per layout complessi, preferisci OCRmyPDF, che conserva l'immagine originale e aggiunge il livello sul posto.
Qualità e prestazioni
- DPI: 300 standard, 600 per font piccoli o archiviazione.
- Intervalli di pagine: elabora solo il necessario (
--pagesin OCRmyPDF). - Parallelismo: OCR delle pagine in parallelo e poi unione.
- Dimensione:
--optimize/ compressione JPEG, o riduci il DPI dopo l'OCR. - Preprocessamento: raddrizza e riduci il rumore prima dell'OCR.
Risoluzione dei problemi
| Sintomo | Causa | Soluzione |
|---|---|---|
Unable to get page count. Is poppler installed? | pdf2image non trova poppler | Installa poppler-utils o imposta poppler_path su Windows. |
| Il PDF di output non ha testo ricercabile | L'OCR non è stato eseguito o lingua errata | Verifica il successo e imposta -l/--language sulla lingua del documento. |
| La sovrapposizione del testo è disallineata | DPI o dimensione pagina errati | Rasterizza a 300 DPI con la dimensione originale. |
| Il file di output è enorme | Immagini senza perdita a 600 DPI | Usa --optimize / JPEG, o riduci il DPI. |
| Un PDF protetto da password fallisce | Input cifrato | Decifra prima o passa la password se lo strumento lo supporta. |
FAQ PDF
Come rendo un PDF ricercabile?
Usa ocrmypdf input.pdf output.pdf, oppure rasterizza le pagine ed esegui tesseract pagina.tif output pdf.
Perché Tesseract non legge un PDF direttamente?
Tesseract riconosce immagini raster, quindi le pagine del PDF devono prima essere convertite in immagini.
Quale DPI devo usare?
300 DPI per la maggior parte dei documenti; 600 DPI per font piccoli o archiviazione.
Posso applicare OCR a un PDF in Python?
Sì — usa pdf2image con poppler e pytesseract.image_to_pdf_or_hocr, poi unisci le pagine con pypdf.
Come mantengo il layout preciso?
Usa la stessa dimensione e DPI originali e preferisci OCRmyPDF, che conserva l'immagine e aggiunge il livello di testo sopra.