メインコンテンツへスキップ
ドキュメントを処理する際、ABBYY FineReader Engine はまずレイアウトを解析し、ドキュメントページ上の特定の領域を検出します。これらの領域は「ブロック」と呼ばれます。ブロックは、画像内の各領域をどのような順序で認識するかを決定します。 ABBYY FineReader Engine では、Layout オブジェクトは、ブロックと認識されたテキストを格納するための領域として機能します。基本的なドキュメント処理シナリオでは、処理対象のドキュメントを表す FRDocument オブジェクト内のレイアウトを扱います。ドキュメントページのレイアウトにアクセスするには、IFRPage::Layout プロパティを使用します。 Windows または Linux 版の FRE で、アウトオブプロセス サーバーとして読み込まれた Engine オブジェクトを使用している場合は、次の方法で Layout オブジェクトの反復処理を高速化できます。 Windows の場合:
  1. OutprocLoader オブジェクトを使用してドキュメントを処理し、各ページのレイアウトを取得します。取得したレイアウトを、SaveToStream メソッドでデータ ストリームに書き込みます。
  2. InprocLoader オブジェクトを使用して、CreateLayoutFromStream メソッドで元のレイアウトのコピーを復元します。このコピーを、その後のレイアウト内容の反復処理に使用します。
Linux の場合:
  1. アウトオブプロセス サーバーとして読み込まれた Engine オブジェクトを使用してドキュメントを処理し、各ページのレイアウトを取得します。取得したレイアウトを、SaveToArray メソッドでバイト配列として書き込みます。
  2. ネイティブに読み込まれた Engine オブジェクト (つまり、libFREngine.so ライブラリから現在のプロセス内に読み込まれたもの) を使用し、IReadStream インターフェイスの実装によって取得したバイト配列を読み取ります。
  3. ネイティブに読み込まれた Engine オブジェクトを使用して、CreateLayoutFromStream メソッドで元のレイアウトのコピーを復元します。このコピーを、その後のレイアウト内容の反復処理に使用します。
FRPage のレイアウトから取得したブロックは、このページ、またはそのページが属するドキュメントに対してレイアウト解析を実行するメソッド (AnalyzeProcess など) を呼び出すと無効になります。解析後は、新しいレイアウト内で必要なブロックを見つけ、新しい Block オブジェクトを使って作業を続けてください。

レイアウトブロック

Layout オブジェクトでは、Blocks プロパティと BlackSeparators プロパティを通じてレイアウト構造にアクセスできます。これらのプロパティはいずれも、ブロックのコレクションを表す LayoutBlocks サブオブジェクトへのアクセスを提供します。前者は、テキスト、表、画像、バーコード、チェックマークを含むメインのレイアウトブロック一式を指します。後者は、セパレータ用ブロックのコレクションを指します。セパレータは、ページレイアウト解析時に検出される黒い線です。これらは、合成およびエクスポート時にページレイアウトをより正確に再構築するために使用されます。 また、Layout オブジェクトの SortedBlocks プロパティを使用すると、論理的に並べ替えられた順序でブロックを取得できます。 各ブロックには複数の長方形で構成される領域があります。領域は Region オブジェクトで表されます。 ブロックに含まれるデータの種類に応じて、ブロックにはさまざまな型があり、それぞれに固有のプロパティがあります。これらのプロパティには、Block オブジェクトのメソッドを使用して取得できる対応するブロック型オブジェクトを介してアクセスできます。対応するブロック型インターフェイスは IBlock インターフェイスから派生しており、そのすべてのプロパティを継承します。使用できるブロック型は次のとおりです。
このブロック型は、書式付きテキストとして認識される画像領域に対応します。このブロックのプロパティには、TextBlock オブジェクトを介してアクセスできます。このオブジェクトでは、ブロックで囲まれた画像部分から認識されたテキストにもアクセスできます。
このブロック型は表に対応します。この型のブロックは長方形のみ可能です (領域には長方形が 1 つだけ含まれます) 。このブロック型のプロパティには、TableBlock オブジェクトを介してアクセスできます。表の構造は、水平および垂直の表セパレータの 2 つのコレクション (TableSeparators オブジェクト) と、表セルのコレクション (TableCells オブジェクト) によって記述されます。各表セルは、何らかの型のブロックとして扱われます。認識されたテキストは表全体ではなく、個々のセルのプロパティです。セルが画像である場合、セルの境界内に含まれる画像は認識されず、認識テキスト内では画像として表示されます。表セパレータには複数の型があります。セパレータの型は、他のセパレータとの最も近い交点の間にあるセパレータセグメントに対して定義されます。セパレータには次の型があります。
  • Absent。この型は、結合セルを横切って「存在するはずの」表セパレータに割り当てられます。
  • Unknown。この型は、新しく追加されたすべての表セパレータに既定で割り当てられます。
  • Invisible。この型は、元の表には存在しなかったものの、論理的には存在すべき位置に、表構造解析の結果として作成される「仮想的な」表セパレータに割り当てられます。
  • Explicit。この型の表セパレータは、元の表の黒線がある位置に現れます。
  • Multiple。この型のセパレータは、表の編集の結果として現れることがあります。 Table
