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

# サンプル 4. ステップ 5.4: 請求書番号 field、InvoiceNumber 要素

> FlexiLayout language の pre-search relations を使用して検索範囲を制限し、InvoiceNumber Character String 要素で請求書番号の値を抽出します。

一部の文書では、請求書番号 field は field 名の右側にありますが、別の文書ではその下にあります (文書 1 と 2 では、field データは名前のすぐ下に配置されています) 。

InvoiceNumber 要素を作成するには、次のようにします。

1. **InvoiceHeader** 要素内で、Character String 型の要素を作成し、**InvoiceNumber** という名前を付けます。

   <Tip>
     要素名は、**InvoiceNumber** field に対応するブロック名と同じである必要はありません。ただし、FlexiLayout で作業する際は、同じ名前にしておくと便利です。
   </Tip>

2. Character String タブをクリックします。

3. アルファベットを指定します。
   -./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

4. アルファベットに含まれない文字の Percentage を 30% に設定します。

5. Character count field で、文字列の長さに対してファジー区間 `{-1, 3, 20, INF}` を指定します。これは、想定される値が 3 ～ 20 文字の範囲に収まることを前提としています。この区間外の仮説にはペナルティが課されます。

6. 一部の画像では、**Invoice Number** field の検索範囲に、すでに検出された **kwInvoiceDate** 要素が含まれています。この要素を検索範囲から除外して、プログラムが **Invoice Number** field の仮説にこのテキストを含めないようにします。
   * **Search Constraints** タブで、Exclude regions of elements field の横にある Add... ボタンをクリックします。
   * 要素の一覧から **kwInvoiceDate** を選択します。
   * **OK** をクリックします。文字列 `SearchElements.InvoiceHeader.kwInvoiceDate` が Exclude regions of elements field に表示されます。

<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="ABBYY FlexiLayout Studio の InvoiceNumber Character String 要素のプロパティにある Search Constraints タブのスクリーンショット。Exclude regions of elements field に kwInvoiceDate 要素が SearchElements.InvoiceHeader.kwInvoiceDate として追加されています。" width="427" height="454" data-path="images/flexi-capture/fls/tutorial4_5_4.png" />
</Frame>

7. Advanced タブをクリックします。
8. **Advanced pre-search relations** で、追加条件を指定します。**kwInvoiceNumber** という名前が見つからない場合は **InvoiceNumber** フィールドを検索せず、見つかった場合は、検索領域を矩形の配列として指定します。1 つは名前の右側、もう 1 つは少しオフセットした名前の下側です。[FlexiLayout language](/ja/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);
   // InvoiceNumber フィールド名の右側にある矩形で検索領域を制限します。
   Let r2 = Rect (kwInvoiceNumber.Rect.Left - 100dt, kwInvoiceNumber.Rect.Bottom, kwInvoiceNumber.Rect.Right + 100dt, kwInvoiceNumber.Rect.Bottom + 100dt);
   // InvoiceNumber フィールド名の下側にある矩形で検索領域を制限します。
   DataRegion = RectArray (r1);
   DataRegion.Add (r2);
   RestrictSearchArea (DataRegion);
   }
   ```
9. field の検索領域は、2 つの矩形に制限されます。1 つは field 名の右側、もう 1 つはその下側です。field データが field 名の右側にある場合、field の下には別のテキストが存在することがよくあります (テスト画像では、ほとんどの場合 Date フィールドの名前とデータです) 。この余分なテキストも **請求書番号** field の検索領域に含まれるため、プログラムはこのテキストに対する 仮説 を生成します。この 仮説 の Quality に影響を与えるには、**Advanced post-search relations** field で追加チェックを指定します。field 名の下にあるテキストほど、ペナルティは大きくなります。[FlexiLayout language](/ja/flexi-capture/fls/code/general-code) では、この条件を次のように記述できます。

   ```text theme={null}
   if not IsNull then
   { FuzzyQuality: Top - kwInvoiceNumber.Rect.Top, {-30000,0,0,10000}*dt;
   }
   // 名前と field の上境界との距離が大きいほど、対応する 仮説 へのペナルティも大きくなります。このケースでは、上境界が名前の上境界と一致する要素の 仮説 が最も高い Quality になります。
   ```
10. **InvoiceFooter** 要素を一時的に Exclude し、FlexiLayout をマッチングします。
11. **InvoiceNumber** block の位置を、**InvoiceNumber** 要素の矩形領域を縦横に 5 ドット拡大した領域として指定します。これを行うには、Expression を選択し、次の式を入力します。

    ```text theme={null}
    Rect outputRect;
    outputRect = InvoiceHeader.InvoiceNumber.Rect;
    IsNull = InvoiceHeader.InvoiceNumber.IsNull;
    // InvoiceNumber 要素が検出されている場合、block region を検出済みとして扱います。
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);
    ```
