Lors de la création d’un FlexiLayout, les zones de recherche ne peuvent pas toujours être définies en termes de « top-bottom-left of-right of ». C’est particulièrement vrai lorsque la zone de recherche contient des objets indésirables, par ex. des objets qui ont pu être introduits lors de la numérisation. Ces objets ne doivent pas être inclus dans le bloc de reconnaissance ; ils doivent donc être exclus lors de la création de l’élément correspondant. Le champ d’adresse dans les figures ci-dessous en est un bon exemple. Il est ici question de la position relative des noms de champ « Address: », « (Address) » (qui doivent être exclus de la reconnaissance) et de l’adresse elle-même (qui doit être reconnue).
La fonction Exclude exclut une Region de la zone de recherche d’un élément. La Region à exclure est spécifiée lors de l’appel de la fonction. La Region exclue peut être soit la Region d’une hypothèse (détectée ou non), soit un rectangle ou un array de rectangles des éléments trouvés, soit encore une Region construite à partir des Regions d’objets faisant partie d’une hypothèse trouvée (voir la method ExcludeSet).
Étudions le projet Exclude.fsp (dossier %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Exclude) pour voir comment fonctionne la fonction Exclude.
Le projet comporte 4 pages :
- Page 1 - le champ d’adresse est écrit sur plusieurs lignes. Le nom « Address: » se trouve sur la première ligne ; nous ne pouvons donc pas dire que le champ de données recherché se trouve à droite ou en dessous du nom du champ. Cependant, ce nom doit tout de même être exclu de la reconnaissance ;
- Page 2 – le champ d’adresse n’a pas de nom ;
- Pages 3 et 4 – la ligne « (Address) » se trouve à l’intérieur du champ de données. Cependant, elle doit être exclue de la reconnaissance.
Sur toutes les pages, le champ d’adresse se trouve sous le champ contenant le nom de l’entreprise.
Nous créons d’abord un élément de type Static Text, le nommons CompanyHeader et spécifions sa valeur. Cet élément sera utilisé pour détecter le nom du champ.
Ensuite, nous créons un élément de type Static Text et le nommons AddressHeader. Cet élément sera utilisé pour détecter le nom du champ. Nous spécifions les valeurs de texte statique suivantes : Address:|(Address), c’est-à-dire que nous listons toutes les variantes de cette ligne qui doivent être détectées puis exclues de la reconnaissance dans le champ d’adresse. Nous décrivons les search constraints de ces lignes dans le champ Relations et précisons que ces lignes doivent être recherchées sous (Below) l’élément CompanyHeader.
L’élément correspondant au nom doit être créé avant l’élément du champ d’adresse, car la fonction Exclude permet uniquement de faire référence à des éléments situés plus haut dans l’arborescence FlexiLayout que l’élément actuel.
Lancez la procédure de mise en correspondance du FlexiLayout (Match FlexiLayout) pour vous assurer que le nom de l’adresse est trouvé sur toutes les pages où il apparaît.
Comme le champ d’adresse de cet exemple comporte plusieurs lignes, nous créons un élément de type Paragraph pour le rechercher. Nous le nommons Address et, comme dans l’exemple précédent, nous indiquons qu’il doit être recherché sous (Below) l’élément CompanyHeader.
Une fois la procédure de mise en correspondance du FlexiLayout exécutée, vous verrez que, sur les pages 1, 3 et 4, la ligne du nom a également été incluse dans le champ d’adresse.
Revenez maintenant à la boîte de dialogue Properties de l’élément Address et cliquez sur l’onglet Search Constraints. Cliquez sur Add… en regard de la section Exclude regions of elements et choisissez l’élément AddressHeader dans la liste.
Après avoir enregistré les propriétés de l’élément, exécutez à nouveau la procédure de mise en correspondance du FlexiLayout. Vous verrez que la Region du bloc correspondant au champ d’adresse a pris une forme non rectangulaire, car la Region du nom en a été retranchée.
La section Exclude regions of elements vous permet d’exclure de la zone de recherche de l’élément actuel la Region d’une hypothèse trouvée pour un autre élément. Pour exclure une zone géométriquement plus complexe, ou pour détecter d’abord une Region puis l’exclure du processus de reconnaissance, vous devez utiliser les fonctions Exclude, ExcludeRect et ExcludeSet dans le champ relations avancées de pré-recherche.
La Region d’un bloc se compose par définition de rectangles placés les uns au-dessus des autres, de sorte qu’une ligne horizontale ne peut traverser la Region qu’une seule fois, c’est-à-dire qu’il ne peut pas y avoir de « dents » verticales saillantes. Par conséquent, si la ligne à exclure et les informations requises se trouvent au même niveau, ou à peu près au même niveau, le nom ne peut pas être exclu à l’étape de création du FlexiLayout. Dans ce cas, le nom peut être exclu après la reconnaissance dans FlexiCapture à l’aide de la règle « Substitute from the list ».