IA e Avvocati (8): parsing dei PDF legali con OCR e pulizia del testo
Intelligenza artificiale e Avvocati
8. Parsing dei PDF legali con OCR e pulizia del testo
Che cos’è il parsing?
Nel contesto dell’elaborazione dei documenti legali, il termine parsing indica l’intero processo di analisi e trasformazione di un documento testuale in una forma strutturata, adatta a essere elaborata da un modello linguistico o un motore RAG. Le fasi principali del parsing sono:
- Estrazione del contenuto: recupero del testo dal documento, sia esso digitale (PDF nativo) o immagine (via OCR).
- Pulizia del testo: rimozione di elementi non rilevanti (es. intestazioni, watermark, firme, numeri pagina).
- Segmentazione: suddivisione del testo in blocchi logici (chunk), utili per l’analisi semantica e l’indicizzazione.
Una buona pipeline di parsing è la base per costruire sistemi intelligenti in grado di comprendere e sfruttare documenti legali complessi.
Introduzione
Nota terminologica
OCR (Optical Character Recognition): tecnologia che consente di convertire immagini contenenti testo (es. PDF scannerizzati) in testo digitale modificabile.
NLP (Natural Language Processing): insieme di tecniche e strumenti che permettono ai computer di comprendere, analizzare e generare il linguaggio umano in modo utile, ad esempio per classificare, riassumere o cercare contenuti giuridici.
Nell’ambito dell’adozione di sistemi RAG (Retrieval-Augmented Generation) locali negli studi legali, una delle fasi più critiche riguarda la preparazione dei dati, in particolare l’estrazione del testo da documenti PDF.
I documenti legali possono essere sia in formato digitale nativo (PDF generati da Word o da software gestionali), sia scannerizzati come immagini.
La capacità di processare PDF in modo accurato rappresenta dunque un passaggio essenziale per alimentare un sistema basato su LLM.
Questo ottavo post ci guida passo dopo passo nel parsing dei PDF legali, distinguendo tra documenti nativi e scannerizzati.
Verranno illustrati strumenti come Tesseract per l’OCR, PyMuPDF e pdfminer per l’estrazione del testo, oltre a tecniche di pulizia del testo.
Esempi di parsing
Estrazione di testo da PDF nativi
Spiegazione tecnica
In questo esempio di parsing vengono mostrati due strumenti per l’estrazione del testo da PDF digitali nativi, cioè file generati digitalmente (non scannerizzati).
PyMuPDF(fitz): consente di aprire un PDF, leggere ogni pagina e ricavare il testo in modo rapido. La funzioneget_text()estrae tutto il contenuto testuale della pagina.pdfminer.six: è una libreria più sofisticata per casi in cui il layout del documento è complesso (colonne, tabelle, strutture giuridiche complesse). La funzioneextract_text()estrae tutto il testo del PDF in una sola chiamata.Entrambi gli strumenti funzionano in ambiente Windows, sono open source e integrabili in flussi Python automatizzati per alimentare un sistema RAG.
Guida pratica: installazione librerie, creazione ed esecuzione script python
Installazione delle librerie con pip
Come già illustrato nei post 6 e 7:
- Apri Visual Studio Code.
- Apri la cartella del progetto che contiene il file python e l’ambiente virtuale.
- Apri il terminale integrato (dal menu Visualizza > Terminale).
- Attiva l’ambiente virtuale.
- Installa le librerie necessarie eseguendo il comando:
pip install pymupdf pdfminer.six
Creazione e salvataggio dello script Python
- All’interno della cartella del progetto, crea un nuovo file chiamato
estrai_testo.py. - Copia e incolla il codice python di esempio che trovi di seguito nel file e salvalo.
Esecuzione dello script Python
Una volta creato il file .py con l’esempio, nel terminale di VS Code, esegui lo script con:
python estrai_testo.py
Questo comando:
- eseguirà lo script,
- aprirà il file
contratto.pdf(che deve trovarsi nella stessa cartella del file estrai_testo.py che hai creato), - estrarrà il testo dal PDF, lo stamperà nel terminale e lo salverà anche in un file di testo.
Esempio di parsing con PyMuPDF (script python):
import fitz # PyMuPDF
# Apri il file PDF da cui vuoi estrarre il testo
doc = fitz.open("contratto.pdf")
# Scorri tutte le pagine del documento
with open("testo_estratto.txt", "w", encoding="utf-8") as f:
for page in doc:
# Estrai il testo dalla pagina corrente
text = page.get_text()
# Stampa il contenuto testuale della pagina
print(text)
# Crea un file con il testo estratto
f.write(text)
# Chiudi il documento per liberare risorse
doc.close()
Cosa fa questo codice:
- Apre il file
contratto.pdf. - Estrae il testo da ogni pagina usando
get_text(). - Stampa il contenuto sul terminale e lo salva in un file .txt.
- Infine, chiude il file per buona prassi.
Esempio di parsing con pdfminer:
from pdfminer.high_level import extract_text
text = extract_text("contratto.pdf")
print(text)
with open("testo_estratto.txt", "w", encoding="utf-8") as f:
f.write(text)
OCR su PDF scannerizzati con Tesseract
Perché è necessario
Molti atti giudiziari, contratti firmati o documenti arrivano in formato immagine. Senza OCR, questi documenti restano inaccessibili agli LLM e inutilizzabili nei processi NLP.
Per l’installazione delle librerie necessarie e la creazione del file .py dello script python seguire il medesimo procedimento descritto sopra.
Installazione di Tesseract OCR su Windows con lingua italiana
Per utilizzare Tesseract OCR in italiano su Windows, segui questi passaggi:
1. Scarica l’installer di Tesseract
Vai alla pagina ufficiale dei rilasci di Tesseract per Windows su GitHub:
https://github.com/UB-Mannheim/tesseract/wiki
Scarica la versione più recente dell’installer (tesseract-ocr-w64-setup.exe) e avviala. Durante l’installazione, puoi scegliere le lingue aggiuntive da installare: assicurati di selezionare anche “Italian”.
Installazione delle librerie necessarie
pip install pymupdf pytesseract Pillow
Esempio pratico con PyMuPDF e Tesseract (OCR)
Questo esempio consente di eseguire l’OCR direttamente su ogni pagina di un PDF scannerizzato, utilizzando PyMuPDF per convertire le pagine in immagini e Tesseract per estrarre il testo.
import fitz # PyMuPDF
import pytesseract
from PIL import Image
from io import BytesIO
# Percorso all'eseguibile di Tesseract (modificare se necessario)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# Apri il file PDF scannerizzato
pdf_document = fitz.open('documento_scannerizzato.pdf')
# Scorri ogni pagina del PDF
with open("testo_estratto.txt", "w", encoding="utf-8") as f:
for i, page in enumerate(pdf_document):
# Crea una rappresentazione raster della pagina (300 DPI per buona qualita' OCR)
pix = page.get_pixmap(dpi=300)
# Converte l'immagine in oggetto compatibile con PIL
img = Image.open(BytesIO(pix.tobytes("png")))
# Applica OCR con lingua italiana
text = pytesseract.image_to_string(img, lang='ita')
# Stampa il testo estratto
print(f"--- Pagina {i+1} ---")
print(text)
# Salva su file il testo estratto
f.write(text)
pdf_document.close()
Cosa fa questo codice
- Apre il PDF con PyMuPDF (nell’esempio il file documento_scannerizzato.pdf che si trova nella stessa cartella del file .py)
- Converte ogni pagina in immagine ad alta risoluzione
- Usa Tesseract per eseguire OCR sull’immagine
- Stampa il testo riconosciuto da ogni pagina e lo salva in un file .txt nella medesima cartella.
Parsing dei PDF legali: pulizia del testo
Che cos’è la pulizia del testo?
La pulizia del testo (text cleaning) è il processo con cui si rimuovono elementi indesiderati da un testo grezzo, come intestazioni ripetute, firme, numeri di pagina, watermark o errori derivanti da OCR. L’obiettivo è ottenere un testo coerente, leggibile e pronto per l’analisi automatica.
In ambito legale, la pulizia è fondamentale per evitare che rumore testuale interferisca con la comprensione semantica da parte di modelli NLP o motori RAG.
Un testo pulito migliora l’accuratezza delle risposte generate, la pertinenza dei documenti recuperati e l’efficacia delle sintesi automatiche.
Obiettivi principali della pulizia
- Eliminare intestazioni, numeri di pagina, watermark
- Uniformare gli spazi e correggere gli errori OCR
- Conservare riferimenti numerici rilevanti (es. articoli di legge, commi, date)
Funzione di pulizia avanzata
# -*- coding: utf-8 -*-
import re
import unicodedata
def pulisci_testo_legale(testo):
# Normalizza caratteri Unicode (es. accenti strani da OCR)
testo = unicodedata.normalize("NFKC", testo)
# Rimuove intestazioni tipo "Studio Legale Rossi Associati"
testo = re.sub(r'Studio\s+Legale[\w\s&\.]*', '', testo, flags=re.IGNORECASE)
# Rimuove numeri di pagina "Pagina X di Y"
testo = re.sub(r'(?i)pagina\s+\d+\s+di\s+\d+', '', testo)
# Rimuove etichette come [BOZZA], [NON UFFICIALE], [RISERVATA]
testo = re.sub(r'\[?\b(?:BOZZA|NON\s+UFFICIALE|RISERVATA)\b\]?', '', testo, flags=re.IGNORECASE)
# Rimuove firme tipo "Avv. Mario Rossi" (anche tutto maiuscolo)
testo = re.sub(r'Avv\.\s+[A-Za-zÀ-ÖØ-öø-ÿ]+(?:\s+[A-Za-zÀ-ÖØ-öø-ÿ]+)+', '', testo, flags=re.IGNORECASE)
# Riduce spazi multipli a uno solo
testo = re.sub(r'[ \t]{2,}', ' ', testo)
# Riduce righe vuote multiple a una sola
testo = re.sub(r'\n\s*\n+', '\n\n', testo)
# Rimuove spazi all'inizio e alla fine
return testo.strip()
# ESEMPIO DI UTILIZZO
testo_originale = """
Studio Legale Rossi Associati
PAGINA 1 DI 5
Copia riservata al Cliente
[BOZZA NON UFFICIALE]
Il contratto viene definito dall'art. 1321 c.c.
come l'accordo di due o più parti per costituire,
regolare o estinguere tra loro un rapporto giuridico patrimoniale...
Data: 4 maggio 2025
Avv. Maria Bianchi
"""
testo_pulito = pulisci_testo_legale(testo_originale)
print("TESTO ORIGINALE:")
print(testo_originale)
print("\nTESTO PULITO:")
print(testo_pulito)
Conclusione
Il parsing accurato dei PDF legali è un passaggio fondamentale per costruire un sistema RAG realmente efficace.
Saper distinguere tra documenti nativi e scannerizzati, utilizzare strumenti adeguati e pulire correttamente i testi consente di ottenere basi dati affidabili per la ricerca giuridica, la sintesi e l’elaborazione automatica.
Nel prossimo post vedremo come costruire un semplice motore RAG locale di esempio collegando questi testi a un LLM tramite FAISS e LangChain.
Per un aiuto e per approfondire
Per un aiuto e per approfondire i temi dell’intelligenza artificiale nello studio legale, del legal tech e del legal design è online il GPT Iusreporter.tech (link esterno, richiede ChatGPT)
Per gli altri articoli pubblicati su questo blog sul tema:
Intelligenza artificiale e Avvocati
Scritto con l’aiuto di Iusreporter, il tuo assistente per la ricerca giuridica online
Studio legale Avvocato Giuseppe Briganti
Pesaro – Urbino
Post aggiornato alla data di pubblicazione
📄 Disclaimer
Gli script Python e i contenuti di questo testo sono forniti esclusivamente a scopo informativo, didattico e sperimentale in ambienti di test controllati. Non costituiscono consulenza legale o tecnica e non sostituiscono il parere di un professionista qualificato.
L’autore declina ogni responsabilità per eventuali errori, omissioni, malfunzionamenti, danni diretti o indiretti, incidentali, consequenziali o di altro tipo derivanti dall’uso, dall’uso improprio o dall’impossibilità di utilizzo degli script o delle informazioni contenute nel presente testo. Gli script sono forniti “così come sono” (AS IS), senza garanzie esplicite o implicite, incluse, ma non limitate a, garanzie di commerciabilità, idoneità a uno scopo particolare o assenza di violazioni.
L’utilizzo degli strumenti è sotto la piena responsabilità dell’utente, che è tenuto a verificarne, in particolare:
- la correttezza tecnica e funzionale,
- la conformità alle normative vigenti, incluse, a titolo esemplificativo, l’AI Act, il GDPR, il Codice Deontologico Forense,
- il rispetto delle licenze delle librerie e dei componenti e software di terze parti eventualmente utilizzati, inclusi quelli distribuiti con licenze open source.
Gli script non sono progettati né validati per l’uso in ambienti produttivi o per l’elaborazione di dati personali. Qualsiasi utilizzo in tali contesti è esclusiva responsabilità dell’utente, che deve adottare le opportune misure di sicurezza e valutare l’impatto normativo.
Gli script sono stati testati su Python 3.10 in ambiente Windows. Non è garantita la compatibilità con versioni diverse del linguaggio o con altri sistemi operativi. L’autore non fornisce assistenza tecnica, aggiornamenti periodici o correzione dei malfunzionamenti.
Tutti i contenuti di questo ebook, inclusi i testi e il codice sorgente, sono protetti dal diritto d’autore ai sensi della Legge 22 aprile 1941, n. 633 e successive modificazioni. È vietata la riproduzione, distribuzione, pubblicazione, comunicazione o modifica, totale o parziale, in qualsiasi forma, dei contenuti senza autorizzazione scritta dell’autore, salvo espressa indicazione contraria.
L’uso di questo testo e degli script in esso contenuti implica l’accettazione integrale del presente disclaimer. Se non si accettano tali condizioni, si prega di non utilizzare il materiale fornito.
Eventuali errori, osservazioni o segnalazioni possono essere comunicati all’autore, che si riserva di valutarli senza alcun obbligo di risposta o correzione.
