Comment récupérer un montant en PDF, sa position sur la page
Cet article montre l'utilisation de PyMuPDF pour localiser un texte de quantité répétée dans un rectangle spécifié. En analysant les cinq premiers champs de l'octet de mots et en vérifiant le nombre de candidats, les erreurs d'appréciation lors de l'épissage des fragments peuvent être évitées. Fournit des exemples Python au niveau de la mémoire, des stratégies de traitement des limites et des tables d'acceptation, et donne des suggestions pratiques pour se connecter au flux de travail de traduction de documents OmniDoc.
Comment localiser les montants en double ? Conclusion en une phrase
Lorsque la mise en page est fixée, limitez d'abord la zone connue, puis vérifiez le texte et laissez le nombre de candidats à l'appréciation de l'appelant. Il est plus facile à interpréter que de continuer à empiler des expressions régulières, et il est moins susceptible de commettre des erreurs silencieuses.
| votre situation | Pratiques recommandées | raison |
|---|---|---|
| Le même montant apparaît à plusieurs endroits sur la page | Limitez la recherche à la zone rectangulaire où se situe le domaine d'activité puis recherchez | La recherche en texte intégral ne permet pas de déterminer quel champ correspond au domaine d'activité. |
| Il y a plusieurs candidats dans la zone de requête | Renvoie tous les candidats, combinés avec des étiquettes ou une homonymie manuelle | Les programmes ne devraient pas faire de choix pour l'entreprise |
| Il n'y a aucun résultat dans la zone de requête | Marquez la raison et vérifiez la page d'origine, pas de remplissage de zéros | Une mauvaise région, des montants fractionnés ou des calques de texte manquants peuvent entraîner un résultat nul. |
| La position du cadre semble décalée | Chaînes de transformation explicites pour la rotation, le recadrage et la mise à l'échelle du rendu | Le mélange des coordonnées d'affichage et des coordonnées extraites entraînera des écarts |
Deux montants identiques dans un seul relevé
1,200.00 apparaît deux fois dans un relevé : une fois dans la colonne montant dû et une fois dans le texte de description. La recherche en texte intégral peut les trouver, mais elle ne peut pas décider à votre place quel est le domaine d'activité.
Si la disposition du formulaire est fixe, il est généralement plus facile à interpréter en limitant d'abord une zone connue puis en recherchant dans le texte qu'en continuant à ajuster l'expression régulière. La clé n'est pas de "trouver une seule case", mais de traiter à la fois les résultats nuls et les résultats multiples comme des résultats clairs, et de ne pas laisser le programme faire des choix non autorisés.
Laissez la position du mot, pas seulement le texte
`page.get_text("words")` de PyMuPDF renvoie un enregistrement de mot avec position, le champ commun est (x0, y0, x1, y1, text, block_no, line_no, word_no). L'exemple suivant ne prend en compte que les cinq premiers champs et les trois derniers chiffres ne sont pas impliqués dans le filtrage régional pour le moment.
Le « mot » est ici le fragment donné par l'extracteur, qui n'est pas nécessairement égal à un mot au sens linguistique, et il n'est pas non plus garanti qu'un montant sera toujours un fragment complet. 1,200.00 peut être démonté ou peut avoir des balises adjacentes. Cet article ne traite que de la correspondance exacte de fragments complets : je préfère remettre les documents qui ne remplissent pas les conditions d'examen plutôt que de les regrouper discrètement en un montant apparemment légal.
Vérifiez avec deux pages synthétiques du même montant
Nous créons une nouvelle page PDF en mémoire et plaçons le même montant près des coordonnées verticales 120 et 420 respectivement. La zone de requête ne couvre que le montant ci-dessus.
Le point d'insertion du texte correspond à la position de base et non au coin supérieur gauche de la zone de texte. La hauteur et la largeur de la boîte réelle seront affectées par la police et la taille de la police, de sorte que les coordonnées ne peuvent pas être codées en dur dans une valeur fixe.
Une sortie correcte doit remplir deux conditions :
- Il n'y a qu'un seul candidat dans la zone de requête, et le rectangle candidat est entièrement inclus dans la zone.
- Après avoir étendu la portée de la requête à la page entière, deux candidats doivent être obtenus, entrant ainsi dans la branche d'ambiguïté.
Enfin, vérifiez qu'il n'y a aucun résultat avec une chaîne qui ne figure pas sur la page. C'est plus proche du contrat requis par une interface réelle que la simple démonstration d'une recherche réussie.
Code exécutable : transmettre le nombre de candidats à l'appelant
La dépendance est pymupdf, veuillez installer et verrouiller la version dans l'environnement de test. Le code suivant n'accède pas au réseau, n'écrit pas de fichiers et ne modifie pas le document client d'origine. Il construit uniquement un PDF de démonstration.
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 nécessite une inclusion complète, plutôt que de simplement toucher la limite de la région. Si la zone de requête est trop étroite, les montants latéraux peuvent tomber à zéro, ce qui n'est pas une raison pour laquelle elle devrait automatiquement s'élargir à la page entière. Vous devez vérifier le système de coordonnées utilisé lors de la mesure de la zone avant de décider comment ajuster la plage.
Si l'entreprise permet au point central de se situer, des règles supplémentaires doivent être écrites et des tests supplémentaires pour le chevauchement des limites doivent être effectués. Ne changez pas secrètement le sens du jugement dans la même fonction.
La logique de production ne doit pas s'appuyer uniquement sur assert pour intercepter les exceptions, car les modes d'optimisation peuvent supprimer des assertions. Les assertions de l'exemple sont utilisées pour la vérification de régression. Lors de l'accès réel à la file d'attente des tâches, des branches conditionnelles et des états métier clairs doivent être utilisés.
Trois résultats, trois méthodes de traitement
Les résultats des requêtes sont généralement divisés en trois catégories, chacune nécessitant des actions de traitement différentes :
- Un seul résultat : il n'y a qu'un seul fragment correspondant complet dans la zone, et le numéro de page, le texte original, le rectangle et la version de la règle sont enregistrés.
- Zéro hit : Il se peut que la zone soit incorrecte, que le montant soit divisé ou que le calque de texte soit manquant. Marquez la cause candidate, vérifiez la page originale et n'ajoutez pas de zéros.
- Plusieurs résultats : il y a des montants en double dans la même zone, ou le modèle a changé, renvoie tous les candidats, combine les étiquettes ou désambiguïsation manuelle.
Les deux autres situations doivent également être traitées séparément :
- Il y a un cadre mais la valeur est erronée : Le calque de texte lui-même est peut-être erroné, ou la cible correspondante est erronée. Vous devez revenir à la page d'origine pour vérifier et empêcher les coordonnées d'approuver la valeur.
- Décalage d'apparence de cadre : les coordonnées d'affichage et les coordonnées d'extraction peuvent être mélangées, et la chaîne de transformation de rotation, de recadrage et de mise à l'échelle du rendu doit être claire.
📊 Comparaison de base
| Méthode de requête | Critères de jugement | Il faut faire preuve de prudence |
|---|---|---|
| Inclusion complète (exemple utilisé) | Le rectangle candidat est entièrement placé dans la zone de requête | Si la boîte de requête est trop serrée, la quantité sur le bord peut être nulle correspondance |
| Le point central tombe (les règles doivent être rédigées séparément) | Les points centraux candidats se trouvent dans la région | Le chevauchement des limites nécessite des tests complémentaires séparés |
| Recherche de pages complètes | Recherchez tous les candidats | La plupart des résultats sont ambigus et nécessitent un signalement ou un jugement manuel supplémentaire |
Ce n’est pas un extracteur de quantité universelle
Le code n’analyse pas la monnaie, les séparateurs de mille milliers, ni les règles décimales, ni ne reconnaît des sémantiques telles que « période à payer en cours » et « solde de la période précédente ». Ce n’est pas parce qu’il n’y a qu’un seul candidat que le métier est le bon sens.
La copie numérisée doit également d’abord être disponible en texte et emplacement. Les pages avec des couches de texte mais un contenu incorrect ne peuvent pas être autorisées simplement parce qu’elles peuvent être copiées.
Cet article utilise une page de composition non rotative. Lorsque la page réelle tourne, spécifiez d’abord si la boîte de requête provient de l’écran d’affichage ou si elle extrait des coordonnées, et ne convertissez que si nécessaire. Ne multipliez pas par une matrice, quelle que soit la source.
Lors de l’enregistrement des pages sources, distinguez les index zéro à zéro des numéros de page en face de la personne afin d’éviter de croire à tort que des preuves n’existent pas lors de la vérification des pages adjacentes.
🎯 Quelle méthode te convient ?
Si vous devez extraire des données d’un formulaire de mise en page fixe
D’abord, restreignez la zone où se trouve le champ métier, puis cherchez le montant, et enregistrez le numéro de page, le rectangle et la version de la règle.
Si vous rencontrez plusieurs candidats
Ne prenez pas directement la première option ; retournez tous les candidats et déterminez les champs métier en fonction des tags ou du jugement manuel.
Si votre page devient souvent zéro coup
D’abord, vérifiez si les coordonnées de zone, la quantité et la couche texte existent, puis décidez si vous souhaitez ajuster la portée ou passer à d’autres itinéraires d’extraction.
Si tu veux faire de la traduction de documents
Des détails clés tels que la quantité, la date et la quantité sont inclus dans la revue manuelle, avec une division claire du travail entre inspection technique et examen manuel.
Laissez les chiffres clés pour la relecture de la traduction
La traduction des documents doit non seulement être basée sur la fluidité des phrases, mais aussi sur des éléments clés comme la quantité, la date et la quantité. OmniDoc (entrée produit) propose plusieurs portails de traduction de documents, et la comparaison bilingue introduite sur le site officiel peut servir de point d’entrée pour la révision ; Les scripts de positionnement coordonné conviennent pour préserver les preuves originales et aider à localiser les zones problématiques.
Il est recommandé d’évaluer d’abord en utilisant un échantillon de désensibilisation que vous avez autorisé à télécharger. À mesure que la traduction s’allonge, la position du contenu peut changer raisonnablement, et « les coordonnées nouvelles et anciennes sont exactement les mêmes » ne doit pas être pris comme une condition stricte pour une traduction correcte.
Des vérifications plus précieuses sont : si le montant est conservé, si la monnaie est clairement définie, et si l’étiquette correspondante indique toujours la même signification commerciale.
❓ Foire aux questions (FAQ)
1. Pourquoi ne pas simplement prendre la première bouffée ?
Parce que la recherche en texte intégral ne peut que vous indiquer où apparaît le montant, et ne peut pas déterminer quelle partie appartient au domaine métier. Prendre directement la première dose peut sembler correct, mais la source peut déjà se tromper.
2. Pourquoi la boîte de requête nécessite-t-elle une inclusion complète, plutôt que de simplement toucher le bord ?
L’exemple utilise une méthode de détermination entièrement incluse pour éviter de considérer les segments incomplets comme des correspondances valides. Si la boîte de requête est trop serrée et ne provoque aucun résultat, vérifiez d’abord le système de coordonnées et la plage, plutôt que d’élargir automatiquement toute la page.
3. Que faut-il faire lorsque le résultat de la requête est nul ?
Marquez la cause candidate et vérifiez la page originale ; n’ajoutez pas de zéros. Des régions incorrectes, des montants fractionnés ou des calques de texte manquants peuvent tous entraîner zéro impact.
4. Ce code peut-il être utilisé directement sur de vraies factures ?
Il ne peut pas être utilisé directement. L’exemple ne traite pas de monnaie, de séparateur de mille ou de sémantique commerciale, et l’exemple de synthèse dans cet article ne constitue pas un test de précision pour les billets réels.
📝 Résumé
Lors de la détermination du montant, il faut d’abord définir la zone, puis donner le nombre total de candidats à l’appelant pour jugement. Les coups zéro et multiple devraient comporter des actions de manipulation claires. D’abord, utilisez des échantillons anximisés pour valider les règles, puis intégrez progressivement de vrais documents.


