> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Recherche de champs sur une seule ligne de format connu ou inconnu dans des documents de qualité OCR variable

> Détectez des champs sur une seule ligne, tels que les numéros de facture, malgré des niveaux de qualité OCR variables, en combinant des éléments Character String avec des expressions régulières et des alphabets.

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é.

<div id="the-structuredstringsfsp-sample-project">
  ## L’exemple de projet StructuredStrings.fsp
</div>

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.

| <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice1.gif?s=991be7fc79faa70ae3b774998733d0c4" alt="Capture d’écran de la page de facture 1 avec le champ Numéro de facture imprimé avec une bonne qualité" width="301" height="90" data-path="images/flexi-capture/fls/invoice1.gif" /> | <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice2.gif?s=3f797e0ed40b05f977d6d11de6402b3c" alt="Capture d’écran de la page de facture 2 avec le champ Numéro de facture imprimé avec une bonne qualité" width="301" height="90" data-path="images/flexi-capture/fls/invoice2.gif" /> |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice3.gif?s=4f03e46dd1dcc7d4c62db299be0f7792" alt="Capture d’écran de la page de facture 3 avec le champ Numéro de facture imprimé sur une image bruitée" width="301" height="90" data-path="images/flexi-capture/fls/invoice3.gif" />  | <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice4.gif?s=d93733bf66dd1a0b64726d6fb14e999d" alt="Capture d’écran de la page de facture 4 avec le champ Numéro de facture rempli à la main" width="301" height="90" data-path="images/flexi-capture/fls/invoice4.gif" />               |

<div id="describe-the-invoice-number-with-a-regular-expression">
  ## Décrire le numéro de facture à l’aide d’une expression régulière
</div>

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 :

```text theme={null}
NNNN"-"NN"-"[A-Z]"/"NN
```

ou, ce qui revient au même :

```text theme={null}
[0-9]{4}"-"[0-9]{2}"-"[A-Z]"/" [0-9]{2}
```

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.

<div id="add-a-fallback-character-string-element-with-an-alphabet">
  ## Ajouter un élément Character String de secours avec un alphabet
</div>

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.

<Frame>
  <img src="https://mintcdn.com/abbyy/lqYknuOmCa79141v/images/flexi-capture/fls/edit_alph2.gif?fit=max&auto=format&n=lqYknuOmCa79141v&q=85&s=87ef11061739c78b53c87d120bd500bf" alt="Capture d’écran de la boîte de dialogue Modifier l’alphabet dans ABBYY FlexiLayout Studio répertoriant tous les caractères valides pour l’élément NumAsAlphabet." width="536" height="350" data-path="images/flexi-capture/fls/edit_alph2.gif" />
</Frame>

Le code suivant doit être saisi dans le champ **relations avancées de pré-recherche** :

```text theme={null}
if (NumAsRegularExpression.IsNull == FALSE) then Dontfind();
```

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.

<Note>
  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 :

  ```text theme={null}
  if (NumAsRegularExpression.IsNull == FALSE) then Dontfind();
  else RestrictSearchArea (NumAsRegularExpression.Rect);
  ```
</Note>

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é.

<Note>
  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.
</Note>

<div id="why-the-regular-expression-improves-reliability">
  ## Pourquoi l’expression régulière améliore la fiabilité
</div>

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.

<Frame>
  <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/structure_string.png?fit=max&auto=format&n=r-nfa7jujx5b9gKX&q=85&s=4fc65d41b01bf73bde4d47aae9e14f61" alt="Capture d’écran dans ABBYY FlexiLayout Studio d’une image bruitée où un élément Character String avec un alphabet spécifié ne détecte que partiellement le champ du numéro de facture en raison d’un pourcentage excessif de caractères hors alphabet." width="566" height="440" data-path="images/flexi-capture/fls/structure_string.png" />
</Frame>
