Come estrarre testo da PDF con Python: 3 librerie a confronto
Estrarre testo da un PDF può sembrare semplice, ma chiunque abbia provato a farlo in Python sa che tra eccezioni, layout rotti e documenti ostinati basati su immagini le cose si complicano in fretta. Questa guida va dritta al punto: partiamo da un confronto rapido tra le migliori librerie Python per l’estrazione testo PDF, così puoi scegliere subito lo strumento giusto per il tuo progetto.

Poi vedremo esempi di codice con tre delle librerie più efficaci — PyPDF2, pdfplumber e PyMuPDF (Fitz) — coprendo tutto, dalla lettura di PDF semplici fino all’estrazione da tabelle complesse. Affronteremo anche il caso più difficile: i PDF scansionati che richiedono OCR, mostrando un approccio pratico per gestirli senza configurazioni locali complicate. Alla fine avrai sia il codice sia una strategia chiara per automatizzare i flussi di elaborazione PDF in modo affidabile.
Verdetto rapido: le migliori librerie Python per estrarre testo da PDF
Prima di passare al codice, ecco una panoramica ad alto livello delle opzioni principali. La scelta dipende soprattutto da ciò che ti serve davvero: velocità, semplicità oppure un’analisi precisa del layout.
| Libreria | Ideale per | Gestione layout/tabelle | Prestazioni | Facilità d’uso (1-5) |
|---|---|---|---|---|
| PyPDF2 | Documenti semplici solo testo; manipolazione PDF di base (unire/dividere) | Scarsa (estrae il flusso di testo, senza dati posizionali) | Media | 5 |
| pdfplumber | Estrarre dati da tabelle; documenti con layout strutturati | Eccellente (fornisce coordinate per testo, linee e rettangoli) | Più lenta | 4 |
| PyMuPDF (Fitz) | Elaborazione batch ad alta velocità; gestione di immagini e annotazioni | Buona (può estrarre testo con informazioni posizionali di base) | Eccellente (la più veloce) | 4 |
In sintesi: inizia con PyPDF2 per i casi più semplici. Passa a pdfplumber non appena compaiono tabelle. Scegli PyMuPDF quando la priorità è la velocità.
Prima di iniziare: configura l’ambiente Python
Per mantenere pulite le dipendenze del progetto ed evitare conflitti, lavora sempre dentro un ambiente virtuale. È una buona pratica fondamentale in qualsiasi progetto Python serio.
Ecco come configurarlo dal terminale:
- Crea un ambiente virtuale:
# Su macOS/Linux
python3 -m venv pdf_env
# Su Windows
python -m venv pdf_env
```
2. **Attivalo:**
```plaintext
# Su macOS/Linux
source pdf_env/bin/activate
# Su Windows
.\pdf_env\Scripts\activate
```
A questo punto il prompt del terminale dovrebbe mostrare `(pdf_env)`.
3. **Installa le librerie:** installeremo tutte e tre le librerie che stiamo confrontando, così potrai fare prove facilmente.
```plaintext
pip install pypdf2 pdfplumber pymupdf
```
Fatto questo, l’ambiente è pronto per gli esempi di codice qui sotto.
---
## Metodo 1: estrazione testo PDF di base con PyPDF2
PyPDF2 è una libreria di riferimento per le operazioni PDF fondamentali. È semplice da usare, esiste da tempo ed è perfetta per i PDF “nativi”, cioè quelli con testo selezionabile e non incorporato in un’immagine. Se devi leggere PDF in Python come report semplici, articoli o esportazioni testuali, PyPDF2 ti permette di ottenere il risultato con pochissimo codice.
Il limite principale? Legge il flusso di testo interno del PDF, che non sempre corrisponde all’ordine di lettura visivo, soprattutto nei layout a più colonne. Inoltre non riconosce le tabelle: tende semplicemente ad accorpare tutto il testo delle celle.
Ecco uno script semplice per estrarre tutto il testo da un PDF:
```python
# requisiti: pip install pypdf2
import PyPDF2
def extract_text_with_pypdf2(pdf_path):
"""
Estrae il testo da un file PDF usando la libreria PyPDF2.
Args:
pdf_path (str): Il percorso del file PDF.
Returns:
str: Il contenuto testuale estratto oppure un messaggio di errore.
"""
try:
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
print(f"Pagine totali: {num_pages}")
full_text = ""
for page_num in range(num_pages):
page = reader.pages[page_num]
full_text += page.extract_text() + "\n"
return full_text
except FileNotFoundError:
return f"Errore: il file in {pdf_path} non è stato trovato."
except Exception as e:
return f"Si è verificato un errore imprevisto: {e}"
# --- Esempio d'uso ---
pdf_file = 'path/to/your/document.pdf'
extracted_text = extract_text_with_pypdf2(pdf_file)
if "Error" not in extracted_text:
print("--- Testo estratto ---")
print(extracted_text)
else:
print(extracted_text)
Questo script funziona molto bene con testo semplice a colonna singola. Ma cosa succede se gli dai in input un bilancio con tabelle ben ordinate? Otterrai un insieme confuso di testo e numeri, senza struttura. Ed è qui che entra in gioco la prossima libreria.
Metodo 2: estrarre tabelle e gestire il layout con pdfplumber
Quando devi estrarre dati strutturati, pdfplumber è lo strumento giusto. Basato su pdfminer.six, è pensato per offrirti un accesso molto preciso alla geometria di una pagina PDF. "Vede" caratteri, linee e rettangoli, e include un ottimo metodo integrato per rilevare ed estrarre tabelle.
Per attività di data science e automazione aziendale, fa davvero la differenza. Pensa a quando devi estrarre i risultati trimestrali da un report PDF aziendale: con PyPDF2 diventa un incubo di parsing delle stringhe. Con pdfplumber, invece, puoi ottenere i dati come una lista di liste pulita, pronta da trasformare in un DataFrame Pandas.
Il motivo principale per cui pdfplumber supera PyPDF2 sui dati strutturati è che interpreta il layout visivo della pagina, non solo il flusso di testo grezzo. Riesce a capire che alcuni elementi testuali sono allineati in righe e colonne e separati da linee.
Ecco come estrarre tabelle da una pagina PDF:
# requisiti: pip install pdfplumber
import pdfplumber
import pandas as pd
def extract_tables_with_pdfplumber(pdf_path, page_number=0):
"""
Estrae tutte le tabelle da una pagina specifica di un PDF usando pdfplumber.
Args:
pdf_path (str): Il percorso del file PDF.
page_number (int): Il numero della pagina da cui estrarre le tabelle (indice a partire da 0).
Returns:
list of pandas.DataFrame: Una lista in cui ogni elemento è un DataFrame
che rappresenta una tabella trovata nella pagina.
"""
tables = []
try:
with pdfplumber.open(pdf_path) as pdf:
if page_number >= len(pdf.pages):
print(f"Errore: la pagina {page_number} è fuori intervallo. Il PDF ha {len(pdf.pages)} pagine.")
return tables
page = pdf.pages[page_number]
# .extract_tables() è il metodo chiave in questo caso
extracted_tables = page.extract_tables()
for table_data in extracted_tables:
# Converte la lista di liste in un DataFrame pandas
df = pd.DataFrame(table_data[1:], columns=table_data[0])
tables.append(df)
return tables
except FileNotFoundError:
print(f"Errore: il file in {pdf_path} non è stato trovato.")
return tables
except Exception as e:
print(f"Si è verificato un errore imprevisto: {e}")
return tables
# --- Esempio di utilizzo ---
# Per questo esempio ti serve pandas: pip install pandas
pdf_file_with_table = 'path/to/your/report.pdf'
all_tables = extract_tables_with_pdfplumber(pdf_file_with_table, page_number=0)
if all_tables:
print(f"Trovata/e {len(all_tables)} tabella/e nella pagina 0.")
for i, table_df in enumerate(all_tables):
print(f"\n--- Tabella {i+1} ---")
print(table_df)
else:
print("Nessuna tabella trovata nella pagina specificata.")
Il compromesso di questa precisione è la velocità. pdfplumber svolge più lavoro nell'analisi della pagina, quindi è naturalmente più lento delle librerie che si limitano a estrarre il testo.
Metodo 3: estrazione veloce con PyMuPDF (Fitz)
Quando devi elaborare centinaia o migliaia di PDF in poco tempo, le prestazioni diventano il fattore decisivo. È qui che PyMuPDF, che si importa come fitz, domina davvero. È un binding Python per MuPDF, una libreria C leggera, e proprio per questo risulta eccezionalmente veloce.
Una volta mi è capitato un progetto in cui dovevo processare alcune migliaia di documenti legali multipagina. In base alle stime iniziali, il mio script con pdfplumber avrebbe richiesto ore. Passando a PyMuPDF, il tempo di esecuzione è sceso a meno di 30 minuti. La differenza di velocità è davvero così netta.
Oltre alla velocità, PyMuPDF offre moltissime funzionalità. Può renderizzare le pagine come immagini, cosa fondamentale nei flussi OCR, estrarre immagini incorporate e gestire annotazioni. L'estrazione delle tabelle non è immediata come con pdfplumber, ma sulla pura estrazione del testo resta imbattibile.
Ecco l'equivalente con PyMuPDF per estrarre testo rapidamente:
# requisiti: pip install PyMuPDF
import fitz # La libreria PyMuPDF
def extract_text_with_pymupdf(pdf_path):
"""
Estrae testo da un file PDF usando la libreria ad alte prestazioni PyMuPDF (Fitz).
Args:
pdf_path (str): Il percorso del file PDF.
Returns:
str: Il contenuto testuale estratto oppure un messaggio di errore.
"""
try:
doc = fitz.open(pdf_path)
full_text = ""
for page in doc:
# .get_text() è la funzione principale
full_text += page.get_text() + "\n"
doc.close()
return full_text
except FileNotFoundError:
return f"Errore: il file in {pdf_path} non è stato trovato."
except Exception as e:
# PyMuPDF può sollevare errori specifici, ad esempio fitz.fitz.FitzError
return f"Si è verificato un errore con PyMuPDF: {e}"
# --- Esempio di utilizzo ---
pdf_file = 'path/to/your/document.pdf'
fast_extracted_text = extract_text_with_pymupdf(pdf_file)
if "Error" not in fast_extracted_text:
print("--- Testo estratto (metodo veloce) ---")
print(fast_extracted_text)
else:
print(fast_extracted_text)
Se ti interessa soprattutto la massima velocità sui PDF testuali, PyMuPDF è senza dubbio la scelta migliore.
Caso speciale: leggere PDF scansionati con OCR
A questo punto potresti chiederti: cosa succede quando nessuno di questi metodi funziona? Se esegui il codice qui sopra su un documento scansionato, ad esempio l'immagine di un contratto o una pagina di libro digitalizzata, otterrai una stringa vuota.
Succede perché non esiste un livello di testo. Il PDF contiene un'immagine, non caratteri. Per risolvere il problema, ti serve l'OCR (Optical Character Recognition), che "legge" l'immagine e la converte in testo interpretabile dalla macchina.
La soluzione standard in Python è pytesseract, un wrapper per il motore Tesseract OCR di Google. È potente, ma ha un grosso svantaggio: devi installare Tesseract separatamente sul tuo sistema, ad esempio tramite brew su Mac o con un installer su Windows, e assicurarti che Python riesca a trovare l'eseguibile. Questa configurazione può essere fragile, soprattutto quando distribuisci il codice su un server o lo condividi con i colleghi.
Alternativa: pre-elaborare PDF complessi con uno strumento no-code
Se hai tempi stretti o semplicemente non vuoi gestire la complessità delle dipendenze OCR, un'alternativa pratica è affidare prima l'estrazione del testo a uno strumento dedicato. In questo modo separi il problema dell'OCR dalla logica principale del tuo script Python.
Uno strumento basato sull'AI come estrattore di testo PDF con AI di Lynote può funzionare come un ottimo pre-processore. Puoi caricare un PDF scansionato particolarmente difficile e lasciare che gestisca l'OCR in background, restituendoti testo pulito da passare poi al tuo script. È una soluzione utile soprattutto per attività occasionali o quando hai un piccolo lotto di file problematici.
Ecco quanto è semplice il flusso di lavoro:
- Carica il tuo file PDF. Vai nell'area di lavoro di Lynote. Nella scheda 'Upload File' puoi trascinare il PDF oppure selezionarlo dal computer. Funziona sia con PDF testuali sia con PDF basati su immagini scansionate.
- Estrai il testo dal PDF. Dopo il caricamento del file, fai clic sul pulsante "Create Note". Il motore AI di Lynote elabora il documento, applica automaticamente l'OCR se rileva un file basato su immagini e genera una versione testuale pulita e ricercabile.
- Copia il testo estratto. Quando il testo appare nell'editor, puoi controllarlo, fare eventuali piccole correzioni e poi usare il pulsante di copia per prendere tutto il contenuto. A quel punto è negli appunti, pronto da incollare nel tuo script Python come variabile stringa.


