Come recuperare un importo in PDF, la sua posizione nella pagina

Questo articolo dimostra l'utilizzo di PyMuPDF per individuare quantità di testo ripetute all'interno di un rettangolo specificato. Analizzando i primi cinque campi dell'ottetto di parole e verificando il numero di candidati, è possibile evitare valutazioni errate nello splicing dei frammenti. Fornisce esempi Python a livello di memoria, strategie di elaborazione dei limiti e tabelle di accettazione e fornisce suggerimenti pratici per connettersi al flusso di lavoro di traduzione dei documenti OmniDoc.

Come individuare gli importi duplicati? Conclusione di una frase

Una volta fissato il layout, limitare prima l'area conosciuta, quindi controllare il testo e lasciare il giudizio del numero di candidati al chiamante. È più facile da interpretare che continuare ad accumulare espressioni regolari ed è meno probabile che si commettano errori silenziosi.

la tua situazionePratiche consigliatemotivo
Lo stesso importo appare in più punti della paginaLimitare la ricerca all'area rettangolare in cui si trova il settore aziendale e quindi effettuare la ricercaLa ricerca a testo completo non può determinare quale campo è il campo aziendale
Sono presenti più candidati nell'area di queryRestituisci tutti i candidati, combinati con etichette o disambiguazione manualeI programmi non dovrebbero fare scelte per l’azienda
Non ci sono risultati nell'area delle querySegna il motivo e controlla la pagina originale, senza riempimento zeroUna regione sbagliata, importi suddivisi o livelli di testo mancanti possono comportare zero risultati
La posizione del telaio sembra sfalsataCatene di trasformazione esplicite per rotazione, ritaglio e ridimensionamento del renderingLa combinazione di coordinate visualizzate e coordinate estratte causerà deviazioni

Due importi identici in un unico estratto conto

1,200.00 appare due volte in un estratto conto: una volta nella colonna dell'importo dovuto e una volta nel testo della descrizione. La ricerca full-text può trovarli, ma non può decidere per te quale sia il campo aziendale.

Se il layout del modulo è fisso, di solito è più semplice interpretarlo limitando prima un'area conosciuta e poi cercando nel testo piuttosto che continuando a modificare l'espressione regolare. La chiave non è "trovare solo una casella", ma trattare sia i risultati zero che quelli multipli come risultati chiari e non lasciare che il programma faccia scelte non autorizzate.

Lascia la posizione della parola, non solo del testo

`page.get_text("words")` di PyMuPDF restituisce un record di parole con posizione, il campo comune è (x0, y0, x1, y1, text, block_no, line_no, word_no). L'esempio seguente accetta solo i primi cinque campi e per il momento gli ultimi tre numeri non sono coinvolti nel filtro regionale.

La "parola" qui è il frammento dato dall'estrattore, che non è necessariamente uguale a una parola in senso linguistico, né è garantito che una somma sia sempre un frammento completo. 1,200.00 può essere smontato o avere etichette adiacenti. Questo articolo tratta solo della corrispondenza esatta di frammenti completi: preferirei consegnare i documenti che non soddisfano le condizioni per la revisione piuttosto che unirli silenziosamente in un importo apparentemente legale.

Verificare con due pagine sintetiche dello stesso importo

Creiamo una nuova pagina PDF in memoria e posizioniamo la stessa quantità vicino alle coordinate verticali rispettivamente 120 e 420. L'area di query copre solo l'importo sopra indicato.

Il punto di inserimento del testo è la posizione della linea di base, non l'angolo superiore sinistro della casella di testo. L'altezza e la larghezza della casella reale saranno influenzate dal carattere e dalla dimensione del carattere, quindi le coordinate non possono essere codificate in un valore fisso.

L'output corretto dovrebbe soddisfare due condizioni:

  • Nell'area di query è presente un solo candidato e il rettangolo del candidato è completamente incluso nell'area.
  • Dopo aver ampliato l'ambito della query all'intera pagina, si dovrebbero ottenere due candidati, entrando così nel ramo dell'ambiguità.

Infine, controlla se non ci sono risultati con una stringa che non è sulla pagina. Questo è più vicino al contratto richiesto da un'interfaccia reale che alla semplice dimostrazione di una ricerca riuscita.

Codice eseguibile: passa il numero dei candidati al chiamante

