メインコンテンツへスキップ
FlexiLayout を作成する際、検索領域を常に「上-下-左-右」の関係だけで定義できるとは限りません。これは特に、検索領域に不要なオブジェクトが含まれている場合に当てはまります。たとえば、scanning 中に入り込んだオブジェクトなどです。これらのオブジェクトは認識ブロックに含まれてはならないため、対応する要素を作成するときに除外する必要があります。以下の図にある住所のfieldは、そのよい例です。ここで問題となるのは、field 名 “Address:”、“(Address)” (これらは認識から除外する必要があります) 、および住所そのもの (これは認識される必要があります) の相対的な位置関係です。 Exclude function は、要素の検索領域から Region を除外します。除外する Region は、function の呼び出し時に指定します。除外対象の Region には、仮説の Region (検出されていても、されていなくても可) 、見つかった要素の Rectangle または矩形の array、あるいは見つかった仮説の一部であるオブジェクトの Region から構成された Region (ExcludeSet メソッドを参照) を指定できます。 Exclude.fsp project (フォルダー %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Exclude) を見ながら、Exclude function の動作を確認してみましょう。 この project には 4 つのページがあります。
  • ページ 1 - 住所fieldは複数行で記載されています。“Address:” という名前は 1 行目にあるため、目的の data field が field 名の右側または下側にあるとは言えません。ただし、この名前は認識から除外する必要があります。
  • ページ 2 – 住所fieldには名前がありません。
  • ページ 3 と 4 – “(Address)” という行が data field 内にあります。ただし、これも認識から除外する必要があります。
すべてのページで、住所fieldは会社名のfieldの下にあります。 まず、型 Static Text の要素を作成し、名前を CompanyHeader にして、その値を指定します。この要素は field 名を検出するために使用します。 次に、型 Static Text の要素を作成し、名前を AddressHeader にします。この要素も field 名を検出するために使用します。次の static text 値を指定します: Address:|(Address)。つまり、検出し、その後住所fieldの認識から除外する必要がある、この行のすべての候補を列挙します。これらの行の検索条件は Relations field で記述し、CompanyHeader 要素の下側 (Below) で検索するよう指定します。
名前用の要素は、住所field用の要素より先に作成する必要があります。これは、Exclude function では、現在の要素よりも FlexiLayout ツリー内で上位にある要素しか参照できないためです。
FlexiLayout のマッチング手順 (Match FlexiLayout) を実行し、住所名が存在するすべてのページで見つかることを確認します。 この例では住所fieldが複数行あるため、それを検索するために型 Paragraph の要素を作成します。名前は Address にし、前の例と同様に、CompanyHeader 要素の下側 (Below) で検索するよう指定します。 FlexiLayout のマッチング手順を実行すると、ページ 1、3、4 では名前の行も住所fieldに含まれていることがわかります。 ここで Address 要素の Properties ダイアログに戻り、Search Constraints tab をクリックします。Exclude regions of elements セクションの横にある Add… をクリックし、リストから AddressHeader 要素を選択します。
要素のプロパティを保存したら、再度 FlexiLayout のマッチング手順を実行します。すると、住所fieldに対応するブロックの Region が非矩形になっていることがわかります。これは、名前の Region がそこから切り取られたためです。
Exclude regions of elements セクションでは、別の要素について見つかった仮説の Region を、現在の要素の検索領域から除外できます。より複雑な形状の領域を除外する場合、または先に Region を検出してからそれを認識処理から除外する場合は、Advanced pre-search relations field で関数 ExcludeExcludeRectExcludeSet を使用する必要があります。
定義上、ブロックのRegionは上下に積み重ねられた矩形で構成されるため、任意の水平線がそのRegionと交差できるのは 1 回だけです。つまり、縦方向に突き出た「歯」のような部分は存在できません。したがって、除外対象の線と必要な情報が同じ高さ、またはほぼ同じ高さにある場合、FlexiLayout の作成段階ではその名前を除外できません。その場合は、認識後に FlexiCapture で「Substitute from the list」ルールを使用して名前を除外できます。