Pour détecter des champs sur une seule ligne, FlexiLayout Studio fournit un élément spécial Character String. Si le champ a un format connu, vous pouvez le décrire dans les propriétés de l’élément, dans le champ Regular expression de l’onglet Character String.
Cependant, l’utilisation d’une expression régulière exige des documents imprimés et une bonne qualité d’image, car une expression régulière ne tolère aucune erreur dans le champ ; sinon, l’élément ne sera tout simplement pas détecté.
Les expressions régulières ne doivent pas non plus être utilisées si le document est rempli à la main, même si sa mise en page peut être décrite. Néanmoins, un tel champ peut être détecté.
L’exemple de projet StructuredStrings.fsp
L’exemple de projet StructuredStrings.fsp montre comment rechercher un champ Numéro de facture sur une seule ligne avec un format similaire sur toutes les pages (dossier %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Structured strings).
Le projet comporte quatre pages :
- Pages 1 et 2 – Le champ Numéro de facture est imprimé avec une bonne qualité.
- Page 3 – Le champ Numéro de facture est imprimé, mais l’image est bruitée.
- Page 4 – La qualité de l’image est bonne, mais le champ Numéro de facture est rempli à la main.
Décrire le numéro de facture à l’aide d’une expression régulière
La recherche du champ Numéro de facture s’appuie sur le nom du champ. Il faut d’abord un élément décrivant les contraintes de recherche du nom du champ. Dans le projet, il s’agit d’un élément Static Text, nommé InvoiceNumberHeader, qui a pour valeur InvoiceN:.
Le champ Numéro de facture est un champ sur une seule ligne. Pour le détecter, le projet utilise un élément de type Character String, nommé NumAsRegularExpression. Comme on peut le voir sur les pages du projet, le format du champ Numéro de facture peut être décrit à l’aide de l’expression régulière suivante :
ou, ce qui revient au même :
Cela signifie que le numéro est une séquence de type : “quatre chiffres - deux chiffres - une lettre majuscule latine/deux chiffres”.
Comme on peut le voir dans le projet, après l’exécution de la procédure de mise en correspondance FlexiLayout en sélectionnant la commande Associer, des hypothèses nulles ont été générées pour l’élément NumAsRegularExpression aux pages 3 et 4, c’est-à-dire que l’élément n’a pas été détecté.
À la page 3, le bruit a entraîné une non-correspondance entre le champ et l’expression régulière. Si vous ouvrez la page 3 et cliquez sur L (Show Recognized Lines) dans la barre d’outils, la pré-reconnaissance du numéro de facture sur la page ressemble à 10&0-20-A/04.
À la page 4, le numéro de facture est rempli à la main. Le résultat de la pré-reconnaissance (Z.OOO-41-C/03) ne correspond pas non plus au format décrit.
Ajouter un élément Character String de secours avec un alphabet
La solution recommandée est la suivante : créez un élément Character String supplémentaire et nommez-le NumAsAlphabet. Appliquez-lui les mêmes contraintes de recherche qu’à l’élément NumAsRegularExpression. Regroupez ensuite les deux éléments dans un élément Group, InvoiceNumber.
Cependant, décrivez l’élément NumAsAlphabet non pas comme une expression régulière, mais comme une liste de tous les caractères valides.
Le code suivant doit être saisi dans le champ relations avancées de pré-recherche :
Cela signifie que la recherche d’une chaîne au format inconnu, décrite par l’élément NumAsAlphabet, ne sera tentée que si FlexiLayout Studio ne parvient pas à la détecter à l’aide de l’élément NumAsRegularExpression, qui décrit une chaîne à format fixe.
Lors de la définition des contraintes de recherche pour l’élément NumAsAlphabet, vous pouvez utiliser le glisser-déposer pour copier les paramètres de la section Relations de l’élément NumAsRegularExpression dans la même section de l’élément actuel. Vous pouvez également écrire le code suivant dans le champ relations avancées de pré-recherche :
Ce code signifie qu’une recherche de l’élément NumAsAlphabet ne sera tentée que si la structure du numéro de facture ne correspond pas au format spécifié, c’est-à-dire si FlexiLayout Studio n’a pas réussi à détecter l’élément NumAsRegularExpression. L’élément NumAsAlphabet sera alors recherché dans la même zone que celle où l’élément NumAsRegularExpression n’a pas été trouvé.
Exécutez maintenant à nouveau la procédure de mise en correspondance FlexiLayout sur toutes les pages. Comme le montre le projet, le champ Numéro de facture est désormais correctement détecté sur chacune des pages.
L’arborescence du projet contient un bloc de texte nommé InvoiceNum. Le groupe SearchElements.InvoiceNumber est spécifié comme élément source. À ce stade, le FlexiLayout permettant de détecter les champs Numéro de facture est terminé.
Si, pour une raison quelconque, la méthode décrite plus haut ne suffit pas à détecter le champ de données (que son format soit connu ou inconnu), un élément supplémentaire (de type Object Collection) peut être créé dans le groupe. Dans ce projet, il s’agit d’un élément Object Collection nommé NumAsObjectCollection.Il n’est en réalité pas nécessaire, compte tenu de la bonne qualité des images de ce projet, et n’est présenté qu’à titre d’exemple (la commande Disable lui est appliquée).Un élément Object Collection supplémentaire peut être nécessaire lorsqu’il est difficile de prévoir les résultats de pré-reconnaissance sur différentes pages, mais que la zone de recherche peut être décrite avec précision, ce qui empêche des informations indésirables d’être prises en compte dans les hypothèses.
Pourquoi l’expression régulière améliore la fiabilité
La question suivante peut se poser : pourquoi une expression régulière est-elle nécessaire si le champ peut parfois être détecté sans elle ? La réponse est que l’utilisation d’une expression régulière rend la recherche plus fiable.
Si cet élément est trouvé, vous pouvez alors être certain d’avoir trouvé exactement la ligne recherchée. Cette information peut ensuite être utilisée en toute sécurité pour détecter d’autres éléments et leurs relations. Lorsque les contraintes de recherche sont souples, vous ne pouvez pas être absolument certain d’avoir trouvé exactement ce dont vous avez besoin.
Cela peut se produire si l’image est très bruitée. Dans ce cas, l’utilisation d’un élément de type Character String avec un alphabet spécifié peut entraîner un pourcentage d’erreurs excessif (le paramètre Percentage of non-alphabet characters).
Par conséquent, l’élément ne sera soit pas détecté du tout, soit détecté seulement partiellement. La figure suivante montre un exemple d’une telle situation.