La dipendenza è pymupdf, installa e blocca la versione nell'ambiente di test. Il codice seguente non accede alla rete, non scrive file e non modifica il documento originale del cliente. Costruisce solo un PDF dimostrativo.

import pymupdf

def locate(page, target, query):
    query = pymupdf.Rect(query)
    candidates = []
    for word in page.get_text("words"):
        x0, y0, x1, y1, text = word[:5]
        box = pymupdf.Rect(x0, y0, x1, y1)
        if text == target and query.contains(box):
            candidates.append(tuple(box))
    return candidates

def decide(candidates):
    if len(candidates) == 0:
        return "missing"
    if len(candidates) > 1:
        return "ambiguous"
    return "unique"

with pymupdf.open() as doc:
    page = doc.new_page(width=595, height=842)
    page.insert_text((80, 120), "1,200.00", fontsize=11)
    page.insert_text((80, 420), "1,200.00", fontsize=11)
    query = pymupdf.Rect(72, 100, 300, 150)
    local = locate(page, "1,200.00", query)
    assert decide(local) == "unique"
    assert query.contains(pymupdf.Rect(local[0]))
    assert decide(locate(page, "1,200.00", page.rect)) == "ambiguous"
    assert decide(locate(page, "999.99", query)) == "missing"
    print("unique / ambiguous / missing cases passed")

contains richiede un'inclusione completa, anziché toccare semplicemente il confine della regione. Se la casella di query è troppo stretta, gli importi laterali potrebbero non raggiungere risultati, il che non è un motivo per cui dovrebbe allargarsi automaticamente all'intera pagina. È necessario verificare il sistema di coordinate utilizzato durante la misurazione dell'area prima di decidere come regolare la portata.

Se l'azienda consente al punto centrale di rientrare, dovrebbero essere scritte regole aggiuntive e dovrebbero essere effettuati test aggiuntivi per la sovrapposizione dei confini. Non modificare segretamente il significato della sentenza nella stessa funzione.

La logica di produzione non dovrebbe basarsi esclusivamente su assert per bloccare eccezioni, poiché i pattern di ottimizzazione potrebbero rimuovere le asserzioni. Le asserzioni nell'esempio sono utilizzate per i controlli di regressione; quando si accede effettivamente alla coda del compito, si dovrebbero usare branch condizionali espliciti e stati di business.

Tre esiti, tre modi per gestirla

I risultati delle query sono solitamente suddivisi in tre categorie, ognuna delle quali richiede diverse azioni di elaborazione:

  • Only One Hit: C'è un solo frammento corrispondente completo nella regione, che salva numero di pagina, testo originale, rettangolo e versione della regola.
  • Zero Hit: Possibilmente dovuto a regioni errate, quantità divise o livelli di testo mancanti. Segna la causa come candidata, controlla la pagina originale e non compilare zeri.
  • Multiple Hits: Se ci sono quantità duplicate nella stessa area o se il template è cambiato, restituire tutti i candidati, combinare tag o disambiguare manualmente.

Anche le altre due situazioni devono essere gestite separatamente:

  • Box ma valori errivi: Il livello di testo stesso può essere errato o il target corrispondente è errato; torna alla pagina originale per la verifica e non permettere che le coordinate vengano approvate da valori numerici.
  • Box Offset: Le coordinate di visualizzazione ed estrazione possono essere miste, richiedendo catene di transizione chiare per rotazione, ritaglio e scalatura di rendering.

📊 Confronto tra i nuclei

Metodi di indagineCriteri di determinazioneServe cautela
Inclusione completa (esempio utilizzato)Il rettangolo candidato è completamente posizionato all'interno dell'area di interrogazioneSe la casella di query è troppo stretta, la quantità sul bordo può essere zero
Cade il punto centrale (le regole devono essere scritte separatamente)I punti centrali candidati si trovano all'interno della regioneLa sovrapposizione dei confini richiede test supplementari separati
Ricerca di pagine intereCerca tutti i candidatiLa maggior parte dei risultati è ambigua e richiede etichettatura o ulteriore giudizio manuale

Questo non è un estrattore di quantità universale

Il codice non analizza valuta, migliaia di separatori o regole decimali, né riconosce semantiche come "periodo attuale da pagare" e "saldo del periodo precedente". Solo perché c'è un solo candidato non significa che il business abbia il significato giusto.

