Blog

IA e Avvocati (8): parsing dei PDF legali con OCR e pulizia del testo

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:

  1. Estrazione del contenuto: recupero del testo dal documento, sia esso digitale (PDF nativo) o immagine (via OCR).
  2. Pulizia del testo: rimozione di elementi non rilevanti (es. intestazioni, watermark, firme, numeri pagina).
  3. 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 funzione get_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 funzione extract_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:

  1. Apri Visual Studio Code.
  2. Apri la cartella del progetto che contiene il file python e l’ambiente virtuale.
  3. Apri il terminale integrato (dal menu Visualizza > Terminale).
  4. Attiva l’ambiente virtuale.
  5. Installa le librerie necessarie eseguendo il comando: pip install pymupdf pdfminer.six

Creazione e salvataggio dello script Python

  1. All’interno della cartella del progetto, crea un nuovo file chiamato estrai_testo.py.
  2. 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.

Condividi

Leave a comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *