> ## 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.

# Layout とブロックの操作

> ABBYY FineReader Engine の Layout オブジェクトとブロックを操作します。ブロック型の検出、ブロックの手動追加、SaveToStream / CreateLayoutFromStream によるレイアウトのシリアル化、およびアウトプロセスでの高速化について説明します。

ドキュメントを処理する際、ABBYY FineReader Engine はまずレイアウトを解析し、ドキュメントページ上の特定の領域を検出します。これらの領域は「ブロック」と呼ばれます。ブロックは、画像内の各領域をどのような順序で認識するかを決定します。

ABBYY FineReader Engine では、[Layout](/ja/fine-reader/engine/api-reference/layout-related-objects/layout) オブジェクトは、ブロックと認識されたテキストを格納するための領域として機能します。基本的なドキュメント処理シナリオでは、処理対象のドキュメントを表す [FRDocument](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument) オブジェクト内のレイアウトを扱います。ドキュメントページのレイアウトにアクセスするには、[IFRPage::Layout](/ja/fine-reader/engine/api-reference/document-related-objects/frpage) プロパティを使用します。

Windows または Linux 版の FRE で、アウトオブプロセス サーバーとして読み込まれた [Engine](/ja/fine-reader/engine/api-reference/engine-object-iengine-interface) オブジェクトを使用している場合は、次の方法で [Layout](/ja/fine-reader/engine/api-reference/layout-related-objects/layout) オブジェクトの反復処理を高速化できます。

Windows の場合:

1. [OutprocLoader](/ja/fine-reader/engine/api-reference/engine-loaders/outprocloader) オブジェクトを使用してドキュメントを処理し、各ページのレイアウトを取得します。取得したレイアウトを、[SaveToStream](/ja/fine-reader/engine/api-reference/layout-related-objects/layout/savetostream-method) メソッドでデータ ストリームに書き込みます。
2. [InprocLoader](/ja/fine-reader/engine/api-reference/engine-loaders/inprocloader) オブジェクトを使用して、[CreateLayoutFromStream](/ja/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlayoutfromstream-method) メソッドで元のレイアウトのコピーを復元します。このコピーを、その後のレイアウト内容の反復処理に使用します。

Linux の場合:

1. アウトオブプロセス サーバーとして読み込まれた Engine オブジェクトを使用してドキュメントを処理し、各ページのレイアウトを取得します。取得したレイアウトを、[SaveToArray](/ja/fine-reader/engine/api-reference/layout-related-objects/layout/savetoarray-method) メソッドでバイト配列として書き込みます。
2. ネイティブに読み込まれた Engine オブジェクト (つまり、libFREngine.so ライブラリから現在のプロセス内に読み込まれたもの) を使用し、[IReadStream](/ja/fine-reader/engine/api-reference/supplementary-objects-and-methods/ireadstream) インターフェイスの実装によって取得したバイト配列を読み取ります。
3. ネイティブに読み込まれた Engine オブジェクトを使用して、[CreateLayoutFromStream](/ja/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlayoutfromstream-method) メソッドで元のレイアウトのコピーを復元します。このコピーを、その後のレイアウト内容の反復処理に使用します。

<Warning>
  [FRPage](/ja/fine-reader/engine/api-reference/document-related-objects/frpage) のレイアウトから取得したブロックは、このページ、またはそのページが属するドキュメントに対してレイアウト解析を実行するメソッド ([Analyze](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument/analyze-method) や [Process](/ja/fine-reader/engine/api-reference/document-related-objects/frdocument/process-method) など) を呼び出すと無効になります。解析後は、新しいレイアウト内で必要なブロックを見つけ、新しい [Block](/ja/fine-reader/engine/api-reference/layout-related-objects/block) オブジェクトを使って作業を続けてください。
</Warning>

<div id="layout-blocks">
  ## レイアウトブロック
</div>

Layout オブジェクトでは、Blocks プロパティと BlackSeparators プロパティを通じてレイアウト構造にアクセスできます。これらのプロパティはいずれも、ブロックのコレクションを表す [LayoutBlocks](/ja/fine-reader/engine/api-reference/layout-related-objects/layoutblocks) サブオブジェクトへのアクセスを提供します。前者は、テキスト、表、画像、バーコード、チェックマークを含むメインのレイアウトブロック一式を指します。後者は、セパレータ用ブロックのコレクションを指します。セパレータは、ページレイアウト解析時に検出される黒い線です。これらは、合成およびエクスポート時にページレイアウトをより正確に再構築するために使用されます。

また、[Layout](/ja/fine-reader/engine/api-reference/layout-related-objects/layout) オブジェクトの [SortedBlocks](/ja/fine-reader/engine/api-reference/layout-related-objects/layout/sortedblocks-property) プロパティを使用すると、論理的に並べ替えられた順序でブロックを取得できます。

