Il PDF richiede l'OCR? Utilizza PyMuPDF per eseguire il preflight pagina per pagina anziché il ririconoscimento completo
Se desideri eseguire l'OCR del PDF, non è necessario riconoscere nuovamente l'intero PDF. Utilizza PyMuPDF per determinare pagina per pagina se è presente un livello di testo e se si tratta di un'immagine a pagina intera e invia solo le pagine realmente necessarie per il riconoscimento. In allegato sono riportati esempi eseguibili, test di pagine rotanti e istruzioni sui limiti dei rami.
Quando molti team si occupano della traduzione o dell'archiviazione di PDF, sono abituati a etichettare l'intero documento come "scansionato" o "copiabile" all'ingresso. Un PDF di 300 pagine potrebbe avere le prime 280 pagine con livelli di testo e solo le ultime 20 pagine come allegati scansionati. Se classificato per parti intere, l'intero OCR aumenterà il tempo di attesa e potrebbe anche identificare erroneamente i numeri originariamente corretti. D'altra parte, se puoi copiare solo il testo della home page e saltare l'OCR su tutte le pagine, è anche rischioso.
Un approccio più affidabile consiste nel lasciare che ciascuna pagina proceda al passaggio successivo con i risultati del preflight. Questo articolo implementa una suddivisione conservativa in tre direzioni: estrazione diretta, invio alla coda dei candidati OCR e ispezione manuale. Si tratta di un'euristica ingegneristica interpretabile, non di un classificatore universale per giudicare la qualità del testo. Dopo la lettura, è possibile ottenere un programma di preflight eseguibile pagina per pagina, nonché limiti di deviazione e idee comuni per la gestione degli errori.
Conclusione in una frase
Non è necessario giudicare se il PDF richiede l'OCR. Utilizza PyMuPDF per effettuare un controllo preliminare pagina per pagina e inviare all'OCR solo le pagine che necessitano realmente di essere riconosciute.
| la tua situazione | Pratiche consigliate | motivo |
|---|---|---|
| Estrai almeno 40 caratteri diversi dagli spazi bianchi da una singola pagina | Estrazione diretta (TEXT_CANDIDATE) | Hai già abbastanza caratteri, ma devi ancora verificare la presenza di livelli OCR nascosti difettosi |
| Meno di 40 parole e una singola immagine che copra almeno il 70% della pagina | Invia alla coda dei candidati OCR | Le scansioni a pagina intera sono adatte per l'identificazione, ma saranno sufficienti anche semplici foto. |
| Pagina vuota, tipo vettoriale, titolo sparso o puzzle complesso | Ispezione manuale (REVISIONE) | Queste situazioni non possono essere classificate in modo affidabile nelle prime due categorie e non possono essere ignorate o scartate automaticamente. |
| Un documento ibrido di 300 pagine | Preflight pagina per pagina, elaborazione non completa | Evita di eseguire l'OCR su tutte le pagine a causa di alcuni allegati scansionati o di saltare tutto l'OCR perché è presente del testo nella home page |
Nota: il contenuto nell'immagine proviene dal PDF sintetizzato generato dal codice seguente, non dal file del cliente o dall'interfaccia OmniDoc. Il testo sulla pagina dell'immagine è costituito da pixel raster; il testo sulla pagina di testo ha un vero e proprio livello di testo.
Decidi cosa controllare prima
Qui vengono utilizzati due segnali: il numero di caratteri di testo dopo aver rimosso gli spazi bianchi e la proporzione dell'area della pagina occupata dall'immagine più grande della pagina. Il primo risponde "Sono stati estratti abbastanza caratteri?" e quest'ultimo aiuta a distinguere tra una scansione di pagina intera e una pagina vuota. L'area dell'immagine si intersecherà prima con la casella di ritaglio per evitare di superare il rapporto di ingrandimento dell'immagine sulla pagina.
| osservazione | Deviazione di questo articolo | Ho ancora bisogno di attenzione |
|---|---|---|
| Almeno 40 caratteri non vuoti | TEXT_CANDIDATE | Anche il livello OCR nascosto e negativo può contenere molte parole |
| Meno di 40 parole e almeno il 70% di copertura di una singola immagine | OCR_CANDIDATE | Anche le foto pure soddisfano i requisiti; l'OCR potrebbe non essere significativo |
| Il resto della situazione | REVIEW | Spazi vuoti, testo vettoriale, titoli scarsi e puzzle complessi possono essere tutti presenti qui |
Le soglie di 40 e 0,70 sono pensate per rendere più facile l'audit di questo insieme di test, non standard cross-language. Cinese, formule, copertine e forme brevi dovrebbero essere etichettate separatamente. Qui, viene scattata l'immagine più grande per area, invece di aggiungere semplicemente le aree delle immagini sovrapposte. Pertanto, una pagina scansionata composta da più immagini può finire in REVISIONE. Questo è un confine deliberatamente preservato.
Campione completo e esecutivo
Il campione utilizza PyMuPDF==1.28.0, non si basa su Tesseract e non chiama alcun servizio OCR o traduzione online. Salva come example.py ed eseguilo in una cartella vuota. Il nome del file che crea è fisso su routing-fixture.pdf. Per progetti reali, si prega di non sovrascrivere i file di input.
import json
import pymupdf
def inspect_page(page):
chars = len("".join(page.get_text().split()))
bounds = page.cropbox
# 图片坐标与文本坐标都是未旋转坐标;不要混用旋转后的 page.rect。
bounds = pymupdf.Rect(0, 0, bounds.width, bounds.height)
ratios = []
for image in page.get_image_info():
rect = pymupdf.Rect(image["bbox"]) & bounds
ratios.append(max(0, rect.get_area()) / bounds.get_area())
largest = max(ratios, default=0.0)
route = ("TEXT_CANDIDATE" if chars >= 40 else
"OCR_CANDIDATE" if largest >= 0.70 else "REVIEW")
return {"page": page.number + 1, "chars": chars,
"largest_image_ratio": round(largest, 3), "route": route}
with pymupdf.open() as source:
page = source.new_page(width=360, height=480)
page.insert_text((28, 60), "Sample invoice 2026-09-26", fontsize=16)
page.insert_text((28, 100), "Quantity 12 Unit price USD 15.00", fontsize=12)
page.insert_text((28, 132), "Amount USD 180.00 Checked manually", fontsize=12)
scan = page.get_pixmap(matrix=pymupdf.Matrix(2, 2)).tobytes("png")
page = source.new_page(width=360, height=480)
page.insert_image(page.rect, stream=scan)
source.new_page(width=360, height=480)
source.save("routing-fixture.pdf")
with pymupdf.open("routing-fixture.pdf") as pdf:
result = [inspect_page(page) for page in pdf]
assert [r["route"] for r in result] == [
"TEXT_CANDIDATE", "OCR_CANDIDATE", "REVIEW"]
assert result[1]["chars"] == 0
assert result[1]["largest_image_ratio"] == 1.0
pdf[1].set_rotation(90)
assert inspect_page(pdf[1])["route"] == "OCR_CANDIDATE"
print(json.dumps(result, indent=2))
Quando accedi all'OCR, metti in cache TextPage, non un indicatore di successo
L'interfaccia OCR di PyMuPDF è page.get_textpage_ocr(...). Tesseract e i relativi dati linguistici devono essere preparati separatamente. Dopo aver ottenuto una TextPage, l'estrazione successiva dovrebbe passarla come parametro textpage per evitare il riconoscimento di duplicati sulla stessa pagina. Per metodi e parametri di installazione specifici, si prega di consultare Documento OCR PyMuPDF.
Questo articolo non utilizza un motore OCR, quindi i risultati del test dimostrano solo che la logica di distribuzione e l'uso delle coordinate sono corretti, e non rappresentano il tasso di riconoscimento cinese, il tasso di recupero della tabella o la qualità della traduzione. In produzione, la versione del motore OCR, il pacchetto linguistico, il numero di pagina, il riassunto del file di input e i risultati del campionamento manuale devono essere registrati. Non tenere solo la stringa finale, altrimenti è difficile capire da quale pagina provenga un numero.
Tre tipi di difetti più facilmente trascurati
I livelli di testo nascosti possono essere testo distorto. Raggiungere il numero di caratteri significa solo "puoi continuare a tentare l'estrazione." Devi anche verificare se i caratteri sostituiti, le righe duplicate e i campi chiave corrispondono al rendering. Elementi chiave come il numero del contratto e l'importo devono essere ispezionati casualmente.
Il testo disegnato dal percorso vettoriale non è né testo né immagini. Entreranno nella REVISIONE. Non segnare automaticamente le pagine come vuote e non lasciarle cadere silenziosamente.
Usare Page dopo la chiusura del Documento comporterà un oggetto non valido. Per favore, mantieni l'ambito di with pymupdf.open(...) e rilascia il file solo dopo averlo pre-controllato, renderizzato ed estratto. Per maggiori dettagli su coordinate, informazioni sulle immagini e cicli di vita delle pagine, consulta PyMuPDF Page API.
I PDF non affidabili dovrebbero anche impostare la dimensione del file, il numero di pagine, i pixel di rendering, i limiti di tempo e memoria in un processo autonomo. L'esempio testa solo piccoli file e non fornisce un sandbox per file dannosi. Prima di produrre e utilizzare PyMuPDF, dovresti anche verificare i termini di licenza e il metodo di distribuzione.
Passaggio da flussi di lavoro a traduzione
Un output qualificato non è una sequenza di testo, ma un record con numeri di pagina e motivazioni per la decisione. Prima di tradurre, confermare quali pagine possono essere estratte in modo affidabile; Dopo la traduzione, vengono poi riesaminati contenuti, numeri e impaginazione. Puoi visualizzare i servizi di elaborazione documenti su Voce del prodotto OmniDoc. Il programma locale in questo articolo funziona in modo indipendente e non si basa su un account OmniDoc, né significa che sia un algoritmo di prodotto interno.
📊 Confronto tra i nuclei
| Percorso | Condizioni trigger | Pagina adatta | Rischi principali |
|---|---|---|---|
| Estrazione diretta (TEXT_CANDIDATE) | Almeno 40 caratteri non spaziati | La pagina del corpo del livello testuale esistente | I livelli OCR nascosti e scadenti possono contenere testo distorto |
| Candidati OCR (OCR_CANDIDATE) | Meno di 40 parole, con una singola immagine che copre almeno il 70% | Copia scansionata a pagina intera | Anche le foto pure soddisfano i requisiti, ma i risultati OCR potrebbero non essere significativi |
| Ispezione Manuale (REVISIONE) | Non rientra nelle due categorie sopra indicate | Pagine bianche, testo vettoriale, titoli scarsi, enigmi complessi | È necessario il giudizio manuale; saltare o scartare non può essere fatto automaticamente |
🎯 Quale metodo ti si addice?
Se ......
- Gestiva documenti misti, con grandi differenze di qualità tra le pagine frontali e posteriori: pre-check pagina per pagina, ciascuno con un percorso diverso.
- Gestire principalmente contratti, documenti finanziari e altri documenti contenenti numeri chiave: Per la pagina TEXT_CANDIDATE, controllare casualmente la corrispondenza tra numeri e rendering.
- Elaborazione batch delle scansioni: registrare versioni del motore, pacchetti linguistici e numeri di pagina per i risultati OCR per una facile tracciabilità.
- Ricevere PDF da fonti sconosciute: Impostare limiti di risorse nei processi autonomi; non elaborarli direttamente nel processo principale.
❓ Domande Frequenti (FAQ)
1. La homepage può copiare testo; posso saltare il processo OCR per l'intero PDF?
No, non puoi. Avere un livello di testo sulla prima pagina non significa che le pagine successive li abbiano anch'essi; dovresti giudicare pagina per pagina.
2. Perché non aggiungere direttamente l'area dell'immagine?
Aggiungere le immagini sovrapposte per area sovrastimarà il tasso di copertura. Questo articolo prende l'immagine più grande per superficie, quindi le pagine scansionate cucite insieme da più immagini possono rientrare nella sezione REVISIONE, che è un confine deliberato.
3. Se il numero di caratteri arriva a 40, significa che la qualità del testo è a posto?
Non si può concludere in questo modo. I livelli OCR nascosti e difettosi possono anche avere molti caratteri, quindi devi comunque controllare la presenza di caratteri sostitutivi, righe duplicate e campi di tasti punti.
4. Come dovrebbero essere gestiti i percorsi vettoriali disegnati dal testo disegnato?
Non sono né testo né immagini, inserisci RECENSIONE e sono giudicati manualmente; non dovrebbero essere automaticamente contrassegnati come pagine bianche o abbandonate silenziosamente.
5. Il programma locale si basa su un account OmniDoc?
Non dipendente. Il programma locale in questo articolo funziona in modo indipendente e non utilizza alcun servizio di OCR o traduzione online.
📝 Riassunto
Prima di tutto, lascia le prove pagina per pagina prima di decidere se condurre l'OCR. Lasciare pagine incerte in coda è più efficace che mascherare risultati incerti come successi.