Con questo approccio puoi concentrarti sull'analisi dei dati nel tuo codice, invece che sull'infrastruttura e sulla gestione degli errori di una configurazione OCR locale.
Errori comuni e consigli avanzati
Estrarre testo dai PDF raramente è un processo perfetto. Ecco alcuni problemi comuni in cui probabilmente ti imbatterai:
- Codifica dei caratteri: Potresti imbatterti in un
UnicodeDecodeError. Succede spesso con PDF più vecchi o generati da software poco comuni. La maggior parte delle librerie moderne gestisce beneUTF-8, ma in alcuni casi specificare la codifica può aiutare, se la libreria lo consente. - PDF protetti da password: Se per aprire un PDF serve una password, tutte queste librerie falliranno. Devi fornire la password durante l'apertura del file. Ad esempio:
PyPDF2.PdfReader(file, password='your_password'). - Perdita della formattazione: Tieni presente che l'estrazione del testo quasi sempre perde elementi di formattazione come grassetto, corsivo, dimensione del font e colori. Ottieni il contenuto testuale grezzo, non una rappresentazione visiva del documento.
- Testo confuso nei layout a colonne: Come accennato per PyPDF2, i layout a più colonne (per esempio negli articoli accademici) possono produrre testo con righe mescolate tra colonne diverse.
pdfplumberè molto più efficace in questi casi, perché interpreta la geometria della pagina.
Consiglio dell'esperto: testa sempre lo script su un campione rappresentativo dei tuoi documenti. Una soluzione che funziona perfettamente su un PDF può fallire del tutto su un altro proveniente da una fonte diversa.
Domande frequenti
Perché il testo estratto dalla mia tabella è diventato un'unica stringa lunga e disordinata?
Questo è il classico limite di librerie come PyPDF2, che non fanno analisi del layout della pagina. Leggono il flusso di testo grezzo nell'ordine in cui è memorizzato nel file, che spesso non corrisponde alla struttura visiva fatta di righe e colonne. Per risolvere il problema, devi usare una libreria che tenga conto del layout, come **pdfplumber**, progettata proprio per riconoscere i dati tabellari.
Python può estrarre testo da un'area specifica di una pagina PDF?
Sì, ma ti serve una libreria che fornisca informazioni sulle coordinate. pdfplumber e PyMuPDF sono ottime scelte per questo scenario. Con pdfplumber, puoi usare il metodo .crop((x0, top, x1, bottom)) per creare un riquadro di delimitazione e poi eseguire .extract_text() o .extract_tables() solo all'interno di quell'area ritagliata.
Perché il testo estratto è vuoto nel mio PDF scansionato?
Il tuo PDF contiene un'immagine del testo, non dati testuali reali. Le librerie standard non possono "leggere" le immagini. Devi usare un processo di riconoscimento ottico dei caratteri (OCR). Puoi configurare un motore OCR in locale con pytesseract oppure usare uno strumento di pre-elaborazione come Lynote per convertire prima il PDF basato su immagini in testo pulito.
Come gestire PDF con più lingue?
Le librerie moderne come PyMuPDF e pdfplumber in genere gestiscono bene Unicode, che supporta la maggior parte delle lingue. La sfida principale arriva durante l'OCR. Tesseract, per esempio, richiede di scaricare e specificare i pacchetti lingua da usare (ad esempio -l eng+fra per inglese e francese).
Conclusione: come scegliere lo strumento Python giusto per i PDF
Non esiste una singola libreria "migliore" per estrarre testo da PDF con Python. La scelta giusta dipende sempre dal tipo di documenti che devi gestire e dagli obiettivi del tuo progetto.
Riassumiamolo con un semplice schema decisionale:
- Se i tuoi PDF sono documenti semplici basati su testo e ti serve solo il contenuto grezzo, PyPDF2 è la soluzione più facile e veloce da implementare.
- Se i tuoi PDF contengono tabelle o layout strutturati che vuoi trasformare in dati (ad esempio per caricarli in un database o in un DataFrame Pandas), pdfplumber è nettamente la scelta migliore.
- Se devi elaborare un grande volume di documenti e la velocità pura è la tua priorità assoluta, PyMuPDF (Fitz) è l'opzione più potente e performante.
- Se hai a che fare con PDF scansionati basati su immagini, devi usare l'OCR. Se vuoi una soluzione rapida e affidabile senza complicazioni di configurazione in locale, spesso l'approccio più pratico è pre-elaborare il file con uno strumento esterno prima di importare il testo pulito nel tuo ambiente Python.
Parti dallo strumento più semplice che soddisfa le tue esigenze e sii pronto a passare a uno più potente man mano che aumenta la complessità dei tuoi documenti.


