> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Búsqueda de fechas después de un reconocimiento de alta o baja calidad

> Localice fechas en imágenes de baja calidad combinando los elementos fecha, cadena de caracteres y colección de objetos en el ejemplo de FlexiLayout SearchOfDate.fsp.

En esta sección se describen varias formas habituales de crear FlexiLayouts que encuentren campos de fecha en imágenes de baja calidad. Estas imágenes son bastante comunes y presentan diversos defectos de escaneo, causados principalmente por una configuración de escaneo 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.

<div id="when-the-date-element-cannot-detect-a-date">
  ## Cuando el elemento fecha no puede detectar una fecha
</div>

FlexiLayout Studio ofrece un elemento especial **fecha** 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 **fecha**.

Por ejemplo, FlexiLayout Studio permite usar los siguientes idiomas para especificar el mes en el campo de fecha: English, Czech, Danish, Dutch, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Norwegian, Polish, Portuguese, Russian, Spanish, Swedish, Turkish.

Si el mes está escrito con palabras en un idioma distinto de los enumerados, la fecha no coincide con ninguno de los formatos disponibles, por lo que no puede detectarse mediante un elemento **fecha**.

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).

Las motas en el área de búsqueda o el hecho de que la fecha no esté mecanografiada, sino escrita a mano, también pueden hacer que el elemento **fecha** no pueda utilizarse para buscar fechas.

<div id="the-searchofdatefsp-sample-project">
  ## El proyecto de ejemplo SearchOfDate.fsp
