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

# Exemple 4. Étape 5.5 : champ Date de la facture, éléments grDate, InvoiceDate et InvoiceDateAsString

> Étape 5.5 de l’exemple 4 de FlexiLayout Studio : capturer le champ Date de la facture avec un groupe grDate, un élément Date et un élément Character String de secours pour les numérisations de mauvaise qualité.

Une fois les images examinées, vous remarquerez que :

* Sur certains documents, le champ **Date de la facture** se trouve à droite du nom du champ et, sur d’autres, en dessous. Nous limiterons donc la zone de recherche à des rectangles situés à droite du nom et en dessous de celui-ci.
* Nous utiliserons un élément **Date** pour rechercher la date. De plus, nous définirons la condition suivante : si le nom du champ n’est pas détecté, ne recherchez pas les données du champ.
* Il arrive assez souvent que les dates soient reconnues de manière peu fiable. Cela peut être dû à des défauts de numérisation, à des formats de date invalides, etc. Nous ajouterons donc un élément supplémentaire Character String au cas où l’élément Date ne trouverait aucune date.

Pour définir les paramètres communs à tous les éléments, nous allons créer un élément de type Group.

Pour créer un élément grDate de type Group :

1. Dans l’élément **InvoiceHeader**, créez un élément de type **Group** et nommez-le **grDate**.
2. Cliquez sur l’onglet Advanced et définissez des contraintes de recherche supplémentaires : limitez la zone de recherche à un tableau de rectangles composé d’un rectangle à droite du nom du champ et d’un rectangle sous le nom du champ, avec un certain décalage. En [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code), cette contrainte peut s’écrire comme suit :

   ```text theme={null}
   RectArray DataRegion;
   Let r1= Rect (kwInvoiceDate.Rect.Right, kwInvoiceDate.Rect.Top -20dt, kwInvoiceDate.Rect.Right + 650dt, kwInvoiceDate.Rect.Bottom + 50dt);
   Let r2 = Rect (kwInvoiceDate.Rect.Left - 150dt, kwInvoiceDate.Rect.Bottom, kwInvoiceDate.Rect.Right + 100dt, kwInvoiceDate.Rect.Bottom + 100dt);

   DataRegion = RectArray (r1);
   DataRegion.Add (r2);
   RestrictSearchArea (DataRegion);
   ```

Pour créer un élément InvoiceDate :

1. Dans l’élément `InvoiceHeader.grDate`, créez un élément de type Date et nommez-le **InvoiceDate**.
2. Cliquez sur l’onglet Date.
3. Spécifiez tous les formats de date possibles pour l’élément **InvoiceDate** :

<Frame>
  <img src="https://mintcdn.com/abbyy/8aWHPAJyzWmTqglX/images/flexi-capture/fls/tutorial4_5_5.png?fit=max&auto=format&n=8aWHPAJyzWmTqglX&q=85&s=120c6fe9aa8f4c54bc3f09b0a679212a" alt="Capture d’écran de l’onglet Date des propriétés de l’élément InvoiceDate dans ABBYY FlexiLayout Studio, montrant la liste des formats de date spécifiés pour le champ Date de la facture." width="431" height="455" data-path="images/flexi-capture/fls/tutorial4_5_5.png" />
</Frame>

4. Sur certaines images, la zone de recherche du champ **Date de la facture** inclura les éléments **kwInvoiceNumber** et **InvoiceNumber** déjà détectés. Pour éviter que le programme ne considère les valeurs de ces éléments comme des hypothèses pour le champ **Date de la facture**, excluez ces éléments de la zone de recherche :
   * Cliquez sur le bouton Add... à côté du champ Exclude regions of elements.
   * Sélectionnez **kwInvoiceNumber** dans la liste des éléments.
   * Cliquez sur **OK**. La chaîne `SearchElements.InvoiceHeader.kwInvoiceNumber` apparaîtra dans le champ Exclude regions of elements.

Répétez les étapes ci-dessus pour l’élément `SearchElements.InvoiceHeader.InvoiceNumber`.

5. Cliquez sur l’onglet Advanced.
6. Le champ **Date de la facture** n’est pas un élément obligatoire. Toutefois, si un document contient une date (dans le champ **Date de la facture**), le nom de champ correspondant est toujours présent dans le document (décrit plus haut par l’élément **kwInvoiceDate**). Vous pouvez donc définir une condition de recherche supplémentaire dans **relations avancées de pré-recherche** : recherchez l’objet image uniquement si **kwInvoiceDate** a été détecté. En [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code), cette condition peut s’écrire comme suit :

   ```text theme={null}
   If InvoiceHeader.kwInvoiceDate.IsNull
   Then DontFind();
   ```
7. Excluez temporairement l’élément **InvoiceFooter** et exécutez l’association du FlexiLayout.

Pour les images de mauvaise qualité, lorsque les résultats de reconnaissance ne correspondent à aucun des paramètres standard de l’élément Date, nous ajouterons un élément alternatif qui utilisera des conditions plus souples pour rechercher le champ Date de la facture.

Pour créer un élément InvoiceDateAsString :

1. Dans l’élément `InvoiceHeader.grDate`, créez un élément de type Character String et nommez-le **InvoiceDateAsString**.
2. Cliquez sur l’onglet Character String.
3. Spécifiez l’alphabet :
   ,-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
4. Définissez le pourcentage de caractères non alphabétiques sur 30 %.
5. Dans le champ Character count, spécifiez l’intervalle flou `{-1, 8, 14, INF}` pour la longueur de la chaîne de caractères, en supposant que les valeurs possibles se situent dans la plage de 8 à 14 caractères. Toute hypothèse en dehors de cet intervalle sera pénalisée.
6. Définissez Max space length sur 20. Cela limite la longueur maximale de l’espace dans la chaîne de texte à 20 dots.
7. Pour les autres propriétés de l’élément, conservez les paramètres par défaut.
8. Cliquez sur l’onglet Advanced.
9. Étant donné que l’élément **InvoiceDateAsString** ne doit être recherché que si l’élément **InvoiceDate** n’est pas détecté dans l’image, spécifiez la condition suivante dans le champ **relations avancées de pré-recherche** : recherchez l’objet image uniquement si l’élément **InvoiceDate** n’est pas détecté. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code), cette condition peut être écrite comme suit :

   ```text theme={null}
   If Not InvoiceDate.IsNull Then DontFind;
   ```
10. Spécifiez une condition supplémentaire pour **InvoiceDate**, similaire à la précédente : recherchez l’objet image uniquement si l’élément **kwInvoiceDate** a été détecté. Recherchez l’objet image le plus proche de l’élément **kwInvoiceDate**. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code), cette condition peut être écrite comme suit :

    ```text theme={null}
    If InvoiceHeader.kwInvoiceDate.IsNull Then DontFind;
    Nearest: InvoiceHeader.kwInvoiceDate;
    ```
11. Spécifiez l’emplacement du bloc **InvoiceDate** comme la région rectangulaire de l’élément **InvoiceDate** ou **InvoiceDateAsString** détecté, augmentée de 5 dots verticalement et horizontalement. Pour ce faire, sélectionnez l’option Expression et saisissez l’expression suivante :

    ```text theme={null}
    Rect outputRect;
    if not InvoiceHeader.grDate.InvoiceDate.IsNull then
    outputRect = InvoiceHeader.grDate.InvoiceDate.Rect;
    else
    { outputRect = InvoiceHeader.grDate.InvoiceDateAsString.Rect;
    IsNull = InvoiceHeader.grDate.InvoiceDateAsString.IsNull;
    }
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);
    ```
