> ## 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. Step 5.5: 請求日 field、grDate、InvoiceDate、InvoiceDateAsString 要素

> FlexiLayout Studio サンプル 4 の Step 5.5: grDate グループ、Date 要素、およびスキャン品質が低い場合の Character String フォールバックを使用して請求日 field を抽出します。

画像を確認すると、次のことがわかります。

* 一部のドキュメントでは、**請求日** field は field 名の右側にあり、別のドキュメントでは field 名の下にあります。そのため、検索領域を field 名の右側と下側の矩形に制限します。
* 日付を検索するには **Date** 要素を使用します。さらに、次の条件を指定します。field 名が検出されない場合は、field データを検索しません。
* 日付は認識精度が低くなることが少なくありません。これは、スキャン品質の問題や無効な日付フォーマットなどが原因である可能性があります。そのため、Date 要素で日付が見つからなかった場合に備えて、追加の Character String 要素を指定します。

すべての要素に共通する設定を指定するため、型が Group の要素を作成します。

型が Group の grDate 要素を作成するには、次のようにします。

1. **InvoiceHeader** 要素内に、型が **Group** の要素を作成し、名前を **grDate** にします。
2. Advanced タブをクリックし、追加の検索制約を指定します。検索領域を、field 名の右側にある 1 つの矩形と、field 名の下側にオフセットを付けた 1 つの矩形からなる矩形の配列に制限します。[FlexiLayout language](/ja/flexi-capture/fls/code/general-code) では、この制約は次のように記述できます。

   ```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);
   ```

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

1. `InvoiceHeader.grDate` 要素内に、型が Date の要素を作成し、名前を **InvoiceDate** にします。
2. Date タブをクリックします。
3. **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="ABBYY FlexiLayout Studio の InvoiceDate 要素のプロパティにある Date タブのスクリーンショット。請求日 field に対して指定された日付フォーマットの一覧が表示されています。" width="431" height="455" data-path="images/flexi-capture/fls/tutorial4_5_5.png" />
</Frame>

4. 一部の画像では、**請求日** field の検索領域に、すでに検出されている **kwInvoiceNumber** 要素と **InvoiceNumber** 要素が含まれることがあります。プログラムがこれらの要素の値を **請求日** field の仮説として扱わないよう、これらの要素を検索領域から除外します。
   * Exclude regions of elements field の横にある Add... ボタンをクリックします。
   * 要素のリストから **kwInvoiceNumber** を選択します。
   * **OK** をクリックします。すると、Exclude regions of elements field に文字列 `SearchElements.InvoiceHeader.kwInvoiceNumber` が表示されます。

要素 `SearchElements.InvoiceHeader.InvoiceNumber` についても、これらの操作を繰り返します。

5. Advanced タブをクリックします。
6. **請求日** field は必須要素ではありません。ただし、ドキュメントに日付 (**請求日** field) が含まれている場合、ドキュメント上には必ず対応する field 名 (前述の **kwInvoiceDate** 要素で記述) が存在します。したがって、**Advanced pre-search relations** で追加の検索条件を指定できます。**kwInvoiceDate** が検出されている場合にのみ画像オブジェクトを検索します。[FlexiLayout language](/ja/flexi-capture/fls/code/general-code) では、この条件は次のように記述できます。

   ```text theme={null}
   If InvoiceHeader.kwInvoiceDate.IsNull
   Then DontFind();
   ```
7. **InvoiceFooter** 要素を一時的に除外し、FlexiLayout を match します。

画質の低い画像では、認識結果が Date 要素の標準 parameters のいずれにも適合しないことがあります。そのため、より緩やかな条件で請求日 field を検索する代替要素を追加します。

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

1. `InvoiceHeader.grDate` 要素内に、型が Character String の要素を作成し、**InvoiceDateAsString** という名前を付けます。
2. Character String タブをクリックします。
3. アルファベットを指定します。
   ,-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
4. アルファベットに含まれない文字の割合を 30% に設定します。
5. Character count フィールドで、文字列の長さに対してファジー区間 `{-1, 8, 14, INF}` を指定します。想定される値は 8～14 文字の範囲に収まるものとします。この区間外の仮説にはペナルティが適用されます。
6. Max space length を 20 に設定します。これにより、テキスト文字列内のスペースの最大長が 20 ドットに制限されます。
7. その他の要素のプロパティは、デフォルト設定のままにします。
8. Advanced タブをクリックします。
9. **InvoiceDateAsString** 要素は、画像上で **InvoiceDate** 要素が検出されなかった場合にのみ検索する必要があるため、**Advanced pre-search relations** フィールドに次の条件を指定します。**InvoiceDate** 要素が検出されなかった場合にのみ、画像オブジェクトを検索します。[FlexiLayout language](/ja/flexi-capture/fls/code/general-code) では、この条件は次のように記述できます。

   ```text theme={null}
   If Not InvoiceDate.IsNull Then DontFind;
   ```
10. **InvoiceDate** に対しても、前の手順と同様の追加条件を指定します。**kwInvoiceDate** 要素が検出された場合にのみ画像オブジェクトを検索し、**kwInvoiceDate** 要素に最も近い画像オブジェクトを検索します。[FlexiLayout language](/ja/flexi-capture/fls/code/general-code) では、この条件は次のように記述できます。

    ```text theme={null}
    If InvoiceHeader.kwInvoiceDate.IsNull Then DontFind;
    Nearest: InvoiceHeader.kwInvoiceDate;
    ```
11. **InvoiceDate** ブロックの位置を、検出された **InvoiceDate** または **InvoiceDateAsString** 要素の rectangular region を上下左右に 5 ドットずつ拡張した領域として指定します。これを行うには、Expression オプションを選択し、次の式を入力します。

    ```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);
    ```
