Saltar al contenido principal
En este capítulo se describen varias formas habituales de crear FlexiLayouts que busquen campos de fecha en imágenes de baja calidad. Estas imágenes son bastante comunes y presentan distintos defectos de escaneo, causados principalmente por una configuración incorrecta. Por ejemplo, la imagen puede verse demasiado clara o demasiado oscura si los ajustes de brillo no son correctos. Como resultado, puede perderse parte de la información de la imagen o algunas zonas pueden contener ruido. FlexiLayout Studio ofrece un elemento especial Date que se utiliza para detectar fechas. Sin embargo, al crear un FlexiLayout, puede que este elemento no sea suficiente. Esto puede ocurrir cuando la fecha de los documentos no coincide con ninguno de los formatos disponibles en el elemento Date. Por ejemplo, FlexiLayout Studio permite usar los siguientes idiomas: English, Czech, Danish, Dutch, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Norwegian, Polish, Portuguese, Russian, Spanish, Swedish y Turkish para especificar el mes en el campo de fecha. Por lo tanto, si el mes está escrito con palabras en cualquier idioma distinto de los especificados, la fecha no corresponderá a ninguno de los formatos disponibles y, por consiguiente, no podrá detectarse mediante un elemento Date. También pueden producirse errores en la búsqueda de fechas si la imagen contiene elementos que no pueden eliminarse. Por ejemplo, la fecha puede estar subrayada y no haber un espacio visible entre la fecha y el subrayado, puede estar tachada o escrita en celdas de caracteres con separadores negros (marcos, peines). La imposibilidad de usar el elemento Date para buscar fechas también puede deberse a motas en el área de búsqueda o al hecho de que la fecha no esté mecanografiada, sino escrita a mano. La mejor manera de organizar la búsqueda de un campo de fecha se describe en el proyecto de ejemplo SearchOfDate.fsp (carpeta %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Date). Hay 5 páginas en el proyecto:
  • Página 1 - el formato de fecha puede describirse mediante el elemento Date;
  • Página 2 - el mes de la fecha está escrito en francés;
  • Página 3 - la fecha está subrayada;
  • Página 4 - el campo de fecha contiene ruido;
  • Página 5 - la fecha está escrita a mano.