各ブロックには複数の長方形で構成される領域があります。領域は [Region](/ja/fine-reader/engine/api-reference/supplementary-objects-and-methods/region) オブジェクトで表されます。

ブロックに含まれるデータの種類に応じて、ブロックにはさまざまな型があり、それぞれに固有のプロパティがあります。これらのプロパティには、[Block](/ja/fine-reader/engine/api-reference/layout-related-objects/block) オブジェクトのメソッドを使用して取得できる対応するブロック型オブジェクトを介してアクセスできます。対応するブロック型インターフェイスは [IBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/block) インターフェイスから派生しており、そのすべてのプロパティを継承します。使用できるブロック型は次のとおりです。

<Accordion title="テキストブロック">
  このブロック型は、書式付きテキストとして認識される画像領域に対応します。このブロックのプロパティには、[TextBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/textblock) オブジェクトを介してアクセスできます。このオブジェクトでは、ブロックで囲まれた画像部分から認識されたテキストにもアクセスできます。
</Accordion>

<Accordion title="表ブロック">
  このブロック型は表に対応します。この型のブロックは長方形のみ可能です (領域には長方形が 1 つだけ含まれます) 。このブロック型のプロパティには、[TableBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/tableblock) オブジェクトを介してアクセスできます。表の構造は、水平および垂直の表セパレータの 2 つのコレクション ([TableSeparators](/ja/fine-reader/engine/api-reference/layout-related-objects/tableseparators) オブジェクト) と、表セルのコレクション ([TableCells](/ja/fine-reader/engine/api-reference/layout-related-objects/tablecells) オブジェクト) によって記述されます。各表セルは、何らかの型のブロックとして扱われます。認識されたテキストは表全体ではなく、個々のセルのプロパティです。セルが画像である場合、セルの境界内に含まれる画像は認識されず、認識テキスト内では画像として表示されます。表セパレータには複数の型があります。セパレータの型は、他のセパレータとの最も近い交点の間にあるセパレータセグメントに対して定義されます。セパレータには次の型があります。

  * Absent。この型は、結合セルを横切って「存在するはずの」表セパレータに割り当てられます。
  * Unknown。この型は、新しく追加されたすべての表セパレータに既定で割り当てられます。
  * Invisible。この型は、元の表には存在しなかったものの、論理的には存在すべき位置に、表構造解析の結果として作成される「仮想的な」表セパレータに割り当てられます。
  * Explicit。この型の表セパレータは、元の表の黒線がある位置に現れます。
  * Multiple。この型のセパレータは、表の編集の結果として現れることがあります。

      <img src="https://mintcdn.com/abbyy/i-EfCQVmseNiPQcp/images/fine-reader/engine/table.gif?s=2a6a846ffbbde2b5a7ef328bc18c0851" alt="Table" width="332" height="239" data-path="images/fine-reader/engine/table.gif" />
</Accordion>

<Accordion title="ラスター画像ブロック">
  このブロック型は、ラスター画像として扱われる画像領域を表します。このブロックが囲む画像部分は認識されず、ブロックは「そのまま」エクスポートされます。このブロック型のプロパティは、[RasterPictureBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/rasterpictureblock) オブジェクトで表されます。
</Accordion>

