Pular para o conteúdo principal
Ao processar um documento, o ABBYY FineReader Engine primeiro analisa o layout e detecta determinadas áreas nas páginas do documento. Essas áreas são chamadas de “blocos”. Os blocos determinam como e em que ordem as áreas da imagem devem ser reconhecidas. No ABBYY FineReader Engine, o objeto Layout serve para armazenar blocos e texto reconhecido. Os cenários básicos de processamento de documentos trabalham com o layout no objeto FRDocument, que representa o documento em processamento. Para acessar o layout de uma página do documento, use a propriedade IFRPage::Layout. Se os usuários do FRE para Windows ou Linux usarem o objeto Engine carregado como servidor fora do processo, será possível acelerar a iteração do objeto Layout com o esquema a seguir: Para Windows:
  1. 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.
  2. 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.
Para Linux:
  1. 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.
  2. 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.
  3. 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.
Os blocos obtidos do layout de uma FRPage se tornarão inválidos após uma chamada a qualquer um dos métodos que executam análise de layout (como Analyze ou Process) para essa página ou para o documento ao qual ela pertence. Após a análise, localize os blocos necessários no novo layout e continue trabalhando com os novos objetos Block.

Blocos de layout

O objeto Layout fornece acesso à estrutura de layout por meio das propriedades Blocks e BlackSeparators. Ambas fornecem acesso aos subobjetos LayoutBlocks, que representam coleções de blocos. A primeira se refere ao conjunto principal de blocos de layout, que contém textos, tabelas, imagens, códigos de barras e marcas de seleção. A segunda se refere à coleção de blocos de separadores. Separadores são linhas pretas detectadas durante a análise do layout da página. Eles são usados para reconstruir o layout da página com mais precisão durante a síntese e a exportação. Além disso, é possível obter os blocos em uma ordem logicamente classificada com a propriedade SortedBlocks do objeto Layout. Cada bloco tem sua própria Region, que consiste em vários retângulos. Uma Region é representada pelo objeto Region. Dependendo do tipo de dados contidos no bloco, os blocos podem ser de tipos diferentes, cada um com propriedades específicas. Essas propriedades podem ser acessadas por meio dos objetos correspondentes a cada tipo de bloco, que podem ser obtidos usando os métodos do objeto Block. As interfaces correspondentes aos tipos de bloco derivam da interface IBlock e herdam todas as suas propriedades. Os seguintes tipos de bloco estão disponíveis:
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.
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. Table
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.
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.
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.
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.
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.
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.
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

Os blocos são encontrados automaticamente em uma página durante a análise de layout. Mas talvez você queira desenhar blocos manualmente. Nesse caso:
  1. Abra o objeto FRPage e obtenha o layout da página por meio da propriedade Layout.
  2. 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.
  3. Crie um bloco do tipo desejado e adicione-o à coleção de blocos do layout usando o método AddNew do objeto LayoutBlocks.
  4. 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

O tipo de bloco é definido durante a criação e não pode ser alterado. Se você precisar mudar o tipo de bloco, será necessário excluir o bloco e criar outro, do tipo necessário, exatamente no mesmo lugar:
  1. 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.
  2. Exclua o bloco antigo do layout chamando o método ILayoutBlocks::DeleteAt.
  3. 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.

Veja também

Reconhecimento de marcas de seleção Trabalhando com texto