Intentemos encontrar la fecha en todas las imágenes, incluidas aquellas en las que el formato de fecha no es compatible con el elemento de tipo Date. Todos los elementos que describen el campo de fecha se agrupan en un elemento DateGroup. En primer lugar, este grupo contiene un elemento que busca el nombre del campo de fecha. En nuestro proyecto, se trata de un elemento de tipo texto estático llamado DateHeader con el único valor ‘Date:’.
Configurar las restricciones de búsqueda para todos los elementos en la sección Relations no es difícil y, por lo tanto, no se describe aquí. Puede consultarlo directamente en el proyecto.
A continuación, creamos un elemento de tipo Date llamado DateField. Este elemento buscará campos de fecha cuyo formato sea compatible con el elemento Date. Como puede verse en el proyecto, el elemento Date solo puede detectar la fecha en la primera página. Para buscar fechas en las demás páginas, se crea un elemento de tipo cadena de caracteres. En nuestro proyecto, este elemento se llama DateAsString. Todos los caracteres que probablemente aparezcan en las imágenes se representan en este elemento mediante un alfabeto.
Si el contenido de un campo de datos puede estructurarse y tiene un formato que no es compatible con el elemento Date, es aconsejable que, en lugar de especificar un alfabeto, describa ese formato mediante una expresión regular. Sin embargo, debe asegurarse de que las imágenes procesadas sean de alta calidad, ya que una expresión regular presupone una coincidencia del 100 % entre el campo y la estructura descrita (los alfabetos, por otro lado, permiten un cierto porcentaje de errores, que se especifica en las propiedades del elemento). Por lo tanto, los alfabetos son una herramienta más flexible en los casos en que no puede garantizarse la exactitud del reconocimiento. Si sabe que el mes de la fecha se escribirá como una palabra en el mismo idioma que el idioma de prerreconocimiento, puede ser aconsejable dividir el campo de fecha en tres secciones (día, mes, año) y buscar el campo del mes por separado mediante un elemento de tipo texto estático. Dicho elemento de tipo texto estático debe describir todas las posibles variantes del mes (por ejemplo, los nombres completos y abreviados del mes en el idioma correspondiente). Los campos de día y año se buscarán entonces a la derecha y a la izquierda del mes mediante elementos de tipo cadena de caracteres.
Para optimizar el emparejamiento de FlexiLayout, se usa la siguiente condición en el campo Advanced pre-search relations para el elemento DateAsString: if (DateField.IsNull == FALSE) then Dontfind(); que equivale a: if not DateField.IsNull then Dontfind(); Esta condición significa que la búsqueda de la fecha como una cadena de caracteres solo se iniciará si la fecha no puede detectarse mediante un elemento Date. Como puede verse en el proyecto, el elemento DateAsString encuentra la fecha en el resto de las páginas del proyecto, donde el elemento de tipo Date no pudo detectarla. Sin embargo, en la página 4, la cadena detectada contiene solo una parte del campo de fecha. Si consulta los resultados del prerreconocimiento del campo de fecha (haciendo clic en Show Raw Objects en la Toolbar), el motivo de la detección parcial queda claro: el área de búsqueda contiene no solo objetos de texto, sino también otros tipos de objetos: Imagen y signo de puntuación. Esta situación es típica en imágenes de baja calidad: los objetos de texto no siempre se reconocen durante el prerreconocimiento. Para encontrar todos los objetos asociados con el campo de fecha, se crea un elemento de tipo colección de objetos llamado DateAsObjectCollection. En las propiedades del elemento se especifican todos los tipos de objeto detectados en el campo de fecha durante el prerreconocimiento. Para optimizar el emparejamiento de FlexiLayout, se usa la siguiente condición en el campo Advanced pre-search relations para los elementos DateAsObjectCollection y DateAsString:
if (DateField.IsNull == FALSE) then Dontfind();
La condición if (DateAsString.IsNull == FALSE) then Dontfind() no puede añadirse a las Propiedades avanzadas del elemento DateAsObjectCollection, porque, como se ve claramente en el ejemplo, puede haber situaciones en las que la cadena detectada contenga solo una parte de la fecha.
En esta etapa, la creación de los elementos que describen las restricciones de búsqueda para los campos de fecha puede considerarse terminada. El elemento de grupo SearchElements.DateGroup.AlternativeDateGroup, que consta de los elementos DateField, DateAsString y DateAsObjectCollection, se especifica en el árbol del proyecto como elemento Source para el bloque Date. Dado que se utilizó el método Dontfind() para describir las propiedades de los elementos DateAsString y DateAsObjectCollection, la región real del bloque detectado coincidirá bien con la región encontrada por la hipótesis para el elemento Date, o bien con la combinación de las regiones de los elementos DateAsObjectCollection y DateAsString. En este último caso, esperamos que la región del elemento DateAsString forme parte de la región del elemento DateAsObjectCollection, por lo que la región resultante será la del elemento DateAsObjectCollection.
En este caso, podemos especificar el elemento de grupo SearchElements.DateGroup.AlternativeDateGroup como elemento Source porque la situación es relativamente simple. La región del grupo es una combinación de las regiones de sus subelementos detectados. El método Dontfind() permite omitir la búsqueda de algunos de los subelementos. Así, la región del elemento de grupo SearchElements.DateGroup.AlternativeDateGroup coincidirá con la región del subelemento. En este ejemplo, el método Dontfind() no solo ayuda a optimizar el emparejamiento de FlexiLayout, sino que también simplifica la descripción de los bloques.
Como alternativa, podríamos usar el código especificado en la sección Expression. Rect OutputRect; let dateGroup = SearchElements.DateGroup.AlternativeDateGroup; if (dateGroup.DateField.IsNull == FALSE) then outputRect = dateGroup.DateField.Rect; else outputRect = dateGroup.DateAsObjectCollection.Rect; OutputRegion = outputRect; El uso de una Expression ofrece opciones adicionales. Por ejemplo, podríamos comprobar si la región del elemento DateAsString forma realmente parte de la región de DateAsObjectCollection.
El uso de un elemento cadena de caracteres para buscar un campo de fecha, sin definir el formato de la cadena ni usar un elemento de tipo colección de objetos, como en el ejemplo mostrado, puede dar buenos resultados si el área de búsqueda del campo de fecha puede definirse claramente. Pero si hay varias cadenas de caracteres en el área de búsqueda, el formato de la cadena debe describirse mediante una expresión regular o un alfabeto más limitado. De lo contrario, la hipótesis final puede no ser satisfactoria. Al usar el elemento de tipo cadena de caracteres, el usuario puede limitar el número de caracteres de una cadena, el número de finales de palabra y la longitud de los espacios para descartar hipótesis incorrectas. Si se usa un elemento de tipo colección de objetos, la hipótesis incluirá todos los objetos de la imagen situados dentro del área de búsqueda y que cumplan las restricciones de tamaño de los objetos.