<Accordion title="ベクター画像ブロック">
  このブロック型は、ベクター画像として扱われる画像領域を表します。この型のブロックは、ページが [IPageAnalysisParams::DetectVectorGraphics](/ja/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageanalysisparams#detectvectorgraphics) プロパティを TRUE に設定して解析された場合にのみ、レイアウト内に現れます。通常、背景画像はこの型のブロックとして認識されます。このブロック型のプロパティは、[VectorPictureBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/vectorpictureblock) オブジェクトで表されます。
</Accordion>

<Accordion title="バーコードブロック">
  このタイプのブロックで囲まれた画像の一部は、バーコードとして扱われます。ABBYY FineReader Engine は複数の[種類](/ja/fine-reader/engine/specifications/barcode-types)のバーコードを認識でき、バーコードの種類を自動的に検出することもできます。認識されたバーコードから読み取られた情報には、[BarcodeBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/barcodeblock) オブジェクトで表されるバーコードブロック固有のプロパティからアクセスできます。
</Accordion>

<Accordion title="チェックマークブロック">
  このタイプのブロックで囲まれた画像の一部は、チェックマークとして扱われます。これは、チェックマークとして認識された画像領域に対応します。認識されたチェックマークから読み取られた情報には、[CheckmarkBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock) オブジェクトで表されるチェックマークブロック固有のプロパティからアクセスできます。
</Accordion>

<Accordion title="チェックマークグループブロック">
  このタイプのブロックで囲まれた画像の一部は、チェックマークグループとして扱われます。これは、チェックマークグループとして認識された画像領域に対応します。認識されたチェックマークグループから読み取られた情報には、[CheckmarkGroup](/ja/fine-reader/engine/api-reference/layout-related-objects/checkmarkgroup) オブジェクトで表されるチェックマークグループブロック固有のプロパティからアクセスできます。
</Accordion>

<Accordion title="セパレータブロック">
  このタイプのブロックで囲まれた画像の一部は、セパレータとして扱われます。セパレータは、ページのレイアウト解析中に検出される線です。表の一部であったり、異なるテキスト要素を区切る線であったりします。セパレータの座標と種類には、[SeparatorBlock](/ja/fine-reader/engine/api-reference/layout-related-objects/separatorblock) オブジェクトからアクセスできます。
</Accordion>

<Accordion title="セパレータグループブロック">
  このタイプのブロックで囲まれた画像の一部は、セパレータグループとして扱われます。これは、セパレータのグループとして認識された画像領域に対応します。通常、セパレータのグループには長方形を形成する 4 本のセパレータが含まれます。たとえば、表の外枠を構成する 4 本の線はセパレータグループとして認識されます。各セパレータグループには、セパレータブロックのコレクションが含まれます。セパレータグループブロック固有のプロパティは、[SeparatorGroup](/ja/fine-reader/engine/api-reference/layout-related-objects/separatorgroup) オブジェクトで表されます。
</Accordion>

<Note>
  [autoanalysis blocks](/ja/fine-reader/engine/api-reference/layout-related-objects/autoanalysisblock) もありますが、これらは Visual Components (Windows 版 FRE の一部) でのみ使用されます。これらは FineReader Engine API では作成も認識もできません。利用できるのは [ILayout::VisualBlocks](/ja/fine-reader/engine/api-reference/layout-related-objects/layout#visualblocks) プロパティからのみです。
</Note>

<div id="adding-blocks-manually">
  ## ブロックを手動で追加する
</div>

ブロックは、レイアウト解析時にページ上で自動的に検出されます。ただし、ブロックを手動で描画したい場合もあります。その場合は、次の手順に従います。

1. [FRPage](/ja/fine-reader/engine/api-reference/document-related-objects/frpage) オブジェクトを開き、[Layout](/ja/fine-reader/engine/api-reference/document-related-objects/frpage#layout) プロパティからページのレイアウトを取得します。
2. [IEngine::CreateRegion](/ja/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlessobjectgreater-methods) メソッドを使用して、ブロック用の [Region](/ja/fine-reader/engine/api-reference/supplementary-objects-and-methods/region) オブジェクトを作成し、[IRegion::AddRect](/ja/fine-reader/engine/api-reference/supplementary-objects-and-methods/region/addrect-method) メソッドを使用してそのオブジェクトに矩形を追加します。
3. 必要なタイプのブロックを作成し、LayoutBlocks オブジェクトの [AddNew](/ja/fine-reader/engine/api-reference/layout-related-objects/layoutblocks/addnew-method) メソッドを使用してレイアウトブロックのコレクションに追加します。
4. ブロックに必要なパラメーターを設定します (ブロックのタイプに対応するブロックプロパティオブジェクトを使用します) 。

<div id="changing-the-block-type">
  ## ブロック型の変更
</div>

ブロック型は作成時に定義され、後から変更することはできません。ブロック型を変更する必要がある場合は、そのブロックを削除し、まったく同じ位置に必要なタイプの別のブロックを作成する必要があります。

1. [IEngine::CreateRegion](/ja/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlessobjectgreater-methods) メソッドを使用して [Region](/ja/fine-reader/engine/api-reference/supplementary-objects-and-methods/region) オブジェクトを作成し、[IRegion::CopyFrom](/ja/fine-reader/engine/visual-components-reference/supplementary-objects/spellwordcollection/copyfrom-method) メソッドを使って置き換えるブロックの領域をコピーします。
2. [ILayoutBlocks::DeleteAt](/ja/fine-reader/engine/visual-components-reference/supplementary-objects/spellwordcollection/deleteat-method) メソッドを呼び出して、Layout から古いブロックを削除します。
3. 必要なタイプの新しいブロックを作成し、LayoutBlocks オブジェクトの [AddNew](/ja/fine-reader/engine/api-reference/layout-related-objects/layoutblocks/addnew-method) メソッドを使用して レイアウトブロックのコレクションに追加します。必須パラメーターの 1 つとして、古いブロックからコピーした Region を渡します。

<div id="see-also">
  ## 関連項目
</div>

[チェックマークの認識](/ja/fine-reader/engine/guided-tour/advanced-techniques/recognizing-checkmarks)

[テキストの操作](/ja/fine-reader/engine/guided-tour/advanced-techniques/working-with-text)
