• Molte fatture elettroniche contengono già dati strutturati, quindi non serve sempre un OCR
  • Per estrarre dati fatture senza OCR cloud bisogna distinguere tra XML, PDF testuali e PDF scansionati
  • Un flusso locale protegge meglio documenti sensibili, accessi e log di lavorazione
  • Il processo corretto prevede import, parsing, validazione, normalizzazione e controllo umano sulle eccezioni


Estrarre dati fatture senza OCR cloud è possibile quando il documento contiene già informazioni leggibili da un sistema locale. Nelle PMI il caso più comune è la fattura elettronica XML, ma anche molti PDF generati da software gestionali contengono testo estraibile senza riconoscimento ottico. La differenza è importante: un conto è leggere dati già presenti, un altro è inviare immagini a un servizio esterno per farle interpretare.
Il punto non è demonizzare l'OCR. In alcuni casi serve, soprattutto con scansioni o foto. Tuttavia, molte aziende usano OCR cloud anche quando non è necessario. Questo aumenta costi, passaggi e rischi sui documenti sensibili.
Questa guida spiega come progettare un flusso pratico per leggere fatture in locale, senza caricare file su piattaforme OCR esterne. Vedremo quali formati gestire, quali campi estrarre, come validarli e dove inserire controlli.

Flusso locale di estrazione dati da fatture XML e PDF verso gestionale e contabilità


Quando ha senso estrarre dati fatture senza OCR cloud

Prima di scegliere uno strumento, devi capire il tipo di fattura che ricevi. Non tutti i file richiedono la stessa tecnica. Alcuni documenti sono già strutturati, altri sono solo una rappresentazione visiva.

I casi principali sono tre:

  • Fattura elettronica XML, contiene campi strutturati come cedente, cessionario, imponibile, IVA, numero e data
  • PDF testuale, generato da un software e composto da testo selezionabile
  • PDF scansionato, creato da una scansione o una foto, quindi simile a un'immagine

Nel primo caso, l'OCR non serve. Devi leggere un file XML. Nel secondo caso, puoi spesso estrarre testo dal PDF senza riconoscere caratteri da un'immagine. Nel terzo caso, invece, l'OCR può diventare necessario.

La fattura elettronica italiana usa un tracciato XML definito da specifiche ufficiali. L'Agenzia delle Entrate pubblica le specifiche tecniche XML per il formato della fattura elettronica.

i
se una fattura nasce come XML, trasformarla in PDF e poi leggerla con OCR è un giro inutile. È meglio leggere direttamente il dato originale
 

Passo 1: crea una cartella di ingresso controllata

Un flusso affidabile parte da una regola semplice: tutte le fatture entrano nello stesso punto. Può essere una cartella locale, una cartella di rete, una casella email scaricata dal sistema oppure un'area del gestionale.

Evita che ogni persona salvi file dove capita. Se i documenti arrivano in percorsi diversi, il controllo diventa fragile e le fatture possono essere lavorate due volte o saltate.

Una struttura minima può essere questa:

/fatture
  /in_arrivo
  /elaborate
  /errori
  /archivio_originali
  /log

La cartella in_arrivo contiene file ancora da leggere. La cartella elaborate contiene file processati con successo. La cartella errori raccoglie i documenti che richiedono controllo manuale. L'archivio conserva gli originali.

Questa divisione sembra banale, ma riduce molte ambiguità. Inoltre, aiuta a dimostrare cosa è stato letto, quando e con quale esito.

non sovrascrivere mai i file originali. Salvali con nome, data di arrivo e identificativo interno, così puoi sempre ricostruire il percorso del documento
 

Passo 2: riconosci il tipo di file prima di leggerlo

Per estrarre dati fatture senza OCR cloud, devi classificare il file prima di applicare la logica di estrazione. Se tratti un XML come PDF, perdi il vantaggio del dato strutturato. Se tratti una scansione come PDF testuale, otterrai poco o nulla.

Una regola pratica è:

  • Se il file è XML, usa un parser XML
  • Se il file è PDF con testo selezionabile, usa estrazione testo
  • Se il file è PDF immagine, mandalo in revisione o in un flusso OCR locale
  • Se il file è P7M, estrai prima il contenuto firmato

Il formato PDF è uno standard tecnico definito dalla famiglia ISO 32000. La PDF Association raccoglie risorse ufficiali sullo standard PDF ISO.

In un processo reale puoi creare una classificazione iniziale così:

{
  "file": "fattura_123.xml",
  "tipo": "xml_fattura_elettronica",
  "azione": "parsing_xml",
  "ocr_cloud": false
}

Oppure:

{
  "file": "fattura_estera.pdf",
  "tipo": "pdf_testuale",
  "azione": "estrazione_testo_locale",
  "ocr_cloud": false
}

Questa fase evita scelte sbagliate. Inoltre, permette di separare subito i casi che richiedono controllo umano.


