- Use o objeto OutprocLoader para processar um documento e obter um layout para cada página. Grave o layout obtido em um fluxo de dados com o método SaveToStream.
- Use o objeto InprocLoader para restaurar uma cópia do layout original com o método CreateLayoutFromStream. Use essa cópia para iterar posteriormente pelo conteúdo do layout.
- Use o objeto Engine carregado como servidor fora do processo para processar um documento e obter um layout para cada página. Grave o layout obtido como um array de bytes com o método SaveToArray.
- Use o objeto Engine carregado nativamente (ou seja, carregado no processo atual a partir da biblioteca libFREngine.so) para ler o array de bytes obtido com sua implementação da interface IReadStream.
- Use o objeto Engine carregado nativamente para restaurar uma cópia do layout original com o método CreateLayoutFromStream. Use essa cópia para iterar posteriormente pelo conteúdo do layout.
Blocos de layout
Bloco de texto
Bloco de texto
Este tipo de bloco corresponde a uma área da imagem reconhecida como texto formatado. As propriedades desse bloco podem ser acessadas por meio do objeto TextBlock. Esse objeto também fornece acesso ao texto reconhecido da parte da imagem delimitada pelo bloco.
Bloco de tabela
Bloco de tabela
Este tipo de bloco corresponde a uma tabela. Blocos desse tipo só podem ser retangulares (a Region contém apenas um retângulo). As propriedades desse tipo de bloco podem ser acessadas por meio do objeto TableBlock. A estrutura da tabela é descrita por duas coleções de separadores de tabela, horizontais e verticais (os objetos TableSeparators), e por uma coleção de células da tabela (o objeto TableCells). Cada célula da tabela é tratada como um bloco de algum tipo. O texto reconhecido é uma propriedade de uma única célula, e não da tabela inteira. Se uma célula for uma imagem, a imagem contida nos limites da célula não será reconhecida e será exibida como imagem no texto reconhecido. Os separadores de tabela podem ser de tipos diferentes. Um tipo de separador é definido para um segmento de separador que fica entre suas interseções mais próximas com outros separadores. Os separadores podem ser dos seguintes tipos:
- Ausente. Este tipo é atribuído a separadores de tabela que “deveriam passar” por células mescladas.
- Desconhecido. Este tipo é atribuído por padrão a todo separador de tabela recém-adicionado.
- Invisível. Este tipo é atribuído a um separador de tabela “imaginário” criado como resultado da análise da estrutura da tabela em um ponto onde a tabela de origem não tinha um, mas onde logicamente deveria haver.
- Explícito. Separadores de tabela desse tipo aparecem onde estão localizadas as linhas pretas da tabela de origem.
-
Múltiplo. Este tipo de separador pode aparecer como resultado da edição da tabela.

Bloco de imagem raster
Bloco de imagem raster
Este tipo de bloco representa uma área da imagem tratada como uma imagem raster. A parte da imagem delimitada por esse bloco não é reconhecida, e o bloco é exportado “como está”. As propriedades desse tipo de bloco são representadas pelo objeto RasterPictureBlock.
Bloco de imagem vetorial
Bloco de imagem vetorial
Este tipo de bloco representa uma área da imagem tratada como uma imagem vetorial. Blocos desse tipo podem aparecer no layout somente se uma página tiver sido analisada com a propriedade IPageAnalysisParams::DetectVectorGraphics definida como TRUE. Normalmente, imagens de plano de fundo são reconhecidas como blocos desse tipo. As propriedades desse tipo de bloco são representadas pelo objeto VectorPictureBlock.
Bloco de código de barras
Bloco de código de barras
Uma parte da imagem delimitada por um bloco desse tipo é tratada como um código de barras. O ABBYY FineReader Engine reconhece códigos de barras de vários tipos e também pode detectar automaticamente o tipo do código de barras. As informações lidas de um código de barras reconhecido podem ser acessadas pelas propriedades específicas do bloco de código de barras, representadas pelo objeto BarcodeBlock.
Bloco de caixa de seleção
Bloco de caixa de seleção
Uma parte da imagem delimitada por um bloco desse tipo é tratada como uma marca de seleção. Ela corresponde a uma área da imagem reconhecida como uma marca de seleção. As informações lidas de uma marca de seleção reconhecida podem ser acessadas pelas propriedades específicas do bloco de caixa de seleção, representadas pelo objeto CheckmarkBlock.
Bloco de grupo de marcas de seleção
Bloco de grupo de marcas de seleção
Uma parte da imagem delimitada por um bloco desse tipo é tratada como um grupo de marcas de seleção. Ela corresponde a uma área da imagem reconhecida como um grupo de marcas de seleção. As informações lidas de um grupo de marcas de seleção reconhecido podem ser acessadas pelas propriedades específicas do bloco de grupo de marcas de seleção, representadas pelo objeto CheckmarkGroup.
Bloco separador
Bloco separador
Uma parte da imagem delimitada por um bloco desse tipo é tratada como um separador. Os separadores são linhas detectadas durante a análise do layout da página. Eles podem ser partes de uma tabela, linhas que separam diferentes elementos de texto etc. As coordenadas e o tipo de um separador podem ser acessados pelo objeto SeparatorBlock.
Bloco de grupo de separadores
Bloco de grupo de separadores
Uma parte da imagem delimitada por um bloco desse tipo é tratada como um grupo de separadores. Ela corresponde a uma área da imagem reconhecida como um grupo de separadores. Um grupo de separadores geralmente inclui quatro separadores que formam um retângulo. Por exemplo, as quatro linhas da borda de uma tabela são reconhecidas como um grupo de separadores. Cada grupo de separadores contém uma coleção de blocos separadores. As propriedades específicas de um bloco de grupo de separadores são representadas pelo objeto SeparatorGroup.
Também existem blocos de autoanálise, que são usados apenas no Visual Components (parte do FRE for Windows). Eles não podem ser criados nem reconhecidos pela API do FineReader Engine. Estão disponíveis apenas por meio da propriedade ILayout::VisualBlocks.
Adicionando blocos manualmente
- Abra o objeto FRPage e obtenha o layout da página por meio da propriedade Layout.
- Crie um objeto Region para o bloco usando o método IEngine::CreateRegion e adicione retângulos a ele usando o método IRegion::AddRect.
- Crie um bloco do tipo desejado e adicione-o à coleção de blocos do layout usando o método AddNew do objeto LayoutBlocks.
- Defina os parâmetros necessários do bloco (use o objeto de propriedades do bloco correspondente ao tipo de bloco).
Alterando o tipo de bloco
- Crie um objeto Region usando o método IEngine::CreateRegion e copie a Region do bloco que você precisa substituir usando o método IRegion::CopyFrom.
- Exclua o bloco antigo do layout chamando o método ILayoutBlocks::DeleteAt.
- Crie um novo bloco do tipo necessário e adicione-o à coleção de blocos do layout usando o método AddNew do objeto LayoutBlocks. Passe a Region copiada do bloco antigo como um dos parâmetros obrigatórios.
