Skip to main content
FlexiLayout のブロックは、データを抽出する必要があるドキュメント上の field に対応します。ブロックでは、その field に含まれる可能性があるデータの種類と、その field が見つかる可能性が高い画像Regionの座標を指定します。 ブロックのブランチは、FlexiLayout ツリー内で ツリーのブロックアイコン で示されます。

FlexiLayout のブロック型

ABBYY FlexiLayout Studio では、次のブロック型をサポートしています。 テキストブロックの領域を拡張すると、認識精度が向上する場合があります。領域を拡張するには、Blocks 要素をダブルクリックして Properties ダイアログを開き、Blocks result region inflate プロパティで垂直方向と水平方向の値を指定します。 少なくとも 1 つの代替レイアウトで画像領域が指定されていないブロックは、アイコンの右上隅に空の四角形が表示されます: 未定義ブロック アイコン 1 つの FlexiLayout のみが選択されている場合 (要素のショートカットメニューの Select Layout アイテム、FlexiLayout セクションの同じアイテム、または FlexiLayout のショートカットメニューの Select Alternative Layout アイテムから選択) 、プログラムはこの FlexiLayout でのみ画像領域を確認します。
ブロックからのデータは、ABBYY FlexiCapture などのデータ抽出アプリケーションで抽出されます。

ブロック のプロパティ

ブロック には次のプロパティがあります。 Instance sort order プロパティには次の値があります。 In order of finding では、インスタンスに追加条件を指定すると、仮説はユーザー定義の順序で生成されます。プログラムで使用される標準の順序とは異なる順序が必要な場合は、追加条件を使用して指定できます。 以下のプロパティは、画像上でデータを抽出する領域を指定します。

For Layout

検索領域を指定する代替レイアウトを選択します。

ソース要素

画像上でブロックを見つけるために使用される要素の領域と同じ画像領域を指定します。FlexiLayout が画像に適用されると、プログラムはその要素で記述されたオブジェクトを検索します。データはそれらのオブジェクトから抽出されます。 繰り返しグループでは、いずれか 1 つのインスタンスを選択することも、すべてのインスタンス (AllInstances) を使用することもできます。詳細については、繰り返しグループのインスタンスを参照要素、除外要素、またはソース要素として使用するを参照してください。

Expression

どの要素領域とも一致しない画像上の領域を設定します。 たとえば、複数の要素の領域とその間の空間を 1 つのブロックにまとめたり、要素の領域を一定の値だけ拡張したり、要素に依存せずにブロックの座標を指定したりできます。この場合、ブロックの領域は FlexiLayout language で記述できます。
ブロックの領域は連続しています。つまり、離れた位置にある矩形から領域を作成すると、それらの間の空間は、領域を連続させるために細い追加の矩形で埋められます。
ただし、繰り返しグループのすべてのインスタンスを参照要素として使用する場合、ブロックは複数の領域で構成されることがあります。グループブロックの領域は、仮説の領域と同様に、子ブロックの領域に基づいて計算されます。見やすくするために、最終的な領域はわずかに拡張されます。

グループブロックと繰り返しグループブロックのパラメーター

チェックマークグループと通常のグループブロックには、NameComment 以外のパラメーターはありません。 繰り返しグループブロックのパラメーターは、グループではないブロックと同じです。これらでは、Has repeating instances オプションが常に有効です。 子ブロックでは Has repeating instances オプションを設定することも設定しないこともできますが、OutputInstances 変数は常に作成されます。繰り返しグループブロック内のブロックで Has repeating instances オプションが有効になっている場合、そのブロックは親ブロックの各インスタンス内で繰り返すことができます。

繰り返しグループのインスタンスを使用してブロック領域を指定する