La copia scansionata deve anche essere prima di tutto testo disponibile e posizione. Le pagine con livelli di testo ma contenuti errati non possono essere consentite solo perché possono essere copiate.

Questo articolo utilizza una pagina di composizione non ruotata. Quando la pagina reale ruota, specifica prima se la finestra di query proviene dallo schermo o se estrae le coordinate, e converti solo se necessario. Non moltiplicare per una matrice indipendentemente dalla fonte.

Quando salvi le pagine sorgente, distingui tra indici da zero a zero e numeri di pagina rivolti verso la persona per evitare di pensare erroneamente che non esistano prove quando controlli le pagine adiacenti.

🎯 Quale metodo ti si addice?

Se hai bisogno di estrarre dati da un modulo di layout fisso

Per prima cosa, limita l'area dove si trova il campo business, poi cerca l'importo e salva il numero di pagina, il rettangolo e la versione della regola.

Se incontri più candidati

Non prendere direttamente la prima opzione; restituisci tutti i candidati e determina i campi business in base ai tag o al giudizio manuale.

Se la tua pagina spesso va a zero colpi

Per prima cosa, verifica se esistono le coordinate dell'area, la quantità e il livello di testo, poi decidi se modificare l'ambito o passare ad altre rotte di estrazione.

Se vuoi fare la traduzione di documenti

Dettagli chiave come importo, data e quantità sono inclusi nella revisione manuale, con una chiara divisione del lavoro tra ispezione tecnica e revisione manuale.

Lascia i numeri chiave per la revisione della traduzione

La traduzione dei documenti dovrebbe basarsi non solo sulla fluidità delle frasi, ma anche su elementi chiave come quantità, data e quantità. OmniDoc (Voce prodotto) offre più portali di traduzione documenti e il confronto bilingue introdotto sul sito ufficiale può fungere da punto di ingresso per la revisione; Gli script di posizionamento coordinate sono adatti per preservare le prove originali e aiutare a individuare le aree problematiche.

Si consiglia prima di valutare utilizzando un campione di desensibilizzazione autorizzato a caricare. Man mano che la traduzione si allunga, la posizione del contenuto può cambiare ragionevolmente e "le coordinate nuove e vecchie sono esattamente le stesse" non dovrebbe essere presa come una condizione rigida per una traduzione corretta.

Controlli più preziosi sono: se l'importo è trattenuto, se la valuta è chiaramente definita e se l'etichetta corrispondente indica ancora lo stesso significato commerciale.

❓ Domande Frequenti (FAQ)

1. Perché non prendere semplicemente il primo colpo?

Perché la ricerca a testo completo può solo indicarti dove appare l'importo, e non può determinare quale parte appartiene al campo business. Prendere direttamente il primo colpo può sembrare corretto, ma la fonte potrebbe già essere sbagliata.

2. Perché la finestra di query richiede un'inclusione completa, invece di limitarsi al bordo?

L'esempio utilizza un metodo di determinazione completamente incluso per evitare di considerare i segmenti incompleti come riscontri validi. Se la casella di query è troppo stretta e causa zero rischi, controlla prima il sistema di coordinate e la portata, invece di allargare automaticamente l'intera pagina.

3. Cosa dovresti fare quando il risultato della query è zero?

Segna la causa candidata e controlla la pagina originale; non aggiungere zeri. Regioni errate, quantità divise o livelli di testo mancanti possono tutti portare a zero risultati.

4. Questo codice può essere usato direttamente sulle bollette reali?

Non può essere usato direttamente. L'esempio non gestisce valuta, separatore di migliaia o semantica aziendale, e il campione di sintesi in questo articolo non rappresenta un test di accuratezza per banconote reali.

📝 Riassunto

Quando si determina la cifra, si definisce prima l'area, poi si assegna il numero intero di candidati al chiamante per il giudizio. Sia lo zero che i colpi multipli dovrebbero avere chiare azioni di manipolazione. Innanzitutto, usa campioni anximatizzati per validare le regole, poi integra gradualmente documenti reali.

Esperienza ora: carica il tuo documento per iniziare a tradurre, mantenendo la formattazione originale

Aggiornato il 2026-11-14