> ## 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.4 : champ Numéro de facture, élément InvoiceNumber

> Capturer la valeur du Numéro de facture à l’aide d’un élément Character String InvoiceNumber, en limitant la zone de recherche avec les relations de prérecherche du langage FlexiLayout.

Sur certains documents, le champ **Numéro de facture** apparaît à droite du nom du champ ; sur d’autres, il apparaît en dessous du nom. Dans les documents 1 et 2, les données du champ sont placées directement sous le nom.

<div id="create-the-invoicenumber-element">
  ## Créer l’élément InvoiceNumber
</div>

<Steps>
  <Step title="Créez l’élément Character String">
    Dans l’élément **InvoiceHeader**, créez un élément [Character String](/fr/flexi-capture/fls/template/character-chain) et nommez-le **InvoiceNumber**.

    <Tip>
      Le nom de l’élément ne doit pas nécessairement correspondre à celui du bloc associé au champ **InvoiceNumber**. Cependant, utiliser des noms identiques est pratique lorsque vous travaillez avec un FlexiLayout.
    </Tip>
  </Step>

  <Step title="Spécifiez l’alphabet">
    Cliquez sur l’onglet **Character String**, puis spécifiez l’alphabet :

    `-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`
  </Step>

  <Step title="Définissez le pourcentage de caractères non alphabétiques">
    Définissez **Pourcentage de caractères non alphabétiques** sur 30 %.
  </Step>

  <Step title="Définir le nombre de caractères">
    Dans le champ **Nombre de caractères**, spécifiez l’intervalle flou `{-1, 3, 20, INF}` pour la longueur de la chaîne de caractères, en partant du principe que les valeurs possibles sont comprises entre 3 et 20 caractères. Toute hypothèse en dehors de cet intervalle est pénalisée.
  </Step>

  <Step title="Excluez la région kwInvoiceDate">
    Sur certaines images, la zone de recherche du champ **Numéro de facture** contient l’élément **kwInvoiceDate** déjà détecté. Excluez cet élément de la zone de recherche afin que FlexiLayout Studio ne prenne pas ce texte en compte dans ses hypothèses pour le champ **Numéro de facture** :

    * Dans l’onglet **Contraintes de recherche**, cliquez sur **Ajouter...** à côté du champ **Exclure les régions des éléments**.
    * Sélectionnez **kwInvoiceDate** dans la liste des éléments.
    * Cliquez sur **OK**. La chaîne `SearchElements.InvoiceHeader.kwInvoiceDate` s’affiche dans le champ **Exclure les régions des éléments**.

    <Frame>
      <img src="https://mintcdn.com/abbyy/8aWHPAJyzWmTqglX/images/flexi-capture/fls/tutorial4_5_4.png?fit=max&auto=format&n=8aWHPAJyzWmTqglX&q=85&s=f75396d33e7d2b3b095a09fc446d3d3b" alt="Capture d’écran de l’onglet Contraintes de recherche des propriétés de l’élément Character String InvoiceNumber dans ABBYY FlexiLayout Studio, montrant l’élément kwInvoiceDate ajouté au champ Exclure les régions des éléments sous la forme SearchElements.InvoiceHeader.kwInvoiceDate." width="427" height="454" data-path="images/flexi-capture/fls/tutorial4_5_4.png" />
    </Frame>
  </Step>

  <Step title="Ajouter des relations de prérecherche">
    Cliquez sur l’onglet **Advanced**. Dans **relations avancées de pré-recherche**, définissez des conditions supplémentaires : si le nom **kwInvoiceNumber** est introuvable, ne recherchez pas le champ **InvoiceNumber** ; sinon, définissez la zone de recherche comme un tableau de rectangles, l’un à droite du nom et l’autre en dessous, avec un léger décalage. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code) :

    ```text theme={null}
    if kwInvoiceNumber.IsNull then Dontfind();
    else
    { WholeWordMode: true;
    MaxGapInLine: 30dt;
    RectArray DataRegion;
    Let r1= Rect (kwInvoiceNumber.Rect.Right, kwInvoiceNumber.Rect.Top -20dt, kwInvoiceNumber.Rect.Right + 650dt, kwInvoiceNumber.Rect.Bottom + 50dt);
    // Restreint la search area à un rectangle situé à droite du nom du champ InvoiceNumber.
    Let r2 = Rect (kwInvoiceNumber.Rect.Left - 100dt, kwInvoiceNumber.Rect.Bottom, kwInvoiceNumber.Rect.Right + 100dt, kwInvoiceNumber.Rect.Bottom + 100dt);
    // Restreint la search area à un rectangle situé sous le nom du champ InvoiceNumber.
    DataRegion = RectArray (r1);
    DataRegion.Add (r2);
    RestrictSearchArea (DataRegion);
    }
    ```
  </Step>

  <Step title="Ajouter des relations post-recherche">
    La zone de recherche du champ est limitée à deux rectangles : l’un à droite du libellé du champ et l’autre en dessous. Lorsque les données du champ se trouvent à droite du libellé, il y a souvent d’autres textes sous le champ (dans les images de test, il s’agit le plus souvent du libellé et des données du champ **Date**). Comme ce texte parasite se trouve dans la zone de recherche du champ **Numéro de facture**, FlexiLayout Studio génère une hypothèse correspondante. Pour influencer la qualité de cette hypothèse, spécifiez des vérifications supplémentaires dans le champ **Advanced post-search relations** : plus le texte situé sous le libellé du champ est bas, plus la pénalité est importante. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code) :

    ```text theme={null}
    if not IsNull then
    { FuzzyQuality: Top - kwInvoiceNumber.Rect.Top, {-30000,0,0,10000}*dt;
    }
    // Plus la distance entre le nom et la limite supérieure du champ est grande, plus la pénalité appliquée à l'hypothèse correspondante est élevée. Dans ce cas précis, c'est l'hypothèse de l'élément dont la limite supérieure coïncide avec celle du nom qui obtiendra la meilleure qualité.
    ```
  </Step>

  <Step title="Associer le FlexiLayout">
    Excluez temporairement l’élément **InvoiceFooter**, puis exécutez le FlexiLayout.
  </Step>

  <Step title="Définir la région du bloc">
    Définissez l’emplacement du bloc **InvoiceNumber** comme étant la région rectangulaire de l’élément **InvoiceNumber**, agrandie de 5 dots verticalement et horizontalement. Sélectionnez **Expression** et saisissez l’expression suivante :

    ```text theme={null}
    Rect outputRect;
    outputRect = InvoiceHeader.InvoiceNumber.Rect;
    IsNull = InvoiceHeader.InvoiceNumber.IsNull;
    // Considère la région du bloc comme détectée si l'élément InvoiceNumber a été détecté.
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);
    ```
  </Step>
</Steps>