</div>

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`).

El proyecto contiene cinco páginas:

| Página   | Descripción                                                           |
| :------- | :-------------------------------------------------------------------- |
| Página 1 | El formato de fecha puede describirse mediante el elemento **fecha**. |
| 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.                                         |

El objetivo es encontrar la fecha en todas las imágenes, incluidas aquellas en las que el formato de fecha no es compatible con el elemento **fecha**.

<div id="search-for-supported-date-formats-with-the-date-element">
  ## Buscar formatos de fecha compatibles con el elemento fecha
</div>

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 el proyecto de ejemplo, se trata de un elemento de tipo **texto estático** llamado **DateHeader** con el único valor **Date:**.

<Note>
  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.
</Note>

El grupo también contiene un elemento **fecha** llamado **DateField**. Este elemento busca campos de fecha cuyo formato sea compatible con el elemento **fecha**.

Como puede verse en el proyecto, el elemento **fecha** solo puede detectar la fecha en la primera página.

<div id="search-for-other-date-formats-with-a-character-string-element">
  ## Buscar otros formatos de fecha con un elemento de cadena de caracteres
</div>

Para buscar fechas en las demás páginas, el proyecto utiliza un elemento de **cadena de caracteres** llamado **DateAsString**. Este elemento usa un alfabeto para representar todos los caracteres que probablemente aparezcan en las imágenes.

<Note>
  Si el contenido de un campo de datos puede estructurarse y tiene un formato que el elemento **fecha** no admite, es aconsejable describir ese formato con una expresión regular en lugar de especificar un alfabeto.

  No obstante, 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, en cambio, 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 se puede garantizar 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 y año) y buscar el campo del mes por separado mediante un elemento de tipo **texto estático**.

  Dicho elemento de texto estático debe describir todas las variaciones posibles del mes (por ejemplo, los nombres completos y abreviados del mes en el idioma correspondiente). Los campos de día y año pueden encontrarse entonces a la derecha y a la izquierda del mes mediante elementos de **cadena de caracteres**.
</Note>

<Frame>
  <img src="https://mintcdn.com/abbyy/lqYknuOmCa79141v/images/flexi-capture/fls/edit_alph.gif?fit=max&auto=format&n=lqYknuOmCa79141v&q=85&s=6a285e2e59f7f19a0125c3e150e88979" alt="Captura de pantalla del editor de alfabeto en ABBYY FlexiLayout Studio utilizado para especificar los caracteres permitidos para el elemento de cadena de caracteres DateAsString." width="536" height="350" data-path="images/flexi-capture/fls/edit_alph.gif" />
</Frame>

Para optimizar el emparejamiento de FlexiLayout, se proporciona la siguiente condición en el campo de relación avanzada de prebúsqueda para el elemento **DateAsString**:

```text theme={null}
if (DateField.IsNull == FALSE) then Dontfind();
```

que es lo mismo que:

```text theme={null}
if not DateField.IsNull then Dontfind();
```

Esta condición significa que la búsqueda de la fecha como una cadena de caracteres solo se inicia si la fecha no puede detectarse mediante un elemento **fecha**.

Como se muestra en el proyecto, el elemento **DateAsString** encuentra la fecha en las páginas restantes del proyecto, donde el elemento **fecha** no pudo detectarla.

<div id="capture-partially-recognized-dates-with-an-object-collection-element">
  ## Capturar fechas parcialmente reconocidas con un elemento de colección de objetos
</div>

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.

<Frame>
  <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/prop_search_elements.gif?fit=max&auto=format&n=r-nfa7jujx5b9gKX&q=85&s=824530b896543e43de095ddbc6a7fe18" alt="Captura de pantalla de los objetos sin procesar del prerreconocimiento en ABBYY FlexiLayout Studio que muestra que el área de búsqueda del campo de fecha contiene objetos de texto, imagen y signo de puntuación." width="431" height="455" data-path="images/flexi-capture/fls/prop_search_elements.gif" />
</Frame>

Para encontrar todos los objetos asociados con el campo de fecha, el proyecto usa un elemento de **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 **relación avanzada de prebúsqueda** para los elementos **DateAsObjectCollection** y **DateAsString**:

```text theme={null}
if (DateField.IsNull == FALSE) then Dontfind();
```

<Note>
  La condición `if (DateAsString.IsNull == FALSE) then Dontfind()` no puede añadirse a las Propiedades avanzadas del elemento **DateAsObjectCollection** porque, como muestra el ejemplo, la cadena detectada puede contener solo una parte de la fecha.
</Note>

<div id="define-the-date-block-region-from-alternativedategroup">
  ## Definir la región del bloque fecha a partir de AlternativeDateGroup
</div>

En este punto, el conjunto de elementos que describen las restricciones de búsqueda de los campos de fecha está completo. El elemento de grupo `SearchElements.DateGroup.AlternativeDateGroup`, que consta de los elementos **DateField**, **DateAsString** y **DateAsObjectCollection**, se especifica en el árbol del proyecto como Source element para el bloque **fecha**.

Como 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 **fecha**, bien con la combinación de las regiones de los elementos **DateAsObjectCollection** y **DateAsString**.

En este último caso, se espera 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**.

<Note>
  En este caso, puede especificar el elemento de grupo `SearchElements.DateGroup.AlternativeDateGroup` como Source element 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 subelementos. Por lo tanto, la región del elemento de grupo `SearchElements.DateGroup.AlternativeDateGroup` coincidirá con la región del subelemento. En el ejemplo dado, el método `Dontfind()` no solo ayuda a optimizar el emparejamiento de FlexiLayout, sino que también simplifica la descripción de los bloques.
</Note>

Como alternativa, puede usar el siguiente código en la sección **Expression**.

```text theme={null}
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, puede comprobar si la región del elemento **DateAsString** realmente forma parte de la región de **DateAsObjectCollection**.

<Frame>
  <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/search_date.png?fit=max&auto=format&n=r-nfa7jujx5b9gKX&q=85&s=49c5578cea473c4c03cec2281be1f73f" alt="Captura de pantalla de la sección Expression en ABBYY FlexiLayout Studio que muestra el código de FlexiLayout language que define la región de salida del bloque fecha a partir de los elementos AlternativeDateGroup en el proyecto SearchOfDate.fsp." width="532" height="498" data-path="images/flexi-capture/fls/search_date.png" />
</Frame>

<Note>
  Usar un elemento de **cadena de caracteres** para buscar un campo de fecha, sin definir el formato de la cadena ni usar un elemento de **colección de objetos**, como en el ejemplo proporcionado, puede dar buenos resultados si el área de búsqueda del campo de fecha puede definirse claramente.

  Sin embargo, 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 restringido. De lo contrario, la hipótesis final puede no ser satisfactoria.

  Con un elemento de **cadena de caracteres**, 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 **colección de objetos**, la hipótesis incluirá todos los objetos de la imagen que se encuentren dentro del área de búsqueda y cumplan las restricciones sobre el tamaño del objeto.
</Note>
