Estrai testo da PDF con PDFMiner in Python
Mastery dell'estrazione del testo da PDF con Python
PDFMiner.six è una potente libreria Python per l’estrazione di testo, metadati e informazioni sul layout da documenti PDF. Questa guida fa parte del nostro Strumenti di Documentazione nel 2026: Markdown, LaTeX, PDF e Workflow di Stampa hub.
A differenza dei semplici lettori PDF, fornisce un’analisi approfondita della struttura del PDF e gestisce efficacemente i layout complessi.

Cosa è PDFMiner e perché usarlo?
PDFMiner è una libreria puramente in Python progettata per estrarre e analizzare il testo dai documenti PDF. La versione .six è il fork attivamente mantenuto che supporta Python 3.x, mentre il progetto originale PDFMiner non è più aggiornato.
Funzionalità principali:
- Implementazione puramente in Python (nessuna dipendenza esterna)
- Analisi dettagliata del layout e posizionamento del testo
- Rilevamento di font e codifica dei caratteri
- Supporto per PDF crittografati
- Strumenti da riga di comando inclusi
- Architettura estensibile per elaborazioni personalizzate
PDFMiner è particolarmente utile quando si ha bisogno di un controllo preciso sull’estrazione del testo, di preservare le informazioni sul layout o di lavorare con documenti complessi a colonne multiple. Sebbene possa essere più lento di alcuni alternative, l’accuratezza e le capacità di analisi dettagliate lo rendono la scelta preferita per i pipeline di elaborazione dei documenti. Per il workflow inverso, potresti anche essere interessato a generare PDF in modo programmatico in Python.
Installazione e configurazione
Installa PDFMiner.six utilizzando pip:
pip install pdfminer.six
Per ambienti virtuali (raccomandati):
python -m venv venv
source venv/bin/activate # Su Windows: venv\Scripts\activate
pip install pdfminer.six
Se sei nuovo nella gestione dei pacchetti Python, consulta il nostro Foglio di Trucchi Python per ulteriori dettagli su pip e ambienti virtuali.
Verifica l’installazione:
pdf2txt.py --version
La libreria include diversi strumenti da riga di comando:
pdf2txt.py- Estrai testo da PDFdumppdf.py- Dump della struttura interna del PDFlatin2ascii.py- Converti caratteri latini in ASCII
Questi strumenti integrano altre utilità per la manipolazione dei PDF come Poppler che forniscono funzionalità aggiuntive come l’estrazione delle pagine e la conversione dei formati.
Estrazione di testo di base
Estrazione di testo semplice
Il modo più semplice per estrarre testo da un PDF:
from pdfminer.high_level import extract_text
# Estrai tutto il testo da un PDF
text = extract_text('document.pdf')
print(text)
Questa API di alto livello gestisce la maggior parte dei casi d’uso comuni e restituisce l’intero documento come una singola stringa.
Estrai testo da pagine specifiche
Per estrarre testo da pagine specifiche:
from pdfminer.high_level import extract_text
# Estrai testo dalle pagine 2-5 (0-indexed)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Questo è particolarmente utile per documenti di grandi dimensioni in cui si necessita solo di alcune sezioni, migliorando significativamente le prestazioni.
Estrazione di testo con iterazione per pagina
Per elaborare le pagine singolarmente:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())
Questo approccio ti dà un controllo maggiore su come ogni pagina viene elaborata, utile quando si lavora con documenti in cui la struttura delle pagine varia.
Analisi avanzata del layout
Comprendere LAParams
LAParams (Layout Analysis Parameters) controllano come PDFMiner interpreta il layout del documento. Comprendere la differenza tra PDFMiner e librerie più semplici è cruciale qui - PDFMiner analizza effettivamente le relazioni spaziali tra gli elementi del testo.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Creare parametri personalizzati LAParams
laparams = LAParams(
line_overlap=0.5, # Sovrapposizione minima per le linee di testo
char_margin=2.0, # Margine dei caratteri
line_margin=0.5, # Margine delle linee
word_margin=0.1, # Spaziatura tra parole
boxes_flow=0.5, # Threshold per la direzione del flusso dei box
detect_vertical=True, # Rileva testo verticale
all_texts=False # Estrai solo testo nei box
)
text = extract_text('document.pdf', laparams=laparams)
Spiegazione dei parametri:
line_overlap: Quanto devono sovrapporsi le linee per essere considerate la stessa linea (0.0-1.0)char_margin: Spaziatura massima tra caratteri nello stesso paragrafo (espressa come multiplo della larghezza del carattere)line_margin: Spaziatura massima tra linee nello stesso paragrafoword_margin: Threshold per separare le paroleboxes_flow: Threshold per la direzione del flusso del testo nei boxdetect_vertical: Abilita il rilevamento del testo verticale (comune nei linguaggi asiatici)
Estrazione delle informazioni sul layout
Ottieni informazioni dettagliate sulla posizione e sui font:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextBox, LTTextLine, LTChar
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextBox):
# Ottenere le coordinate del bounding box
x0, y0, x1, y1 = element.bbox
print(f"Testo a ({x0}, {y0}): {element.get_text()}")
# Iterare sulle linee
for text_line in element:
if isinstance(text_line, LTTextLine):
# Ottenere dettagli a livello di carattere
for char in text_line:
if isinstance(char, LTChar):
print(f"Carattere: {char.get_text()}, "
f"Font: {char.fontname}, "
f"Dimensione: {char.height}")
Questo livello di dettaglio è estremamente utile per l’analisi dei documenti, l’estrazione dei moduli o quando si necessita di comprendere la struttura del documento in modo programmabile.
Gestione di diversi tipi di PDF
PDF crittografati
PDFMiner può gestire i PDF protetti da password:
from pdfminer.high_level import extract_text
# Estrai da un PDF protetto da password
text = extract_text('encrypted.pdf', password='your_password')
Nota che PDFMiner può estrarre solo il testo dai PDF - non può bypassare le restrizioni di sicurezza che impediscono l’estrazione del testo a livello di PDF.
Documenti a colonne multiple
Per documenti con più colonne, regola LAParams:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Ottimizza per layout a colonne multiple
laparams = LAParams(
detect_vertical=False,
line_margin=0.3,
word_margin=0.1,
boxes_flow=0.3 # Valore più basso per una migliore rilevazione delle colonne
)
text = extract_text('multi_column.pdf', laparams=laparams)
Il parametro boxes_flow è particolarmente importante per i documenti a colonne multiple - i valori più bassi aiutano PDFMiner a distinguere tra colonne separate.
Testo non inglese e Unicode
PDFMiner gestisce bene l’Unicode, ma assicurati di utilizzare l’encoding corretto:
from pdfminer.high_level import extract_text
# Estrai testo con supporto per l'Unicode
text = extract_text('multilingual.pdf', codec='utf-8')
# Salva su file con encoding UTF-8
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Lavorare con PDF scansionati
PDFMiner non può estrarre testo direttamente da PDF scansionati (immagini). Questi richiedono l’OCR (Riconoscimento Ottico dei Caratteri). Tuttavia, puoi integrare PDFMiner con strumenti di OCR.
Ecco come rilevare se un PDF è scansionato e richiede l’OCR:
from pdfminer.high_level import extract_text
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTFigure, LTImage
def is_scanned_pdf(pdf_path):
"""Verifica se il PDF sembra essere scansionato (molte immagini)"""
text_count = 0
image_count = 0
for page_layout in extract_pages(pdf_path):
for element in page_layout:
if isinstance(element, (LTFigure, LTImage)):
image_count += 1
elif hasattr(element, 'get_text'):
if element.get_text().strip():
text_count += 1
# Se sono presenti molte immagini e poco testo, probabilmente è scansionato
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Questo PDF sembra essere scansionato - utilizza l'OCR")
else:
text = extract_text('document.pdf')
print(text)
Per i PDF scansionati, considera l’integrazione con Tesseract OCR o l’uso di strumenti per estrarre immagini dai PDF prima, quindi applicare l’OCR a quelle immagini.
Utilizzo da riga di comando
PDFMiner include potenti strumenti da riga di comando:
Estrai testo con strumenti da riga di comando
# Estrai testo su stdout
pdf2txt.py document.pdf
# Salva su file
pdf2txt.py -o output.txt document.pdf
# Estrai pagine specifiche
pdf2txt.py -p 1,2,3 document.pdf
# Estrai come HTML
pdf2txt.py -t html -o output.html document.pdf
Opzioni avanzate
# Parametri di layout personalizzati
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Estrai con layout dettagliato (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Imposta password per PDF crittografati
pdf2txt.py -P mypassword encrypted.pdf
Questi strumenti da riga di comando sono eccellenti per il test rapido, gli script shell e l’integrazione in workflow automatizzati.
Ottimizzazione delle prestazioni
Elaborazione di PDF di grandi dimensioni
Per documenti grandi, considera queste strategie di ottimizzazione:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Processa solo le pagine necessarie
def extract_page_range(pdf_path, start_page, end_page):
text_content = []
for i, page_layout in enumerate(extract_pages(pdf_path)):
if i < start_page:
continue
if i >= end_page:
break
text_content.append(page_layout)
return text_content
# Disattiva l'analisi del layout per velocità
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Molto più veloce
Elaborazione in batch
Per elaborare diversi PDF in modo efficiente:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Elabora un singolo file PDF"""
try:
text = extract_text(pdf_path)
output_path = pdf_path.replace('.pdf', '.txt')
with open(output_path, 'w', encoding='utf-8') as f:
f.write(text)
return f"Elaborato: {pdf_path}"
except Exception as e:
return f"Errore nell'elaborazione {pdf_path}: {str(e)}"
# Elabora i PDF in parallelo
def batch_process_pdfs(pdf_directory, num_workers=4):
pdf_files = [os.path.join(pdf_directory, f)
for f in os.listdir(pdf_directory)
if f.endswith('.pdf')]
with Pool(num_workers) as pool:
results = pool.map(process_pdf, pdf_files)
for result in results:
print(result)
# Utilizzo
batch_process_pdfs('/path/to/pdfs', num_workers=4)
Problemi comuni e soluzioni
Problema: Ordine del testo errato
Problema: Il testo estratto sembra confuso o fuori ordine.
Soluzione: Regola LAParams, in particolare boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Prova diversi valori
text = extract_text('document.pdf', laparams=laparams)
Problema: Spazi mancanti tra le parole
Problema: Le parole si uniscono senza spazi.
Soluzione: Aumenta word_margin:
laparams = LAParams(word_margin=0.2) # Aumenta dal valore predefinito 0.1
text = extract_text('document.pdf', laparams=laparams)
Problema: Errori di codifica
Problema: Caratteri strani o errori di codifica.
Soluzione: Specifica esplicitamente la codifica:
text = extract_text('document.pdf', codec='utf-8')
Problema: Errori di memoria con PDF grandi
Problema: Errori di memoria con file grandi.
Soluzione: Elabora pagina per pagina:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Estrai testo in blocchi per ridurre l'utilizzo di memoria"""
all_text = []
page_count = 0
for page_layout in extract_pages(pdf_path):
page_text = []
for element in page_layout:
if hasattr(element, 'get_text'):
page_text.append(element.get_text())
all_text.append(''.join(page_text))
page_count += 1
# Elabora in blocchi
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Yield il testo rimanente
if all_text:
yield ''.join(all_text)
Confronto tra PDFMiner e alternative
Comprendere quando utilizzare PDFMiner rispetto ad altre librerie è importante:
PDFMiner vs PyPDF2
PyPDF2 è più semplice e veloce ma meno preciso:
- Utilizza PyPDF2 per: PDF semplici, estrazione rapida, unione/suddivisione di PDF
- Utilizza PDFMiner per: Layout complessi, posizionamento preciso del testo, analisi dettagliata
PDFMiner vs pdfplumber
pdfplumber si basa su PDFMiner con un’API di alto livello:
- Utilizza pdfplumber per: Estrazione di tabelle, API più semplice, prototipazione rapida
- Utilizza PDFMiner per: Controllo massimo, elaborazione personalizzata, sistemi di produzione
PDFMiner vs PyMuPDF (fitz)
PyMuPDF è significativamente più veloce ma ha dipendenze in C:
- Utilizza PyMuPDF per: Applicazioni a prestazioni critiche, elaborazione su larga scala
- Utilizza PDFMiner per: Requisito puramente in Python, analisi dettagliata del layout
Esempio pratico: Estrai e analizza il documento
Ecco un esempio completo che estrae il testo e fornisce statistiche sul documento:
from pdfminer.high_level import extract_pages, extract_text
from pdfminer.layout import LTTextBox, LTChar
from collections import Counter
import re
def analyze_pdf(pdf_path):
"""Estrai testo e fornisce un'analisi del documento"""
# Estrai testo completo
full_text = extract_text(pdf_path)
# Statistiche
stats = {
'total_chars': len(full_text),
'total_words': len(full_text.split()),
'total_lines': full_text.count('\n'),
'fonts': Counter(),
'font_sizes': Counter(),
'pages': 0
}
# Analisi dettagliata
for page_layout in extract_pages(pdf_path):
stats['pages'] += 1
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
stats['fonts'][char.fontname] += 1
stats['font_sizes'][round(char.height, 1)] += 1
return {
'text': full_text,
'stats': stats,
'most_common_font': stats['fonts'].most_common(1)[0] if stats['fonts'] else None,
'most_common_size': stats['font_sizes'].most_common(1)[0] if stats['font_sizes'] else None
}
# Utilizzo
result = analyze_pdf('document.pdf')
print(f"Pagine: {result['stats']['pages']}")
print(f"Parole: {result['stats']['total_words']}")
print(f"Font principale: {result['most_common_font']}")
print(f"Dimensione principale: {result['most_common_size']}")
Integrazione con pipeline di elaborazione dei documenti
PDFMiner funziona bene in pipeline di elaborazione dei documenti più ampie. Ad esempio, quando si costruiscono sistemi RAG (Retrieval-Augmented Generation) o soluzioni di gestione dei documenti, potresti combinarlo con altri strumenti Python per una pipeline completa.
Una volta estratto il testo dai PDF, spesso è necessario convertirlo in altri formati. Puoi convertire contenuti HTML in Markdown utilizzando librerie Python o anche sfruttare la conversione alimentata da LLM con Ollama per la trasformazione intelligente dei documenti. Queste tecniche sono particolarmente utili quando l’estrazione da PDF produce testo strutturato simile a HTML che necessita di pulizia e riformattazione.
Per pipeline complete di conversione dei documenti, potresti anche dover gestire la conversione da documenti Word a Markdown, creando un workflow unificato che elabora diversi formati di documenti in un formato di output comune.
Linee guida
-
Utilizza sempre LAParams per documenti complessi - Le impostazioni predefinite funzionano per documenti semplici, ma regolare LAParams migliora significativamente i risultati per layout complessi.
-
Testa prima con pagine di esempio - Prima di elaborare grandi batch, testa le tue impostazioni di estrazione su campioni rappresentativi.
-
Gestisci le eccezioni con cura - I file PDF possono essere danneggiati o maleformati. Avvolgi sempre il codice di estrazione in blocchi try-except.
-
Cachizza il testo estratto - Per l’elaborazione ripetuta, cachizza il testo estratto per evitare di rielaborare.
-
Verifica la qualità del testo estratto - Implementa controlli per verificare la qualità dell’estrazione (es. lunghezza minima del testo, parole chiave previste).
-
Considera alternative per casi d’uso specifici - Sebbene PDFMiner sia potente, a volte strumenti specializzati (come tabula-py per le tabelle) sono più adatti.
-
Mantieni aggiornato PDFMiner - Il fork
.sixè attivamente mantenuto. Mantienilo aggiornato per correzioni di bug e miglioramenti. -
Documenta correttamente il tuo codice - Quando condividi script di estrazione PDF, utilizza correttamente i blocchi di codice Markdown con evidenziazione della sintassi per una migliore leggibilità.
Conclusione
PDFMiner.six è uno strumento essenziale per gli sviluppatori Python che lavorano con documenti PDF. La sua implementazione puramente in Python, l’analisi dettagliata del layout e l’architettura estensibile lo rendono ideale per sistemi di elaborazione dei documenti in produzione. Sebbene possa avere una curva di apprendimento più ripida rispetto a librerie più semplici, la precisione e il controllo che offre sono insuperabili per compiti di estrazione di PDF complessi.
Che tu stia costruendo un sistema di gestione dei documenti, analizzando articoli scientifici o estraiendo dati per pipeline di machine learning, PDFMiner fornisce la base per un’estrattiva affidabile del testo da PDF in Python.
Risorse correlate
Articoli correlati su questo sito
- Strumenti di Documentazione nel 2026: Markdown, LaTeX, PDF e Workflow di Stampa
- Strumenti per manipolare PDF in Ubuntu - Poppler - Guida completa agli strumenti da riga di comando per PDF inclusi pdftotext, pdfimages e altre utilità poppler che lavorano insieme a PDFMiner nei workflow di elaborazione dei documenti
- Come estrarre immagini da PDF - Foglio di Trucchi - Impara come estrarre immagini incorporate da PDF utilizzando gli strumenti da riga di comando poppler, complementando le capacità di estrazione del testo di PDFMiner
- Generare PDF in Python - Librerie ed esempi - Esplora le librerie Python per la generazione di PDF incluso ReportLab, PyPDF2 e FPDF per creare il workflow inverso dell’estrazione del testo da PDF
- Foglio di Trucchi Python - Riferimento essenziale per la sintassi Python inclusi la gestione dei file, le operazioni di stringa e le best practice per scrivere script puliti per l’elaborazione dei PDF