Saltar al contenido principal
Al procesar un documento, ABBYY FineReader Engine primero analiza su Layout y detecta determinadas áreas en las páginas del documento. Estas áreas se denominan “bloques”. Los bloques determinan cómo y en qué orden deben reconocerse las áreas de la imagen. En ABBYY FineReader Engine, el objeto Layout sirve para almacenar bloques y texto reconocido. Los escenarios básicos de procesamiento de documentos trabajan con el Layout dentro del objeto FRDocument, que representa el documento que se está procesando. Para acceder al Layout de una página del documento, use la propiedad IFRPage::Layout. Si los usuarios de FRE para Windows o Linux utilizan el objeto Engine cargado como servidor fuera del proceso, pueden acelerar la iteración del objeto Layout con el siguiente esquema: Para Windows:
  1. Use el objeto OutprocLoader para procesar un documento y obtener un Layout para cada página. Escriba el Layout obtenido en un flujo de datos mediante el método SaveToStream.
  2. Use el objeto InprocLoader para restaurar una copia del Layout original con el método CreateLayoutFromStream. Use esta copia para iterar posteriormente por el contenido del Layout.
Para Linux:
  1. Use el objeto Engine cargado como servidor fuera del proceso para procesar un documento y obtener un Layout para cada página. Escriba el Layout obtenido como una matriz de bytes mediante el método SaveToArray.
  2. Use el objeto Engine cargado de forma nativa (es decir, cargado en el proceso actual desde la biblioteca libFREngine.so) para leer la matriz de bytes obtenida con su implementación de la interfaz IReadStream.
  3. Use el objeto Engine cargado de forma nativa para restaurar una copia del Layout original con el método CreateLayoutFromStream. Use esta copia para iterar posteriormente por el contenido del Layout.
Los bloques que obtenga del Layout de una FRPage dejarán de ser válidos después de llamar a cualquiera de los métodos que realizan el análisis del Layout (como Analyze o Process) para esta página o para el documento al que pertenece. Después del análisis, busque los bloques que necesite en el nuevo Layout y continúe trabajando con los nuevos objetos Block.

Bloques de Layout

El objeto Layout proporciona acceso a la estructura del Layout a través de las propiedades Blocks y BlackSeparators. Ambas propiedades permiten acceder a los subobjetos LayoutBlocks, que representan colecciones de bloques. La primera se refiere al conjunto principal de bloques de Layout, que contiene textos, tablas, imágenes, códigos de barras y marcas de verificación. La segunda se refiere a la colección de bloques de separadores. Los separadores son líneas negras que se detectan durante el análisis del Layout de la página. Se utilizan para reconstruir con mayor precisión el Layout de la página durante la síntesis y la exportación. Además, puede obtener los bloques en un orden lógico mediante la propiedad SortedBlocks del objeto Layout. Cada bloque tiene su propia región, que consta de varios rectángulos. Una región se representa mediante el objeto Region. Según el tipo de datos que contenga el bloque, los bloques pueden ser de distintos tipos, cada uno con sus propiedades específicas. Se puede acceder a estas propiedades mediante los objetos correspondientes al tipo de bloque, que pueden obtenerse usando los métodos del objeto Block. Las interfaces correspondientes a los tipos de bloque se derivan de la interfaz IBlock y heredan todas sus propiedades. Están disponibles los siguientes tipos de bloque:
Este tipo de bloque corresponde a una zona de la imagen reconocida como texto con formato. Se puede acceder a las propiedades de este bloque mediante el objeto TextBlock. Este objeto también proporciona acceso al texto reconocido de la parte de la imagen delimitada por el bloque.
Este tipo de bloque corresponde a una tabla. Los bloques de este tipo solo pueden ser rectangulares (la región contiene un solo rectángulo). Se puede acceder a las propiedades de este tipo de bloque mediante el objeto TableBlock. La estructura de la tabla se describe mediante dos colecciones de separadores de tabla, horizontales y verticales (los objetos TableSeparators), y una colección de celdas de tabla (el objeto TableCells). Cada celda de la tabla se trata como un bloque de algún tipo. El texto reconocido es una propiedad de una sola celda, no de toda la tabla. Si una celda es una imagen, la imagen contenida dentro de los límites de la celda no se reconoce y se muestra como una imagen en el texto reconocido. Los separadores de tabla pueden ser de distintos tipos. El tipo de separador se define para un segmento de un separador situado entre las intersecciones más cercanas con otros separadores. Los separadores pueden ser de los siguientes tipos:
  • Ausente. Este tipo se asigna a los separadores de tabla que “deberían pasar” a través de celdas combinadas.
  • Desconocido. Este tipo se asigna de forma predeterminada a cada separador de tabla recién agregado.
  • Invisible. Este tipo se asigna a un separador de tabla “imaginario” creado como resultado del análisis de la estructura de la tabla en un lugar donde la tabla de origen no tenía uno, pero donde lógicamente debería haberlo.
  • Explícito. Los separadores de tabla de este tipo aparecen donde se encuentran las líneas negras de la tabla de origen.
  • Múltiple. Este tipo de separador puede aparecer como resultado de la edición de la tabla. Table
Este tipo de bloque representa una zona de la imagen tratada como imagen rasterizada. La parte de la imagen delimitada por este bloque no se reconoce, y el bloque se exporta “tal cual”. Las propiedades de este tipo de bloque están representadas por el objeto RasterPictureBlock.
Este tipo de bloque representa una zona de la imagen tratada como imagen vectorial. Los bloques de este tipo solo pueden aparecer en el Layout si se ha analizado una página con la propiedad IPageAnalysisParams::DetectVectorGraphics establecida en TRUE. Normalmente, las imágenes de fondo se reconocen como bloques de este tipo. Las propiedades de este tipo de bloque están representadas por el objeto VectorPictureBlock.
La parte de la imagen delimitada por un bloque de este tipo se trata como un código de barras. ABBYY FineReader Engine reconoce códigos de barras de varios tipos y también puede detectar automáticamente su tipo. La información leída de un código de barras reconocido puede consultarse mediante las propiedades específicas del bloque de código de barras representadas por el objeto BarcodeBlock.
La parte de la imagen delimitada por un bloque de este tipo se trata como una marca de verificación. Corresponde a un área de la imagen reconocida como una marca de verificación. La información leída de una marca de verificación reconocida puede consultarse mediante las propiedades específicas del bloque de marca de verificación representadas por el objeto CheckmarkBlock.
La parte de la imagen delimitada por un bloque de este tipo se trata como un grupo de marcas de verificación. Corresponde a un área de la imagen reconocida como un grupo de marcas de verificación. La información leída de un grupo de marcas de verificación reconocido puede consultarse mediante las propiedades específicas del bloque de grupo de marcas de verificación representadas por el objeto CheckmarkGroup.
La parte de la imagen delimitada por un bloque de este tipo se trata como un separador. Los separadores son líneas que se detectan durante el análisis del Layout de la página. Pueden ser partes de una tabla, líneas que separan distintos elementos de texto, etc. Las coordenadas y el tipo de un separador pueden consultarse mediante el objeto SeparatorBlock.
La parte de la imagen delimitada por un bloque de este tipo se trata como un grupo de separadores. Corresponde a una zona de la imagen reconocida como un grupo de separadores. Un grupo de separadores suele incluir cuatro separadores que forman un rectángulo. Por ejemplo, las cuatro líneas del borde de una tabla se reconocen como un grupo de separadores. Cada grupo de separadores contiene una colección de bloques de separador. Las propiedades específicas de un bloque de grupo de separadores están representadas por el objeto SeparatorGroup.
También existen bloques de autoanálisis, que se usan solo en Visual Components (parte de FRE for Windows). No se pueden crear ni reconocer mediante la API de FineReader Engine. Solo están disponibles a través de la propiedad ILayout::VisualBlocks.

Agregar bloques manualmente

Los bloques se detectan automáticamente en una página durante el análisis del Layout. Pero puede que desee dibujar bloques manualmente. En este caso:
  1. Abra el objeto FRPage y obtenga el Layout de la página mediante la propiedad Layout.
  2. Cree un objeto Region para el bloque mediante el método IEngine::CreateRegion y agregue rectángulos a este mediante el método IRegion::AddRect.
  3. Cree un bloque del tipo requerido y agréguelo a la colección de bloques del Layout mediante el método AddNew del objeto LayoutBlocks.
  4. Establezca los parámetros necesarios del bloque (use el objeto de propiedades del bloque correspondiente al tipo de bloque).

Cambiar el tipo de bloque

El tipo de bloque se define durante su creación y no se puede cambiar. Si necesita cambiarlo, tendrá que eliminar el bloque y crear otro del tipo necesario exactamente en el mismo lugar:
  1. Cree un objeto Region mediante el método IEngine::CreateRegion y copie la región del bloque que necesita reemplazar con el método IRegion::CopyFrom.
  2. Elimine el bloque antiguo del Layout llamando al método ILayoutBlocks::DeleteAt.
  3. Cree un nuevo bloque del tipo requerido y agréguelo a la colección de bloques de Layout mediante el método AddNew del objeto LayoutBlocks. Pase la Region que copió del bloque anterior como uno de los parámetros obligatorios.

Consulte también

Reconocimiento de marcas de verificación Trabajar con texto