Passer au contenu principal
Ce chapitre décrit plusieurs méthodes courantes pour créer des FlexiLayouts capables de rechercher des champs de date dans des images de mauvaise qualité. De telles images sont assez fréquentes, avec divers défauts de numérisation dus principalement à des paramètres de numérisation incorrects. Par exemple, l’image peut être trop claire ou trop sombre si les paramètres de luminosité ne sont pas corrects. Il peut en résulter une perte d’informations dans l’image, ou bien certaines parties de l’image peuvent être bruitées. FlexiLayout Studio propose un élément Date spécial, utilisé pour détecter les dates. Cependant, lors de la création d’un FlexiLayout, vous pouvez constater que cet élément est insuffisant. Cela peut se produire lorsque la date figurant sur les documents ne correspond à aucun des formats disponibles dans l’élément Date. Par exemple, FlexiLayout Studio permet d’utiliser les langues suivantes pour spécifier le mois dans le champ de date : anglais, tchèque, danois, néerlandais, estonien, finnois, français, allemand, grec, hongrois, italien, letton, lituanien, norvégien, polonais, portugais, russe, espagnol, suédois, turc. Ainsi, si le mois est écrit en toutes lettres dans une langue autre que celles indiquées, la date ne correspondra à aucun des formats disponibles, et vous ne pourrez donc pas la détecter à l’aide d’un élément Date. Des erreurs de recherche de date peuvent également se produire si l’image comporte des éléments qui ne peuvent pas être supprimés. Par exemple, la date peut être soulignée sans qu’aucun espace visible n’apparaisse entre elle et le soulignement, barrée, ou écrite dans des cases de caractère avec des séparateurs noirs (cadres, peignes). L’impossibilité d’utiliser l’élément Date pour rechercher une date peut aussi être due à la présence de taches dans la zone de recherche, ou au fait que la date n’est pas saisie au clavier mais remplie à la main. La meilleure manière d’organiser la recherche d’un champ de date est décrite dans l’exemple de projet SearchOfDate.fsp (dossier %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Date). Le projet comporte 5 pages :
  • Page 1 - le format de date peut être décrit à l’aide de l’élément Date ;
  • Page 2 - le mois de la date est écrit en français ;
  • Page 3 - la date est soulignée ;
  • Page 4 - le champ de date est bruité ;
  • Page 5 - la date est remplie à la main.
