Al crear un FlexiLayout, las áreas de búsqueda no siempre pueden definirse en términos de “top-bottom-left of-right of”. Esto es especialmente cierto cuando el área de búsqueda contiene objetos no deseados, por ejemplo, objetos que pueden haberse introducido durante el escaneo. Estos objetos no deben incluirse en el bloque de reconocimiento, por lo que deben excluirse al crear el elemento correspondiente. El campo de dirección en las figuras siguientes es un buen ejemplo. Aquí se hace referencia a la ubicación relativa de los nombres de campo “Address:”, “(Address)” (que deben excluirse del reconocimiento) y la propia dirección (que debe reconocerse).
La función Exclude excluye una región del área de búsqueda de un elemento. La región que se va a excluir se especifica al llamar a la función. La región excluida puede ser la región de una hipótesis (detectada o no), un rectángulo o un array de rectángulos de los elementos encontrados, o una región creada a partir de las regiones de objetos que forman parte de una hipótesis encontrada (consulte el método ExcludeSet).
Veamos el proyecto Exclude.fsp (carpeta %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Exclude) para entender cómo funciona la función Exclude.
El proyecto tiene 4 páginas:
- Página 1: el campo de dirección está escrito en varias líneas. El nombre “Address:” está en la primera línea, por lo que no podemos decir que el campo de datos buscado esté a la derecha o debajo del nombre del campo. Sin embargo, el nombre debe excluirse del reconocimiento;
- Página 2: el campo de dirección no tiene nombre;
- Páginas 3 y 4: la línea “(Address)” se encuentra dentro del campo de datos. Sin embargo, debe excluirse del reconocimiento.
En todas las páginas, el campo de dirección está debajo del campo con el nombre de la empresa.
Primero, creamos un elemento de tipo texto estático, lo llamamos CompanyHeader y especificamos su valor. Este elemento se usará para detectar el nombre del campo.
A continuación, creamos un elemento de tipo texto estático y lo llamamos AddressHeader. Este elemento se usará para detectar el nombre del campo. Especificamos los siguientes valores de texto estático: Address:|(Address); es decir, enumeramos todas las variantes de esta línea que deben detectarse y luego excluirse del reconocimiento en el campo de dirección. Describimos las restricciones de búsqueda para estas líneas en el campo Relations y especificamos que estas líneas deben buscarse debajo (Below) del elemento CompanyHeader.
El elemento para el nombre debe crearse antes que el elemento para el campo de dirección, porque la función Exclude solo permite hacer referencia a elementos que están más arriba en el árbol de FlexiLayout que el elemento actual.
Inicie el procedimiento de emparejamiento de FlexiLayout (Match FlexiLayout) para asegurarse de que el nombre de la dirección se encuentre en todas las páginas en las que aparece.
Como el campo de dirección de este ejemplo tiene varias líneas, creamos un elemento de tipo párrafo para buscarlo. Lo llamamos Address y, como en el ejemplo anterior, especificamos que debe buscarse debajo (Below) del elemento CompanyHeader.
Una vez que haya ejecutado el procedimiento de emparejamiento de FlexiLayout, verá que en las páginas 1, 3 y 4 la línea del nombre también se ha incluido en el campo de dirección.
Ahora vuelva al cuadro de diálogo de propiedades del elemento Address y haga clic en la pestaña Search Constraints. Haga clic en Add… junto a la sección Exclude regions of elements y elija el elemento AddressHeader de la lista.
Después de guardar las propiedades del elemento, ejecute de nuevo el procedimiento de emparejamiento de FlexiLayout. Verá que la región del bloque que corresponde al campo de dirección ha adquirido una forma no rectangular, porque la región del nombre se ha recortado de ella.
La sección Exclude regions of elements le permite excluir del área de búsqueda del elemento actual la región correspondiente a una hipótesis encontrada para otro elemento. Para excluir un área geométricamente más compleja, o detectar primero una región y luego excluirla del proceso de reconocimiento, debe usar las funciones Exclude, ExcludeRect y ExcludeSet en el campo relación avanzada de prebúsqueda.
La región de un bloque, por definición, consta de rectángulos apilados, por lo que cualquier línea horizontal solo puede cruzar la región una vez; es decir, no puede haber “dientes” verticales que sobresalgan. Por lo tanto, si la línea que se va a excluir y la información requerida están a la misma altura, o casi, el nombre no puede excluirse durante la creación de FlexiLayout. En ese caso, el nombre puede excluirse después del reconocimiento en FlexiCapture mediante la regla “Substitute from the list”.