- 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.
- 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.
- 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.
- 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.
- 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.
Bloques de Layout
Bloque de texto
Bloque de texto
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.
Bloque de tabla
Bloque de tabla
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.

Bloque de imagen rasterizada
Bloque de imagen rasterizada
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.
Bloque de imagen vectorial
Bloque de imagen vectorial
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.
Bloque de código de barras
Bloque de código de barras
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.
Bloque de marca de verificación
Bloque de marca de verificación
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.
Bloque de grupo de marcas de verificación
Bloque de grupo de marcas de verificación
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.
Bloque de separador
Bloque de separador
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.
Bloque de grupo de separadores
Bloque de grupo de separadores
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
- Abra el objeto FRPage y obtenga el Layout de la página mediante la propiedad Layout.
- 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.
- 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.
- Establezca los parámetros necesarios del bloque (use el objeto de propiedades del bloque correspondiente al tipo de bloque).
Cambiar el tipo de bloque
- 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.
- Elimine el bloque antiguo del Layout llamando al método ILayoutBlocks::DeleteAt.
- 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.