Essayons de trouver la date sur toutes les images, y compris celles où le format de date n’est pas pris en charge par l’élément de type Date. Tous les éléments décrivant le champ de date sont regroupés dans un élément DateGroup. Tout d’abord, ce groupe contient un élément qui recherche le nom du champ de date. Dans notre projet, il s’agit d’un élément de type Static Text nommé DateHeader avec pour seule valeur ‘Date :’.
La configuration des contraintes de recherche pour tous les éléments dans la section Relations n’est pas difficile et n’est donc pas décrite ici. Vous pouvez la consulter directement dans le projet.
Ensuite, nous créons un élément de type Date nommé DateField. Cet élément recherchera les champs de date dont le format est pris en charge par l’élément Date. Comme on le voit dans le projet, l’élément Date ne peut détecter la date que sur la première page. Pour rechercher des dates sur les autres pages, un élément de type Character String est créé. Dans notre projet, cet élément est nommé DateAsString. Tous les caractères susceptibles d’apparaître dans les images sont représentés dans cet élément au moyen d’un alphabet.
Si le contenu d’un champ de données peut être structuré et présente un format qui n’est pas pris en charge par l’élément Date, il est conseillé, au lieu de spécifier un alphabet, de décrire ce format à l’aide d’une expression régulière. Toutefois, vous devez être certain de la haute qualité des images traitées, car une expression régulière suppose une correspondance à 100 % entre le champ et la structure décrite (les alphabets, en revanche, autorisent un certain pourcentage d’erreurs, qui est spécifié dans les propriétés de l’élément). Les alphabets constituent donc un outil plus souple dans les cas où la précision de la reconnaissance ne peut pas être garantie. Si vous savez que le mois dans la date sera écrit en toutes lettres dans la même langue que celle de la pré-reconnaissance, il peut alors être judicieux de diviser le champ de date en trois sections (jour, mois, année) et de rechercher séparément le champ du mois à l’aide d’un élément de type Static Text. Un tel élément Static Text doit décrire toutes les variantes possibles du mois (par exemple, les noms complets et abrégés du mois dans la langue donnée). Les champs du jour et de l’année seront ensuite recherchés à droite et à gauche du mois au moyen d’éléments de type Character String.
Pour optimiser la mise en correspondance de FlexiLayout, la condition suivante est définie dans le champ Relations avancées avant recherche pour l’élément DateAsString : if (DateField.IsNull == FALSE) then Dontfind(); ce qui équivaut à : if not DateField.IsNull then Dontfind(); Cette condition signifie qu’une recherche de la date sous forme de chaîne de caractères ne sera lancée que si la date ne peut pas être détectée à l’aide d’un élément Date. Comme le montre le projet, l’élément DateAsString trouve la date sur les autres pages du projet, là où elle n’a pas pu être détectée par l’élément de type Date. À la page 4, toutefois, la chaîne détectée ne contient qu’une partie du champ de date. Si vous examinez les résultats de pré-reconnaissance pour le champ de date (en cliquant sur Show Raw Objects dans la barre d’outils), la raison de cette détection partielle devient claire : la zone de recherche contient non seulement des objet texte, mais aussi d’autres types d’objets : Picture et Punctuation mark. Une telle situation est typique des images de faible qualité : lors de la pré-reconnaissance, les objet texte ne sont pas toujours reconnus. Pour trouver tous les objets associés au champ de date, un élément de type Object Collection est créé et nommé DateAsObjectCollection. Tous les types d’objets détectés dans le champ de date lors de la pré-reconnaissance sont spécifiés dans les propriétés de l’élément. Pour optimiser la mise en correspondance de FlexiLayout, la condition suivante est définie dans le champ Relations avancées avant recherche pour les éléments DateAsObjectCollection et DateAsString :
if (DateField.IsNull == FALSE) then Dontfind();
La condition if (DateAsString.IsNull == FALSE) then Dontfind() ne peut pas être ajoutée aux propriétés avancées de l’élément DateAsObjectCollection, car, comme le montre clairement l’exemple, il peut arriver que la chaîne détectée ne contienne qu’une partie de la date.
À ce stade, la création des éléments décrivant les contraintes de recherche pour les champs de date peut être considérée comme terminée. L’élément Group SearchElements.DateGroup.AlternativeDateGroup, qui se compose des éléments DateField, DateAsString et DateAsObjectCollection, est spécifié dans l’arborescence du projet comme élément source du bloc Date. Étant donné que la méthode Dontfind() a été utilisée pour définir les propriétés des éléments DateAsString et DateAsObjectCollection, la région réelle du bloc détecté correspondra soit à la région trouvée par l’hypothèse pour l’élément Date, soit aux régions combinées des éléments DateAsObjectCollection et DateAsString. Dans ce dernier cas, nous nous attendons à ce que la région de l’élément DateAsString fasse partie de celle de l’élément DateAsObjectCollection ; la région résultante sera donc celle de l’élément DateAsObjectCollection.
Dans ce cas, nous pouvons spécifier l’élément Group SearchElements.DateGroup.AlternativeDateGroup comme élément source, car la situation est relativement simple. La région du groupe est une combinaison des régions de ses sous-éléments détectés. La méthode Dontfind() permet d’ignorer la recherche de certains sous-éléments. Ainsi, la région de l’élément Group SearchElements.DateGroup.AlternativeDateGroup correspondra à la région du sous-élément. Dans l’exemple donné, la méthode Dontfind() aide non seulement à optimiser la mise en correspondance FlexiLayout, mais simplifie également la description des blocs.
Sinon, nous pourrions utiliser le code indiqué dans la section Expression. Rect OutputRect; let dateGroup = SearchElements.DateGroup.AlternativeDateGroup; if (dateGroup.DateField.IsNull == FALSE) then outputRect = dateGroup.DateField.Rect; else outputRect = dateGroup.DateAsObjectCollection.Rect; OutputRegion = outputRect; L’utilisation d’une expression offre des options supplémentaires. Par exemple, nous pourrions vérifier si la région de l’élément DateAsString fait réellement partie de celle de DateAsObjectCollection.
L’utilisation d’un élément Character String pour rechercher un champ de date, sans définir le format de la chaîne ni utiliser un élément de type Object Collection, comme dans l’exemple donné, peut donner de bons résultats si la zone de recherche du champ de date peut être clairement délimitée. En revanche, s’il y a plusieurs chaînes de caractères dans la zone de recherche, le format de la chaîne doit être décrit au moyen d’une expression régulière ou d’un alphabet plus restreint. Sinon, l’hypothèse finale risque d’être peu satisfaisante. En utilisant l’élément de type Character String, l’utilisateur peut limiter le nombre de caractères dans une chaîne, le nombre de fins de mot et la longueur des espaces afin d’écarter les hypothèses erronées. Si un élément de type Object Collection est utilisé, l’hypothèse inclura tous les objets de l’image situés dans la zone de recherche et répondant aux contraintes de taille des objets.