ブロックが複数のインスタンスで定義されている場合、ブロック領域は複数の独立した領域で構成されます。繰り返しグループの特定のインスタンス (たとえば LastFound) を使用する場合、ブロック領域は他の要素と同様に定義されます。 一方、検出されたすべてのインスタンス (AllInstances) を使用することもできます。複数のインスタンスを使用するには、Has repeating instances オプションを選択します。 また、事前定義された OutputInstances 変数を使って、ブロック用のコードを記述することもできます。例:
ABBYY FlexiCapture は、Has repeating instances オプションが有効になっているブロックを次のように処理します。
  • テーブル以外のブロックでは、指定されたインスタンスは対応する field のインスタンスとして扱われます。
  • テーブルブロックでは、指定されたインスタンスは field の 1 つのインスタンスとして扱われます。つまり、ABBYY FlexiCapture はそのようなブロックを、不連続な領域を持つ Table 型の field として処理します。

ブロックの繰り返しグループに対する要素参照を作成する際のルール

ブロックの繰り返しグループは、繰り返し要素を参照します。ブロックの繰り返しグループのインスタンスを作成するには、複数の要素インスタンスが必要です。そのため、いずれか 1 つの ID は AllInstances でなければなりません。 AllInstances を持つ要素の下にネストされた要素は、他の ID を持つことができません。そのため、この条件は、最下位の繰り返し要素が AllInstances を持つことも意味します。 ブロックの繰り返しグループの子ブロックは、親ブロックが参照する要素グループの繰り返しグループの子要素を参照します。この参照では、インスタンスに対して同じ ID を指定する必要があります。 たとえば、繰り返しグループのブロックが SearchElements..RepGr1.Instance(1).RepGr2.AllInstances という参照を持つ場合、その子ブロックが要素 RepGr1..RepGr2.Element を参照できるのは、次の場合のみです。
HasRepeatingInstances 属性がない場合、参照できるのは、基本グループ内で内部に繰り返しを持たないサブ要素だけです。逆も同様です。 HasRepeatingInstances 属性がある場合は、基本グループ内で内部に繰り返しを持つ要素を参照できます (この場合、参照できるのはすべてのインスタンスをまとめたものだけです) 。
With a HasRepeatingInstances attribute
Without a HasRepeatingInstances attribute
ソース要素 を介して参照が作成されている場合、チェックは FlexiLayout の構築時に実行されます。Advanced code を使用して参照が作成されている場合は、FlexiLayout のマッチング時にエラーが検出されます。

FlexiLayout language でブロック領域を記述する

ブロックの領域を指定するには、Expression field を使用します。 使用する事前定義変数は、ブロックの型と、そのブロックで Has repeating instances オプションが選択されているかどうかによって異なります。 Expression field で使用できる事前定義変数の詳細については、事前定義変数を参照してください。

IsNull 変数を使用する

事前定義された IsNull 変数を使用して、ブロックの領域を記述することもできます。この変数は、FlexiLayout とのマッチング時にブロックの領域が見つかったかどうかを示します。値が false の場合は、その領域が見つかっています。値が true の場合は、見つかっていません。 IsNull 変数は値 false で初期化されるため、ブロックの領域は見つかっているものと見なされます。ただし、場合によっては、結論を出す前に特定の条件を確認する必要があります。 ソース要素の領域の幅が 50 ドットを超える場合に、ブロックの領域を見つかったものと見なすようプログラムに指示するには、Region Expression フィールドに次のコードを入力します。
Element1 が見つかった場合にのみブロックの領域を見つかったものと見なすようプログラムに指示するには、Region Expression フィールドに次のコードを入力します。
Element1Element2 を使用してブロックを検索する必要があるとします。少なくとも 1 つの要素が見つかっていない場合、そのブロックは見つからなかったものと見なされます。
このコードが正しく機能するのは、Element1 の検索領域が Element2 の検索領域より上かつ左にある場合だけです。前述の例では、簡潔にするため、この条件の確認は省略しています。実際のコードでは、この確認が必要であり、FieldLeftFieldRightFieldTopFieldBottom 変数の値も調整しなければなりません。そうしないと、Rect 関数を呼び出したときにエラーが返されます。