Para detectar campos de una sola línea, FlexiLayout Studio dispone de un elemento especial de cadena de caracteres. Si el campo buscado tiene un formato conocido, puede describirse en las propiedades del elemento correspondiente, en la pestaña Character String, en el campo Regular expression. Sin embargo, el uso de una expresión regular exige documentos impresos y buena calidad de imagen, porque una descripción mediante expresión regular no admite errores en el campo; de lo contrario, el elemento simplemente no se detectará. Tampoco deben utilizarse expresiones regulares si el documento está rellenado a mano, incluso si su diseño puede describirse. No obstante, ese campo sí puede detectarse.
La búsqueda de un campo de una sola línea “Número de factura” con un formato similar en todas las páginas se muestra en el proyecto de ejemplo StructuredStrings.fsp (carpeta %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Structured strings).
El proyecto tiene cuatro páginas:
- Páginas 1 y 2 - el campo “Número de factura” está rellenado mediante impresora y la calidad de impresión es buena;
- Página 3 – el campo “Número de factura” está rellenado mediante impresora, pero la imagen tiene ruido;
- Página 4 – la calidad de imagen es buena, pero el campo “Número de factura” está rellenado a mano.
Vamos a buscar el campo “Número de factura” basándonos en el nombre del campo. Primero debemos crear un elemento que describa las restricciones de búsqueda del nombre del campo. El elemento creado es de tipo texto estático, se llama InvoiceNumberHeader y tiene el valor “InvoiceN:”.
El campo “Número de factura” es un campo de una sola línea. Para detectarlo, hemos creado un elemento de tipo cadena de caracteres, llamado NumAsRegularExpression. Como puede verse en las páginas del proyecto, el formato del campo “Número de factura” puede describirse con la siguiente expresión regular:
NNNN”-“NN”-“[A-Z]”/“NN
o bien (que es lo mismo)
[0-9]{4}”-“[0-9]{2}”-“[A-Z]”/” [0-9]{2}
Esto significa que el número es una secuencia de “cuatro dígitos - dos dígitos - una letra latina mayúscula/dos dígitos”.
Como puede verse en el proyecto, después de ejecutar el procedimiento de emparejamiento de FlexiLayout seleccionando el comando Match, se generaron hipótesis nulas para el elemento NumAsRegularExpression en las páginas 3 y 4; es decir, el elemento no se detectó. En la página 3, el ruido provocó que el campo no coincidiera con la expresión regular. Si abre la Página 3 y hace clic en “L” (“Show Recognized Lines”) en la Toolbar, el prerreconocimiento del número de factura en la página tendrá el aspecto de “10&0-20-A/04”. En la Página 4, el número de factura está rellenado a mano. Puede ver en los resultados del prerreconocimiento (Z.OOO-41-C/03) que tampoco coincide con el formato descrito.
Se recomienda la siguiente solución para este problema. Creamos un elemento más de tipo cadena de caracteres llamado NumAsAlphabet. Le especificamos las mismas restricciones de búsqueda que para el elemento NumAsRegularExpression. Luego agrupamos ambos elementos en un elemento de grupo InvoiceNumber. Pero el elemento NumAsAlphabet no lo describimos como una expresión regular, sino como una lista de todos los caracteres válidos.
El siguiente código debe escribirse en el campo relación avanzada de prebúsqueda:
if (NumAsRegularExpression.IsNull == FALSE) then Dontfind();
Esto significa que la búsqueda de una cadena con un formato desconocido, descrita por el elemento NumAsAlphabet, solo se intentará si el programa no logra detectarla mediante el elemento NumAsRegularExpression, que describe una cadena con un formato fijo.
Al especificar las restricciones de búsqueda para el elemento NumAsAlphabet, puede utilizar el método de arrastrar y soltar para copiar la configuración de la sección Relations del elemento NumAsRegularExpression en la misma sección del elemento actual. Como alternativa, puede escribirse el siguiente código en el campo relación avanzada de prebúsqueda:
if (NumAsRegularExpression.IsNull == FALSE) then Dontfind();
else RestrictSearchArea (NumAsRegularExpression.Rect);
Este código significa que solo se intentará buscar el elemento NumAsAlphabet si la estructura del número de factura no coincide con el formato especificado; es decir, si el programa no pudo detectar el elemento NumAsRegularExpression. Además, el elemento NumAsAlphabet se buscará en la misma área en la que no se encontró el elemento NumAsRegularExpression.
Ahora volvemos a iniciar el procedimiento de emparejamiento de FlexiLayout en todas las páginas. Como puede verse en el proyecto, el campo de número de factura ahora se encuentra correctamente en cada una de las páginas.
En el árbol del proyecto creamos un bloque de texto llamado InvoiceNum. El grupo SearchElements.InvoiceNumber se especifica como su elemento Source. En esta etapa, queda completada la creación de un FlexiLayout para detectar campos de “Número de factura”.
Si, por alguna razón, el método descrito anteriormente no es suficiente para detectar el campo de datos (tanto si se conoce su formato como si no), puede crearse en el grupo un elemento adicional (del tipo colección de objetos). En este proyecto, se trata del elemento de tipo colección de objetos llamado NumAsObjectCollection. En realidad no es necesario, dada la buena calidad de las imágenes de nuestro proyecto, y solo se muestra como ejemplo (se especifica para él el comando Disable). Puede ser necesario añadir un elemento adicional de tipo colección de objetos cuando resulte difícil predecir los resultados del prerreconocimiento en distintas páginas, pero el área de búsqueda pueda describirse con precisión, evitando que información no deseada llegue a las hipótesis.
Puede surgir la siguiente pregunta: ¿por qué se necesita una expresión regular si a veces el campo puede detectarse sin ella? La respuesta es que el uso de una expresión regular hace que la búsqueda sea más fiable. Si se encuentra este elemento, puede estar seguro de que ha encontrado exactamente la línea que necesita. Después, esta información puede utilizarse con seguridad para detectar otros elementos y sus relaciones. Cuando las restricciones de búsqueda son poco estrictas, no puede estar totalmente seguro de haber encontrado exactamente lo que necesita.
Esto puede ocurrir si la imagen tiene mucho ruido. En esos casos, el uso de un elemento de tipo cadena de caracteres con un alfabeto especificado puede dar lugar a un porcentaje excesivo de errores (el parámetro Percentage of non-alphabet characters). Como resultado, el elemento no se detectará en absoluto o solo se detectará parcialmente. En la imagen siguiente se muestra un ejemplo de esta situación.