このブロック型は、ラスター画像として扱われる画像領域を表します。このブロックが囲む画像部分は認識されず、ブロックは「そのまま」エクスポートされます。このブロック型のプロパティは、RasterPictureBlock オブジェクトで表されます。
このブロック型は、ベクター画像として扱われる画像領域を表します。この型のブロックは、ページが IPageAnalysisParams::DetectVectorGraphics プロパティを TRUE に設定して解析された場合にのみ、レイアウト内に現れます。通常、背景画像はこの型のブロックとして認識されます。このブロック型のプロパティは、VectorPictureBlock オブジェクトで表されます。
このタイプのブロックで囲まれた画像の一部は、バーコードとして扱われます。ABBYY FineReader Engine は複数の種類のバーコードを認識でき、バーコードの種類を自動的に検出することもできます。認識されたバーコードから読み取られた情報には、BarcodeBlock オブジェクトで表されるバーコードブロック固有のプロパティからアクセスできます。
このタイプのブロックで囲まれた画像の一部は、チェックマークとして扱われます。これは、チェックマークとして認識された画像領域に対応します。認識されたチェックマークから読み取られた情報には、CheckmarkBlock オブジェクトで表されるチェックマークブロック固有のプロパティからアクセスできます。
このタイプのブロックで囲まれた画像の一部は、チェックマークグループとして扱われます。これは、チェックマークグループとして認識された画像領域に対応します。認識されたチェックマークグループから読み取られた情報には、CheckmarkGroup オブジェクトで表されるチェックマークグループブロック固有のプロパティからアクセスできます。
このタイプのブロックで囲まれた画像の一部は、セパレータとして扱われます。セパレータは、ページのレイアウト解析中に検出される線です。表の一部であったり、異なるテキスト要素を区切る線であったりします。セパレータの座標と種類には、SeparatorBlock オブジェクトからアクセスできます。
このタイプのブロックで囲まれた画像の一部は、セパレータグループとして扱われます。これは、セパレータのグループとして認識された画像領域に対応します。通常、セパレータのグループには長方形を形成する 4 本のセパレータが含まれます。たとえば、表の外枠を構成する 4 本の線はセパレータグループとして認識されます。各セパレータグループには、セパレータブロックのコレクションが含まれます。セパレータグループブロック固有のプロパティは、SeparatorGroup オブジェクトで表されます。
autoanalysis blocks もありますが、これらは Visual Components (Windows 版 FRE の一部) でのみ使用されます。これらは FineReader Engine API では作成も認識もできません。利用できるのは ILayout::VisualBlocks プロパティからのみです。

ブロックを手動で追加する

ブロックは、レイアウト解析時にページ上で自動的に検出されます。ただし、ブロックを手動で描画したい場合もあります。その場合は、次の手順に従います。
  1. FRPage オブジェクトを開き、Layout プロパティからページのレイアウトを取得します。
  2. IEngine::CreateRegion メソッドを使用して、ブロック用の Region オブジェクトを作成し、IRegion::AddRect メソッドを使用してそのオブジェクトに矩形を追加します。
  3. 必要なタイプのブロックを作成し、LayoutBlocks オブジェクトの AddNew メソッドを使用してレイアウトブロックのコレクションに追加します。
  4. ブロックに必要なパラメーターを設定します (ブロックのタイプに対応するブロックプロパティオブジェクトを使用します) 。

ブロック型の変更

ブロック型は作成時に定義され、後から変更することはできません。ブロック型を変更する必要がある場合は、そのブロックを削除し、まったく同じ位置に必要なタイプの別のブロックを作成する必要があります。
  1. IEngine::CreateRegion メソッドを使用して Region オブジェクトを作成し、IRegion::CopyFrom メソッドを使って置き換えるブロックの領域をコピーします。
  2. ILayoutBlocks::DeleteAt メソッドを呼び出して、Layout から古いブロックを削除します。
  3. 必要なタイプの新しいブロックを作成し、LayoutBlocks オブジェクトの AddNew メソッドを使用して レイアウトブロックのコレクションに追加します。必須パラメーターの 1 つとして、古いブロックからコピーした Region を渡します。

関連項目

チェックマークの認識 テキストの操作