質問
格子状の形でない一定の繰り返しパターンがある表を読む方法を教えてください。
回答
帳票によっては、読み取りたい部分の表のような繰り返される箇所が下図のように、格子状になっていなくて、Table: 表 では読み取れず、どうやって読めば良いか分からない場合があるかもしれません。
RepeatingGroup: 繰り返しグループ を使えば下図のような表も容易に読み取ることが可能です。
上図のような表において、おすすめしたいのは、Separator: 区切り線 を使って、取得したい範囲に関連する線を取得しておくことです。上図であれば、表を取り囲む各線、そして、ヘッダの底の線などです。
線を取得すると、どの範囲で、ある特定のパターンが繰り返されるかを指定できると思いますので、これを RepeatingGroup: 繰り返しグループ の範囲 内に指定します。
RepeatingGroup: 繰り返しグループ で読み取る範囲を指定する:
RepeatingGroup: 繰り返しグループ で読み取る範囲を指定する:
上図の表では、繰り返しのパターンの起点となる要素として、たとえば、何とかして、各行の底の線が取得したい所です。
ここで、この例では、表の左端に注目してみます。行ごとに横線が綺麗に縦に並んでいます。
この行番号の線を RepeatingGroup: 繰り返しグループ の中の要素として定義してみます。
「関係」タブ:
- 行番号の右側より左
- ページの上辺 に 最も近い
「区切り」タブ:
- 向き: 横
- 「検索領域内に完全に合わせる」をオフにする
「検索領域内に完全に合わせる」の設定は重要です。
デフォルトの「検索領域内に完全に合わせる」の設定では、線は、切り取ることができませんが(線全体を取得しようとする)、「行番号の右側より左」に合わせて、線を切り取って取得できるようになります。
以上のような設定を行うと、下図のように、行の底の線に使えそうな線を繰り返し要素として取得できます。
これだけでも、このような格子状でない表の行を取得する起点要素として十分なのですが、本例では、行の底の線の全体を取得するようにします。
たとえば、各行の底の線はの上図の各繰り返し要素の上下 15 ピクセル内にあるので、そのように設定してみます。
また、各行の底の線は、上図の起点となる線の LastFound : 一つ前 (最後ではありません) なので、そのように設定します(この設定がないと、各行の中間にある線も対象となってしまいます)。
各行の底の線を取得することができました。ここまで出来たらもう少しです。
まず、各行は上図の各行 hSp_Row_bottom1, 2, 3....N の上側であることが設定できるかと思います。
ここで、大事なのは、この設定だけでは、各行が「どこより下側か」がわかりません。繰り返しグループで便利なのは、 Repeating Group: 繰り返しグループ には特殊なインスタンスがあり、このような表形式の読み取りでは、下図のような設定が可能なことです*。
*上の設定とほとんど同じですが、注意するのは、行の下側の各線 hSp_Row_bottom1, 2, 3....N の LastFound の 下側であると指定する点です。
LastFound とは、 行の下側の各線 hSp_Row_bottom1, 2, 3....N の繰り返しで例を挙げれば、
行の下側の各線 hSp_Row_bottom1, 2, 3....N が CurrentInstance (デフォルト)であるとすれば、LastFoundはその一つ前(最後ではありません)、行の下側の各線 hSp_Row_bottom0(無), 1, 2....N-1 であるということです。
例:
行の下側の各線 でCurrentInstanceが hSp_Row_bottom 2 の LastFound は hSp_Row_bottom1
行の下側の各線 でCurrentInstanceが hSp_Row_bottom 3 の LastFound は hSp_Row_bottom2
このように、繰り返しのパターンを設定すると、各行を下図のように取得できるようになります。
*FlexiLayout上で各行を取得した例:
ここで、各行の真ん中の線も取得したい所です。
各行の真ん中の線は、各行要素: CurrentInstance の上端の上側であり...
一方、各行の真ん中の線は、各行要素: LastInstance の下端の下側ということなります。
すると、各行の真ん中の線もきれいに取得することができます。
ここから、各行の各要素の上下を取得するのは分かりやすいかと思います。
各行の要素真ん中の線: CurrentInstance より上側と下側で分ければ良いわけです。
各行の要素真ん中の線: CurrentInstance より上側を設定する例:
各行の要素真ん中の線: CurrentInstance より下側をせっていする例:
もう一点、このような格子状になっていない連続行の要素取得する際に注意すべき点があります。
それは、各行の中の縦線は、あまり起点にすべきではない、という点です。
帳票の画像の品質によっては、縦、横の線に限らず、短い線は、線として FlexiLayout が認識しないことがあります。ですので、このような格子状になっていない行の各要素を取得する場合は、
Region Element: 区域 の 「高度」タブの 「高度な検索前関係」を使用することをお勧めします。
// コード例:
LeftOf: SearchElements.vSp_Table_No_right.Left - 670 * ( SearchElements.vSp_Table_No_right.Left - SearchElements.vSp_Table_right.Right )/1000;
RightOf: SearchElements.vSp_Table_No_right.Left - 540 * ( SearchElements.vSp_Table_No_right.Left - SearchElements.vSp_Table_right.Right )/1000;
このように設定しておけば、表の囲み線や、行の横線は長く、くっきりしていることが多いですから、もし、行の中の短い線が線として認識されなくても、表を構成する線の長さの比率で、要素を取得することができ、多少の画像の品質の違いに対応できるようになります。
FlexiCaptureでの読み取り結果表示例:
詳しくは下のリンクからご入手できるサンプルプロジェクトをご覧ください。
*ご覧になるには、バージョン12.0.2.3118以上の FlexiCaptureが必要です。
コメント
0件のコメント
サインインしてコメントを残してください。