Diagramma decisionale per distinguere fatture XML, PDF testuali, PDF scansionati e file P7M


Passo 3: estrai i dati dalla fattura XML

La fattura elettronica XML è il caso più pulito. Il file contiene campi strutturati, quindi puoi leggere direttamente i nodi necessari. Non devi interpretare una pagina. Devi solo cercare le informazioni giuste.

I campi più usati in un flusso amministrativo sono:

  • Partita IVA del fornitore
  • Ragione sociale del fornitore
  • Numero fattura
  • Data fattura
  • Imponibile
  • IVA
  • Totale documento
  • IBAN, se presente
  • Scadenza pagamento, se presente
  • Righe documento

Python include un modulo standard per leggere XML. La documentazione ufficiale descrive xml.etree.ElementTree come API per analizzare e creare dati XML: Python ElementTree.

Un esempio semplificato:

import xml.etree.ElementTree as ET

file_xml = "fattura.xml"
tree = ET.parse(file_xml)
root = tree.getroot()

def trova_testo(percorso):
    elemento = root.find(percorso)
    if elemento is None:
        return None
    return elemento.text

numero = trova_testo(".//Numero")
data = trova_testo(".//Data")
totale = trova_testo(".//ImportoTotaleDocumento")

print({
    "numero_fattura": numero,
    "data_fattura": data,
    "totale_documento": totale
})

In produzione devi gestire namespace, versioni del tracciato e campi mancanti. Tuttavia, il principio resta semplice: se il dato è già nel file, non serve OCR.

Passo 4: estrai testo dai PDF generati dai gestionali

Molti fornitori inviano PDF creati da software contabili. Questi file spesso contengono testo selezionabile. In questo caso puoi leggere il testo localmente e poi cercare campi come numero, data e totale.

Il risultato dipende da come il PDF è stato generato. Alcuni file hanno testo ordinato. Altri spezzano righe e colonne in modo poco prevedibile. Per questo conviene partire da regole semplici e aggiungere eccezioni solo quando servono.

Un output testuale può apparire così:

FATTURA
Numero: 2026/145
Data: 12/06/2026
Fornitore: Rossi S.r.l.
Imponibile: 1.200,00 EUR
IVA: 264,00 EUR
Totale documento: 1.464,00 EUR

Da questo testo puoi applicare regole di estrazione:

import re

testo = """
FATTURA
Numero: 2026/145
Data: 12/06/2026
Fornitore: Rossi S.r.l.
Imponibile: 1.200,00 EUR
IVA: 264,00 EUR
Totale documento: 1.464,00 EUR
"""

def estrai(pattern):
    risultato = re.search(pattern, testo)
    if not risultato:
        return None
    return risultato.group(1).strip()

dati = {
    "numero_fattura": estrai(r"Numero:\s*(.+)"),
    "data_fattura": estrai(r"Data:\s*(.+)"),
    "totale_documento": estrai(r"Totale documento:\s*(.+)")
}

print(dati)

Questa logica funziona bene quando il layout è stabile. Se ogni fornitore usa un formato diverso, conviene creare regole per fornitore oppure passare a un modello di estrazione più flessibile, sempre locale.

!
non confondere PDF con testo e PDF scansionato. Sembrano uguali a video, ma per un sistema sono due oggetti molto diversi
 

Passo 5: normalizza importi, date e codici

Dopo l'estrazione, i dati non sono ancora pronti per il gestionale. Devi normalizzarli. Questo significa trasformarli in formati coerenti e confrontabili.

Per esempio, una data può arrivare come 12/06/2026, 2026-06-12 o 12 giugno 2026. Un importo può usare virgola, punto, spazi o simboli di valuta.

Un esempio di normalizzazione degli importi:

from decimal import Decimal

def normalizza_importo(valore):
    pulito = valore.replace("EUR", "").replace("€", "").strip()
    pulito = pulito.replace(".", "").replace(",", ".")
    return Decimal(pulito)

print(normalizza_importo("1.464,00 EUR"))

E un esempio sulle date:

from datetime import datetime

def normalizza_data(valore):
    formati = ["%d/%m/%Y", "%Y-%m-%d"]
    for formato in formati:
        try:
            return datetime.strptime(valore, formato).date().isoformat()
        except ValueError:
            continue
    raise ValueError(f"Data non valida: {valore}")

print(normalizza_data("12/06/2026"))

La normalizzazione riduce errori nei passaggi successivi. Inoltre, rende più facile confrontare fattura, ordine, DDT e pagamento.

Passo 6: valida i dati prima di registrarli

Per estrarre dati fatture senza OCR cloud in modo utile, non basta trovare campi. Devi anche controllare se quei campi hanno senso. Una fattura con totale mancante o partita IVA non valida non dovrebbe entrare direttamente in contabilità.

