Comment l’élément fictif signale que les contraintes sont remplies
Cet élément auxiliaire est créé pour pouvoir toujours détecter quelque chose sur les images, à condition que la fonctionDontFind() (c’est-à-dire « arrêter la recherche ») ne soit pas activée. Le nombre d’hypothèses ne doit pas être trop élevé, afin d’éviter de développer excessivement l’arbre des hypothèses et d’augmenter le temps de mise en correspondance.
Pour y parvenir, vous pouvez utiliser, par exemple, des éléments de type Object Collection ou Paragraph. Ces éléments génèrent toujours une seule hypothèse qui inclut tous les objets du type spécifié dans la zone de recherche.
La section relations avancées de pré-recherche de l’élément fictif contient le jeu de conditions permettant de vérifier certains éléments situés sous l’élément fictif dans l’arborescence du projet. Si toutes les conditions sont remplies, la fonction DontFind() est appelée pour l’élément fictif.
Dans ce cas, une hypothèse nulle est générée pour l’élément fictif et sert de marqueur indiquant que toutes les conditions ont été remplies lorsque FlexiLayout Studio commence à rechercher d’autres éléments. Cela indique à FlexiLayout Studio de n’exécuter que la vérification IsNull de l’élément fictif au lieu de vérifier plusieurs fois les mêmes contraintes lourdes pour plusieurs éléments.
Cette méthode permet de rendre le code plus explicite. De plus, si vous devez modifier les contraintes, vous pouvez le faire uniquement dans la description de l’élément fictif. Cela réduit le risque d’erreurs logiques et syntaxiques lors de la duplication du code.
Les futures versions du produit devraient prendre en charge la création de variables dans la zone des sous-éléments des groupes. Les résultats de la vérification des contraintes seront alors stockés dans les valeurs de différentes variables.La méthode actuelle est une solution temporaire (solution de contournement) qui aide à simplifier le code dans les sections Advanced de la version actuelle de FlexiLayout Studio.
Les deux mises en page de facture dans le projet d’exemple
Le projet1.fsp (dossier %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Auxiliary element) montre le fonctionnement de cette méthode.
Sur ces images, l’objectif est de trouver les champs suivants : « Numéro de facture », « Date de la facture », « Nom de l’entreprise » et « Adresse de l’entreprise ».
Supposons que des factures de deux types différents doivent être traitées :
- Les champs « Nom de l’entreprise » et « Adresse de l’entreprise » se trouvent au-dessus du champ « Numéro de facture ».
- Les champs « Nom de l’entreprise » et « Adresse de l’entreprise » se trouvent en dessous du champ « Numéro de facture ».
Rechercher le champ de date avec deux jeux de contraintes
Le projet contient un élément Group InvoiceGroup avec les éléments InvoiceHeader, InvoiceNum et DateHeader, ainsi qu’un élément Group DateGroup. Ces sous-éléments sont nécessaires pour détecter les noms de champ ainsi que les champs “Numéro de facture” et “Date de la facture”.Pour plus d’informations sur les méthodes de recherche de date, voir Recherche de date après une reconnaissance de qualité élevée ou faible. Cette section décrit uniquement les contraintes de recherche de date dans ce projet.
if not DateHeader.IsNull est vérifiée), la recherche sera alors effectuée par rapport au nom du champ de date : à droite du nom, sur la même ligne horizontale, avec une certaine marge d’erreur pour le décalage vertical :
Par souci de simplicité, supposez que les images sont de bonne qualité et que le champ “Numéro de facture” ainsi que son nom sont toujours détectés.Dans une situation réelle, avant d’accéder aux propriétés de ces éléments, vous devez effectuer le test
IsNull, car si les éléments ne sont pas détectés, la recherche suivante sera effectuée par rapport aux zones de recherche des éléments correspondants.
Pénaliser les hypothèses de date éloignées des champs de la facture
La section Advanced post-search relations de l’élément Date contient le code suivant :Pour plus d’informations sur l’utilisation de ces fonctions, consultez Rechercher des éléments avec Nearest et FuzzyQuality.
Contraintes de recherche pour l’élément DateAsString
Des contraintes de recherche identiques sont spécifiées pour l’élément DateAsString, mais sa section Advanced post-search relations ajoute une ligne de plus au code présenté précédemment :RestrictSearchArea (Date.Rect);.
Cela indique à FlexiLayout Studio de rechercher l’objet de l’élément DateAsString dans la zone du rectangle flou de l’élément Date. La zone de recherche de l’élément Date peut être représentée comme un array de rectangles.
Lorsqu’une hypothèse nulle est générée pour l’élément Date, le rectangle englobant la zone de recherche est pris comme rectangle (Rect) de l’élément actuel. Comme vous pouvez le voir sur l’image suivante, il englobe également le champ “Numéro de facture” décrit par l’élément InvoiceNum.
Dans certaines conditions (par exemple, lorsque le champ de date est très bruité), il peut arriver qu’au lieu du champ de date, l’élément DateAsString détecte le champ du numéro de facture, car les caractères (y compris les chiffres) spécifiés pour cet élément ne sont soumis à aucune restriction de format.

Vérifier la disposition des champs à l’aide de l’élément auxiliaire ShamElement
Une fois les éléments nécessaires à la recherche des champs “Numéro de facture” et “Date de la facture” décrits, l’étape suivante consiste à rechercher les champs “Nom de l’entreprise” et “Adresse de l’entreprise”. Le projet utilise un élément Paragraph nommé ShamElement. Cet élément sert d’élément auxiliaire et est utilisé exclusivement pour vérifier la position relative des champs “Numéro de facture” et “Date de la facture”. La section relations avancées de pré-recherche de l’élément auxiliaire contient le code suivant :
Rechercher le nom de l’entreprise par rapport aux champs de la facture
Pour détecter les coordonnées de l’entreprise, le projet utilise un élément Group CompanyGroup. Il regroupe l’élément CompanyName de type Character String (sur les images de test, le nom de l’entreprise est écrit sur une seule ligne) et l’élément Address de type Paragraph. Ce dernier élément est utilisé pour rechercher le bloc contenant l’adresse de l’entreprise. L’utilisation de l’élément auxiliaire permet de simplifier le code qui décrit les contraintes de recherche de l’élément dans la section des relations avancées de pré-recherche. Si l’élément auxiliaire n’est pas détecté (c’est-à-dire qu’une hypothèse nulle est générée pour lui), cela signifie que le champ de date se trouve à droite du champ de la facture. Dans ce cas, le champ “Nom de l’entreprise” sera recherché sous le champ “Numéro de facture”. Si l’élément auxiliaire est détecté, le champ “Nom de l’entreprise” sera recherché au-dessus du champ “Numéro de facture”.Dans ce cas, la fonction
Nearest peut être utilisée, car elle permet de détecter avec précision et sans ambiguïté le champ contenant le nom de l’entreprise (aucun objet ne correspond aux mêmes contraintes de recherche).Above: InvoiceGroup.InvoiceHeader; et Above: InvoiceGroup.InvoiceNum; sont satisfaites non seulement par la chaîne contenant le nom de l’entreprise, mais aussi par les chaînes du champ d’adresse.

