Vereist PDF OCR? Gebruik PyMuPDF om pagina-voor-pagina preflight uit te voeren in plaats van volledige herherkenning
Als u de PDF wilt OCR-en, hoeft u niet de hele PDF opnieuw te herkennen. Bepaal met PyMuPDF pagina voor pagina of er sprake is van een tekstlaag en of het om een paginagrote afbeelding gaat, en stuur alleen de pagina's mee die echt nodig zijn voor herkenning. Bijgevoegd zijn uitvoerbare voorbeelden, roterende paginatests en instructies voor de afbakening.
Wanneer veel teams te maken hebben met PDF-vertaling of -archivering, zijn ze eraan gewend om het hele document bij binnenkomst als 'gescand' of 'kopieerbaar' te bestempelen. Een PDF van 300 pagina's kan de eerste 280 pagina's met tekstlagen bevatten, en alleen de laatste 20 pagina's als gescande bijlagen. Als de volledige OCR wordt geclassificeerd in hele delen, zal de wachttijd toenemen en kunnen de oorspronkelijk correcte cijfers ook verkeerd worden geïdentificeerd. Aan de andere kant is het ook riskant als u alleen tekst op de startpagina kunt kopiëren en OCR op alle pagina's kunt overslaan.
Een betrouwbaardere aanpak is om elke pagina met de resultaten van de preflight naar de volgende stap te laten gaan. In dit artikel wordt een conservatieve driedeling geïmplementeerd: directe extractie, verzending naar de wachtrij voor OCR-kandidaten en handmatige inspectie. Het is een interpreteerbare technische heuristiek, geen universele classificatie voor het beoordelen van tekstkwaliteit. Na het lezen kunt u een uitvoerbaar preflightprogramma per pagina krijgen, evenals omleidingsgrenzen en algemene ideeën voor foutafhandeling.
Eén zin conclusie
U hoeft niet te beoordelen of de PDF OCR vereist. Gebruik PyMuPDF om pagina voor pagina vooraf te controleren en stuur alleen de pagina's die echt herkend moeten worden naar OCR.
| jouw situatie | Aanbevolen praktijken | reden |
|---|---|---|
| Extraheer minimaal 40 niet-witruimtetekens van één pagina | Directe extractie (TEXT_CANDIDATE) | U heeft al voldoende tekens, maar moet nog steeds controleren op verborgen slechte OCR-lagen |
| Minder dan 40 woorden en één enkele afbeelding die minstens 70% van de pagina beslaat | Verzenden naar OCR-kandidaatwachtrij | Voor identificatie zijn paginagrote scans geschikt, maar ook pure foto's zijn voldoende. |
| Lege pagina, vectortype, dunne titel of complexe puzzel | Handmatige inspectie (REVIEW) | Deze situaties kunnen niet op betrouwbare wijze in de eerste twee categorieën worden ingedeeld en kunnen niet automatisch worden overgeslagen of terzijde worden geschoven. |
| Een hybride document van 300 pagina's | Pagina voor pagina een preflight uitvoeren, geen volledige verwerking | Vermijd het OCR-en van alle pagina's vanwege een paar gescande bijlagen, of het overslaan van alle OCR omdat er tekst op de startpagina staat |
Opmerking: De inhoud op de afbeelding is afkomstig van de gesynthetiseerde PDF die is gegenereerd door de onderstaande code, niet van het klantenbestand, noch van de OmniDoc-interface. De tekst op de afbeeldingspagina bestaat uit rasterpixels; de tekst op de tekstpagina heeft een echte tekstlaag.
Bepaal wat je eerst wilt controleren
Hier worden twee signalen gebruikt: het aantal teksttekens na het verwijderen van witruimte, en het deel van het paginagebied dat wordt ingenomen door de grootste afbeelding op de pagina. De eerste antwoordt: "Zijn er genoeg karakters geëxtraheerd?" en dit laatste helpt onderscheid te maken tussen een scan van een volledige pagina en een blanco pagina. Het afbeeldingsgebied zal eerst het bijsnijdvak kruisen om te voorkomen dat de afbeeldingsvergrotingsfactor op de pagina wordt overschreden.
| observatie | Afleiding van dit artikel | Heeft nog aandacht nodig |
|---|---|---|
| Minimaal 40 niet-witruimtetekens | TEXT_CANDIDATE | Verborgen slechte OCR-lagen kunnen ook veel woorden bevatten |
| Minder dan 40 woorden en één enkele afbeelding die minstens 70% bestrijkt | OCR_KANDIDAAT | Zuivere foto's voldoen ook aan de voorwaarden, OCR heeft mogelijk geen betekenis |
| Rest van de gevallen | REVIEW | Witruimte, vectortype, spaarzame titels en complexe puzzels zijn hier allemaal mogelijk |
De drempelwaarden 40 en 0,70 zijn bedoeld om deze reeks tests gemakkelijk te kunnen controleren en zijn geen taaloverschrijdende standaarden. Chinees, formule-, omslag- en korte formulieren moeten afzonderlijk worden gekalibreerd. Hier wordt de foto met het grootste gebied genomen in plaats van eenvoudigweg de gebieden van overlappende foto's toe te voegen, zodat een gescande pagina die uit meerdere foto's bestaat mogelijk in REVIEW valt. Dit is een opzettelijk gereserveerde grens.
Compleet uitvoerbaar voorbeeld
Het voorbeeld maakt gebruik van PyMuPDF==1.28.0, is niet afhankelijk van Tesseract en roept geen online OCR- of vertaaldiensten aan. Sla het op als example.py en voer het uit in een lege map. De bestandsnaam die wordt aangemaakt, is vast ingesteld op routing-fixture.pdf. Overschrijf het invoerbestand in echte projecten niet.
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))
Bij toegang tot OCR wordt de TextPage in de cache opgeslagen in plaats van een succesmarkering.
De OCR-interface van PyMuPDF is page.get_textpage_ocr(...). Tesseract en bijbehorende taalgegevens moeten afzonderlijk worden voorbereid. Nadat u de TextPage heeft opgehaald, moet deze tijdens de daaropvolgende extractie worden doorgegeven als de parameter textpage om herhaalde herkenning van dezelfde pagina te voorkomen. Raadpleeg PyMuPDF OCR-documentatie voor specifieke installatiemethoden en parameters.
In dit artikel is de OCR-engine niet gebruikt, dus de testresultaten kunnen alleen bewijzen dat de omleidingslogica en coördinaten correct worden gebruikt en niet het Chinese herkenningspercentage, tabelherstelpercentage of vertaalkwaliteit vertegenwoordigen. De OCR-engineversie, het taalpakket, het paginanummer, de samenvatting van het invoerbestand en de handmatige inspectieresultaten moeten in de productieomgeving worden vastgelegd. Houd niet alleen de laatste string aan, anders wordt het moeilijk uit te leggen van welke pagina een bepaald nummer afkomstig is.
Drie soorten fouten die het gemakkelijkst worden gemist
De verborgen tekstlaag kan onleesbaar zijn. Als het aantal tekens de standaard bereikt, betekent dit alleen "u kunt blijven proberen te extraheren". U moet ook controleren of vervangende tekens, herhaalde regels en sleutelvelden overeenkomen met de weergave. Belangrijke inhoud zoals contractnummer en bedrag moeten willekeurig worden gecontroleerd.
De woorden getekend door vectorpaden zijn geen tekst of afbeeldingen. Ze komen in REVIEW. Markeer ze niet automatisch als leeg en laat pagina's niet stilletjes vallen.
Het sluiten van het document en het vervolgens gebruiken van Pagina genereert ongeldige objecten. Houd de reikwijdte van with pymupdf.open(...) aan en voltooi de preflight, rendering en extractie voordat u het bestand vrijgeeft. Voor meer details over coördinaten, afbeeldingsinformatie en paginalevenscyclus raadpleegt u PyMuPDF Page API.
Voor niet-vertrouwde PDF's moeten ook de bestandsgrootte, het aantal pagina's, de weergegeven pixels, de tijd en de geheugenlimieten in een afzonderlijk proces worden ingesteld. In het voorbeeld worden alleen kleine bestanden getest en wordt er geen kwaadaardige bestandensandbox aangeboden. Voordat u PyMuPDF in productie gebruikt, moet u ook de licentievoorwaarden en uw distributiemethode controleren.
Voer de vertaalworkflow in vanaf omleiding
Gekwalificeerde uitvoer is geen tekstreeks, maar een record met paginanummers en redenen voor de beslissing. Controleer vóór het vertalen welke pagina's betrouwbaar kunnen worden geëxtraheerd; controleer en accepteer de inhoud, cijfers en lay-out na vertaling. U kunt documentverwerkingsdiensten bekijken op OmniDoc-productportaal. Het lokale programma in dit artikel werkt onafhankelijk en is niet afhankelijk van het OmniDoc-account, en het betekent ook niet dat dit het algoritme in het product is.
📊 Kernvergelijking
| route | Triggerconditie | geschikte pagina | Belangrijkste risico's |
|---|---|---|---|
| Directe extractie (TEXT_CANDIDATE) | Minimaal 40 niet-witruimtetekens | Tekstpagina met bestaande tekstlaag | Een verborgen slechte OCR-laag kan verminkte tekens bevatten |
| OCR-kandidaat (OCR_CANDIDATE) | Minder dan 40 woorden en één enkele afbeelding die minstens 70% bestrijkt | Volledige pagina scannen | Zuivere foto's voldoen ook aan de voorwaarden, maar de OCR-resultaten zijn mogelijk niet betekenisvol. |
| Handmatige inspectie (REVIEW) | Voldoet niet aan de twee bovenstaande categorieën | Lege pagina, vectortype, dunne titel, complexe puzzel | Handmatige beoordeling is vereist en kan niet automatisch worden overgeslagen of weggegooid. |
🎯 Welke methode is geschikt voor jou?
als je……
- We hebben te maken met gemengde documenten en de kwaliteit van de voor- en achterpagina's is heel verschillend: controleer pagina voor pagina vooraf en voer respectievelijk verschillende routes in.
- Behandel voornamelijk documenten met kerncijfers zoals contracten en financiën: de TEXT_CANDIDATE-pagina moet ook willekeurig worden gecontroleerd op overeenstemming tussen cijfers en weergaven.
- Noodzaak om scans in batches te verwerken: leg de engineversie, het taalpakket en het paginanummer vast voor OCR-resultaten, zodat u deze gemakkelijk kunt terugvinden.
- PDF's ontvangen van onbekende bronnen: stel resourcelimieten in een apart proces in, verwerk ze niet rechtstreeks in het hoofdprogramma.
❓ Veelgestelde vragen (FAQ)
1. Tekst kan op de startpagina worden gekopieerd. Kan ik de OCR van de gehele PDF overslaan?
Kan niet. Het feit dat de startpagina een tekstlaag heeft, betekent niet dat volgende pagina's deze ook zullen hebben en pagina voor pagina moeten worden beoordeeld.
2. Waarom voegt u de afbeeldingsgebieden niet rechtstreeks toe?
Als u de gebieden met overlappende afbeeldingen toevoegt, wordt de dekking overschat. Dit artikel gebruikt de grootste afbeelding, dus een gescande pagina met meerdere aan elkaar geplakte afbeeldingen kan in REVIEW vallen, wat een grens is die opzettelijk wordt behouden.
3. Als het aantal tekens de 40 bereikt, betekent dit dan dat er geen probleem is met de tekstkwaliteit?
Zo kan het niet worden geconcludeerd. Verborgen slechte OCR-lagen kunnen ook veel woorden bevatten, dus controleer nog steeds op vervangende tekens, dubbele regels en steekproeven voor sleutelvelden.
4. Hoe moet de tekst die door een vectorpad wordt getekend, worden verwerkt?
Ze zijn geen tekst of afbeeldingen, komen in REVIEW terecht, worden door mensen beoordeeld en mogen niet automatisch als blanco worden gemarkeerd of stilzwijgend worden verwijderd.
5. Is het lokale programma afhankelijk van het OmniDoc-account?
Niet afhankelijk. Het lokale programma voor dit artikel draait onafhankelijk en roept geen online OCR- of vertaaldiensten op.
📝 Samenvatting
Laat het bewijsmateriaal eerst pagina voor pagina achter en beslis dan of u OCR wilt uitvoeren. Het is nuttiger om onzekere pagina's in de wachtrij te laten staan dan onzekere resultaten als succes te vermommen.