Definisci controlli minimi:

  • Numero fattura presente
  • Data fattura presente e valida
  • Fornitore riconosciuto
  • Totale documento presente
  • Importi coerenti tra imponibile, IVA e totale
  • Duplicati non presenti
  • Ordine o contratto collegato, quando richiesto

Un esempio semplice:

def valida_fattura(dati):
    errori = []

    if not dati.get("numero_fattura"):
        errori.append("numero_fattura mancante")

    if not dati.get("data_fattura"):
        errori.append("data_fattura mancante")

    if not dati.get("totale_documento"):
        errori.append("totale_documento mancante")

    if not dati.get("partita_iva_fornitore"):
        errori.append("partita_iva_fornitore mancante")

    return errori

Se il controllo genera errori, il documento va in revisione. Se passa, può proseguire verso il gestionale o verso un file di import.


Schermata concettuale di controllo fattura con campi estratti, validazione ed errori


Passo 7: prepara un output per gestionale o contabilità

Una volta validati, i dati devono entrare nel sistema giusto. Può essere un gestionale, un software contabile, un database o un file CSV per import manuale controllato.

Un formato di output semplice può essere:

{
  "fornitore": {
    "ragione_sociale": "Rossi S.r.l.",
    "partita_iva": "IT01234567890"
  },
  "fattura": {
    "numero": "2026/145",
    "data": "2026-06-12",
    "imponibile": "1200.00",
    "iva": "264.00",
    "totale": "1464.00"
  },
  "stato": "validata"
}

Oppure, per un import in CSV:

partita_iva_fornitore,numero_fattura,data_fattura,imponibile,iva,totale,stato
IT01234567890,2026/145,2026-06-12,1200.00,264.00,1464.00,validata

L'obiettivo è evitare copia e incolla. Il team amministrativo deve controllare eccezioni, non riscrivere a mano dati già presenti nei documenti.

Passo 8: proteggi documenti, accessi e log

Le fatture contengono dati aziendali e personali. Quindi il flusso deve gestire accessi, conservazione, log ed eventuali cancellazioni. Questo vale anche se non usi servizi OCR in cloud.

Un processo locale non è automaticamente sicuro. Diventa più controllabile, ma richiede regole. Devi sapere chi può vedere i file, dove sono salvati, quanto restano disponibili e quali errori vengono registrati.

La Commissione Europea pubblica una panoramica ufficiale sulla protezione dei dati, utile come riferimento generale per le aziende europee.

Un log minimo può includere:

{
  "file": "fattura_2026_145.xml",
  "ricevuta_il": "2026-06-12T09:30:00",
  "tipo": "xml",
  "stato": "validata",
  "errori": [],
  "operatore": "sistema",
  "ocr_cloud": false
}

 

!
evitare l'OCR cloud non basta se poi i file vengono salvati in cartelle aperte a tutti o inviati via email senza controllo
 

Errori comuni da evitare

Il primo errore è usare OCR per tutto. Se la fattura è XML, il dato è già disponibile. Se il PDF contiene testo, spesso puoi leggerlo senza riconoscimento ottico.

Il secondo errore è fidarsi del campo estratto senza validazione. Un numero letto bene può comunque essere nel formato sbagliato. Un totale può essere presente, ma non coerente con imponibile e IVA.

Il terzo errore è non gestire i casi limite. File protetti, allegati, fatture estere, note di credito e duplicati devono avere una regola. Altrimenti finiscono in controlli manuali confusi.

Il quarto errore è non registrare il percorso del documento. Se non sai quando è arrivato, come è stato letto e perché è stato scartato, il processo resta fragile.

Un buon sistema non deve solo estrarre dati. Deve anche dire quando non è sicuro farlo in automatico.

Domande frequenti

Si possono estrarre dati dalle fatture senza OCR?

Sì, quando la fattura è XML o PDF testuale. In questi casi i dati sono già presenti nel file e possono essere letti con parser o strumenti di estrazione testo. L'OCR serve soprattutto per scansioni e immagini.

Come estrarre dati fatture senza OCR cloud?

Devi classificare il formato, leggere XML o testo PDF in locale, normalizzare i campi e validarli prima dell'import. Il flusso dovrebbe anche salvare log, originali ed errori.

Le fatture elettroniche hanno bisogno di OCR?

No, la fattura elettronica italiana è un file XML strutturato. Il sistema deve leggere i nodi del file, non riconoscere testo da un'immagine.

Quando serve davvero l'OCR per una fattura?

L'OCR serve quando ricevi una scansione, una foto o un PDF composto solo da immagini. In quei casi non hai testo strutturato da leggere direttamente.

È più sicuro evitare OCR cloud?

Può ridurre l'invio di documenti sensibili a servizi esterni. Tuttavia, la sicurezza dipende anche da accessi, cartelle, log, backup e regole interne.