Le PDF nécessite-t-il l'OCR ? Utilisez PyMuPDF pour effectuer un contrôle en amont page par page au lieu d'une re-reconnaissance complète
Si vous souhaitez effectuer une OCR sur le PDF, il n'est pas nécessaire de reconnaître à nouveau l'intégralité du PDF. Utilisez PyMuPDF pour déterminer page par page s'il existe un calque de texte et s'il s'agit d'une image pleine page, et envoyez uniquement les pages réellement nécessaires à la reconnaissance. Vous trouverez ci-joint des exemples exécutables, des tests de page tournante et des instructions sur les limites de branche.
Lorsque de nombreuses équipes s'occupent de traduction ou d'archivage de PDF, elles ont l'habitude d'étiqueter l'intégralité du document comme « numérisé » ou « copiable » à l'entrée. Un PDF de 300 pages peut contenir les 280 premières pages avec des calques de texte et seulement les 20 dernières pages sous forme de pièces jointes numérisées. S'il est classé par parties entières, l'OCR dans son intégralité augmentera le temps d'attente et pourra également fausser l'identification des numéros initialement corrects. D’un autre côté, si vous ne pouvez copier que du texte sur la page d’accueil et ignorer l’OCR sur toutes les pages, c’est également risqué.
Une approche plus fiable consiste à laisser chaque page passer à l'étape suivante avec les résultats du contrôle en amont. Cet article implémente une répartition prudente en trois : extraction directe, envoi à la file d'attente des candidats OCR et inspection manuelle. Il s'agit d'une heuristique d'ingénierie interprétable, et non d'un classificateur universel pour juger de la qualité du texte. Après avoir lu, vous pouvez obtenir un programme de contrôle en amont page par page exécutable, ainsi que des limites de détournement et des idées courantes de gestion des pannes.
Conclusion en une phrase
Il n'est pas nécessaire de juger si le PDF nécessite une OCR. Utilisez PyMuPDF pour pré-vérifier page par page et envoyer uniquement les pages qui ont vraiment besoin d'être reconnues à l'OCR.
| votre situation | Pratiques recommandées | raison |
|---|---|---|
| Extrayez au moins 40 caractères autres que des espaces d'une seule page | Extraction directe (TEXT_CANDIDATE) | Vous disposez déjà de suffisamment de caractères, mais vous devez encore vérifier ponctuellement les mauvaises couches OCR cachées. |
| Moins de 40 mots et une seule image couvrant au moins 70 % de la page | Envoyer à la file d'attente des candidats OCR | Les numérisations pleine page conviennent à l’identification, mais des photos pures suffiront également. |
| Page blanche, type vectoriel, titre clairsemé ou puzzle complexe | Inspection manuelle (REVUE) | Ces situations ne peuvent pas être classées de manière fiable dans les deux premières catégories et ne peuvent pas être automatiquement ignorées ou rejetées. |
| Un document hybride de 300 pages | Contrôle en amont page par page, traitement non terminé | Évitez d'effectuer l'OCR sur toutes les pages en raison de quelques pièces jointes numérisées, ou d'ignorer toutes les OCR car il y a du texte sur la page d'accueil. |
Remarque : Le contenu de l'image provient du PDF synthétisé généré par le code ci-dessous, et non de la fiche client, ni de l'interface OmniDoc. Le texte sur la page d'image est constitué de pixels raster ; le texte sur la page de texte a un véritable calque de texte.
Décidez quoi vérifier en premier
Deux signaux sont utilisés ici : le nombre de caractères de texte après suppression des espaces et la proportion de la zone de page occupée par la plus grande image de la page. Le premier répond « Avez-vous extrait suffisamment de caractères ? » et cette dernière permet de faire la différence entre une numérisation pleine page et une page blanche. La zone d'image croisera d'abord la zone de recadrage pour éviter de dépasser le taux d'agrandissement de l'image sur la page.
| observation | Détournement de cet article | J'ai encore besoin d'attention |
|---|---|---|
| Au moins 40 caractères autres que des espaces | TEXT_CANDIDATE | La couche cachée de mauvais OCR peut aussi contenir beaucoup de mots |
| Moins de 40 mots et au moins 70 % de couverture d’une seule image | OCR_CANDIDATE | Les photos pures répondent également aux exigences ; l’OCR peut ne pas être pertinent |
| Le reste de la situation | REVIEW | Des espaces vides, du texte vectoriel, des titres clairsemés et des casse-têtes complexes peuvent tous être là |
Les seuils de 40 et 0,70 visent à faciliter l’audit de cet ensemble de tests, et non aux normes interlinguistiques. Le chinois, les formules, les couvertures et les formes courtes doivent être étiquetés séparément. Ici, la plus grande image par aire est prise, plutôt que d’ajouter simplement les zones des images qui se chevauchent. Par conséquent, une page numérisée composée de plusieurs images peut finir en RÉVISION. C’est une frontière délibérément préservée.
Échantillon complet utilisable
L’exemple utilise PyMuPDF==1.28.0, ne s’appuie pas sur Tesseract, et n’appelle aucun service OCR ou traduction en ligne. Enregistrez sous example.py et exécutez-le dans un dossier vide. Le nom du fichier qu’il crée est fixé à routing-fixture.pdf. Pour les projets réels, merci de ne pas écraser les fichiers d’entrée.
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))
Lors de l’accès à l’OCR, mettez en cache TextPage, pas un marqueur de réussite
L’interface OCR de PyMuPDF est page.get_textpage_ocr(...). Tesseract et ses données linguistiques correspondantes doivent être préparés séparément. Après avoir obtenu une page de texte, l’extraction ultérieure doit la passer comme paramètre textpage afin d’éviter la reconnaissance de doublons sur la même page. Pour des méthodes et paramètres d’installation spécifiques, veuillez consulter Document OCR PyMuPDF.
Cet article ne fait pas tourner un moteur OCR, donc les résultats du test prouvent seulement que la logique de distribution et l’utilisation des coordonnées sont correctes, et ne représentent pas le taux de reconnaissance chinois, le taux de récupération de table ou la qualité de traduction. En production, la version du moteur OCR, le pack de langues, le numéro de page, le résumé du fichier d’entrée et les résultats d’échantillonnage manuel doivent être enregistrés. Ne garde pas seulement la dernière chaîne, sinon il est difficile d’interpréter de quelle page vient un chiffre.
Trois types de défauts les plus facilement négligés
Les calques de texte cachés peuvent être du texte brouillé. Atteindre le nombre de caractères signifie seulement « vous pouvez continuer à tenter l’extraction ». Vous devez également vérifier si les caractères remplacés, les lignes dupliquées et les champs clés correspondent au rendu. Les éléments clés tels que le numéro de contrat et le montant doivent être inspectés de manière aléatoire.
Le texte tracé par le chemin vectoriel n’est ni texte ni images. Ils vont entrer en RÉVISION. Ne marquez pas automatiquement les pages comme vides, et ne les laissez pas tomber silencieusement.
Utiliser Page après la fermeture du document entraînera un objet invalide. Veuillez conserver la portée de with pymupdf.open(...) et ne libérer le fichier qu’après vérification, rendu et extraction. Pour plus de détails sur les coordonnées, les informations sur les images et les cycles de vie des pages, consultez PyMuPDF Page API.
Les PDF non fiables doivent également définir la taille des fichiers, le nombre de pages, les pixels de rendu, le temps et les limites de mémoire dans un processus autonome. L’exemple ne teste que de petits fichiers et ne fournit pas de bac à sable pour les fichiers malveillants. Avant de produire et d’utiliser PyMuPDF, vous devez également vérifier ses conditions de licence et votre méthode de distribution.
Transition des flux de flux vers le flux de travail de traduction
Une sortie qualifiée n’est pas une chaîne de texte, mais un enregistrement avec des numéros de page et des raisons de décision. Avant de traduire, confirmez quelles pages peuvent être extraites de manière fiable ; Après traduction, le contenu, les chiffres et la mise en page sont ensuite examinés. Vous pouvez consulter les services de traitement de documents sur Entrée du produit OmniDoc. Le programme local dans cet article fonctionne de manière indépendante et ne s’appuie pas sur un compte OmniDoc, ni ne signifie qu’il s’agit d’un algorithme produit interne.
📊 Comparaison des noyaux
| Itinéraire | Conditions déclencheuses | Page appropriée | Risques majeurs |
|---|---|---|---|
| Extraction directe (TEXT_CANDIDATE) | Au moins 40 caractères non espacés | La page de corps du calque texte existant | Les couches OCR défectueuses cachées peuvent contenir du texte brouillé |
| Candidats OCR (OCR_CANDIDATE) | Moins de 40 mots, avec une seule image couvrant au moins 70 % | Copie numérisée pleine page | Les photos pures répondent également aux exigences, mais les résultats OCR peuvent ne pas être significatifs |
| Inspection manuelle (EXAMEN) | Il ne correspond pas aux deux catégories ci-dessus | Pages blanches, texte vectoriel, titres clairsemés, énigmes complexes | Un jugement manuel est requis ; le saut ou le rejet ne peuvent pas être effectués automatiquement |
🎯 Quelle méthode te convient ?
Si tu ......
- Traitait des documents mixtes, avec de grandes différences de qualité entre les pages avant et arrière : page par page pré-vérifié, chacun empruntant un itinéraire différent.
- Gérer principalement les contrats, documents financiers et autres documents contenant des numéros clés : Pour la page TEXT_CANDIDATE, vérifier aléatoirement la correspondance entre les chiffres et les rendus.
- Traitement par lots des scans : versions du moteur d’enregistrement, packs de langues et numéros de page pour les résultats OCR pour une traçabilité facile.
- Recevoir des PDF de sources inconnues : définir des limites de ressources dans des processus autonomes ; ne pas les traiter directement dans le processus principal.
❓ Foire aux questions (FAQ)
1. La page d’accueil peut copier du texte ; puis-je sauter le processus OCR pour l’intégralité du PDF ?
Non, tu ne peux pas. Avoir une couche de texte sur la première page ne signifie pas que les pages suivantes en ont aussi ; vous devez juger page par page.
2. Pourquoi ne pas simplement ajouter la zone de l’image directement ?
Ajouter les images qui se chevauchent par zone surestimera le taux de couverture. Cet article prend la plus grande image en surface, donc les pages numérisées assemblées à partir de plusieurs images peuvent rejoindre la section CRITIQUE, qui constitue une frontière délibérée.
3. Si le nombre de caractères atteint 40, cela signifie-t-il que la qualité du texte est correcte ?
Cela ne peut pas être conclu ainsi. Les couches OCR cachées peuvent aussi contenir beaucoup de caractères, donc il faut quand même vérifier s’il y a des caractères de remplacement, des lignes dupliquées et des champs de touches de point.
4. Comment le texte dessiné sur les chemins vectoriels doit-il être géré ?
Ce ne sont ni du texte ni des images, entrez REVIEW, et sont jugées manuellement ; elles ne doivent pas être automatiquement marquées comme des pages vierges ou supprimées silencieusement.
5. Le programme local dépend-il d’un compte OmniDoc ?
Pas dépendante. Le programme local mentionné dans cet article fonctionne de manière indépendante et ne propose aucun service de reconnaissance ou de traduction en ligne.
📝 Résumé
Tout d’abord, laissez les preuves page par page avant de décider s’il faut effectuer un OCR. Laisser des pages incertaines dans la file d’attente est plus efficace que de déguiser des résultats incertains en succès.


