> ## 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 campos de una sola línea con formato conocido o desconocido en documentos con calidad de OCR variable

> Detecte campos de una sola línea, como números de factura, con calidad de OCR variable combinando elementos de cadena de caracteres con expresiones regulares y alfabetos.

Para detectar campos de una sola línea, FlexiLayout Studio dispone de un elemento especial de **cadena de caracteres**. Si el campo tiene un formato conocido, puede describirse en las propiedades del elemento correspondiente, en la pestaña cadena de caracteres, en el campo Regular expression.

Sin embargo, el uso de una expresión regular exige documentos impresos y buena calidad de imagen, porque una 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.

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

El proyecto de ejemplo `StructuredStrings.fsp` muestra cómo buscar un campo **Número de factura** de una sola línea con un formato similar en todas las páginas (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á impreso con buena calidad.
* **Página 3** – El campo **Número de factura** está impreso, 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.

| <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice1.gif?s=991be7fc79faa70ae3b774998733d0c4" alt="Captura de pantalla de la página 1 de la factura con el campo Número de factura impreso con buena calidad" width="301" height="90" data-path="images/flexi-capture/fls/invoice1.gif" />       | <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice2.gif?s=3f797e0ed40b05f977d6d11de6402b3c" alt="Captura de pantalla de la página 2 de la factura con el campo Número de factura impreso con buena calidad" width="301" height="90" data-path="images/flexi-capture/fls/invoice2.gif" /> |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice3.gif?s=4f03e46dd1dcc7d4c62db299be0f7792" alt="Captura de pantalla de la página 3 de la factura con el campo Número de factura impreso en una imagen con ruido" width="301" height="90" data-path="images/flexi-capture/fls/invoice3.gif" /> | <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/invoice4.gif?s=d93733bf66dd1a0b64726d6fb14e999d" alt="Captura de pantalla de la página 4 de la factura con el campo Número de factura rellenado a mano" width="301" height="90" data-path="images/flexi-capture/fls/invoice4.gif" />          |

<div id="describe-the-invoice-number-with-a-regular-expression">
  ## Describir el número de factura con una expresión regular
</div>

La búsqueda del campo **Número de factura** se basa en el nombre del campo. Primero, se necesita un elemento que describa las restricciones de búsqueda del nombre del campo. En el proyecto, es un elemento de **texto estático** llamado **InvoiceNumberHeader** con el valor `InvoiceN:`.

El campo **Número de factura** es un campo de una sola línea. Para detectarlo, el proyecto utiliza un elemento de **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:

```text theme={null}
NNNN"-"NN"-"[A-Z]"/"NN
```

o bien (que es lo mismo)

```text theme={null}
[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 tiene el aspecto de `10&0-20-A/04`.

En la página 4, el número de factura está rellenado a mano. El resultado del prerreconocimiento (`Z.OOO-41-C/03`) tampoco coincide con el formato descrito.

<div id="add-a-fallback-character-string-element-with-an-alphabet">
  ## Agregue un elemento de cadena de caracteres de respaldo con un alfabeto
</div>

La solución recomendada es la siguiente: cree otro elemento de **cadena de caracteres** y asígnele el nombre **NumAsAlphabet**. Especifique para él las mismas restricciones de búsqueda que para el elemento **NumAsRegularExpression**. Luego, agrupe ambos elementos en un **elemento de grupo**, **InvoiceNumber**.

Sin embargo, describa el elemento **NumAsAlphabet** no como una expresión regular, sino como una lista de todos los caracteres válidos.

<Frame>
  <img src="https://mintcdn.com/abbyy/lqYknuOmCa79141v/images/flexi-capture/fls/edit_alph2.gif?fit=max&auto=format&n=lqYknuOmCa79141v&q=85&s=87ef11061739c78b53c87d120bd500bf" alt="Captura de pantalla del cuadro de diálogo Edit Alphabet de ABBYY FlexiLayout Studio en la que se enumeran todos los caracteres válidos del elemento NumAsAlphabet." width="536" height="350" data-path="images/flexi-capture/fls/edit_alph2.gif" />
</Frame>

El siguiente código debe escribirse en el campo **relación avanzada de prebúsqueda**:

```text theme={null}
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 FlexiLayout Studio no consigue detectarla mediante el elemento **NumAsRegularExpression**, que describe una cadena de formato fijo.

<Note>
  Al especificar restricciones de búsqueda para el elemento **NumAsAlphabet**, puede usar 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 de **relación avanzada de prebúsqueda**:

  ```text theme={null}
  if (NumAsRegularExpression.IsNull == FALSE) then Dontfind();
  else RestrictSearchArea (NumAsRegularExpression.Rect);
  ```
</Note>

Este código significa que la búsqueda del elemento **NumAsAlphabet** solo se intentará si la estructura del número de factura no coincide con el formato especificado; es decir, si FlexiLayout Studio no consigue detectar el elemento **NumAsRegularExpression**. En ese caso, el elemento **NumAsAlphabet** se buscará en la misma área en la que no se encontró el elemento **NumAsRegularExpression**.

Ahora ejecute de nuevo el procedimiento de emparejamiento de FlexiLayout en todas las páginas. Como muestra el proyecto, el campo **Número de factura** ahora se encuentra correctamente en cada una de las páginas.

El árbol del proyecto contiene un bloque de texto denominado **InvoiceNum**. El grupo `SearchElements.InvoiceNumber` se especifica como su **Source element**. En esta fase, el FlexiLayout para detectar campos de **Número de factura** está completo.

<Note>
  Si, por alguna razón, el método descrito anteriormente no es suficiente para detectar el campo de datos (tanto si su formato es conocido como si no), se puede crear un elemento más (del tipo **colección de objetos**) en el grupo. En este proyecto, es un elemento de **colección de objetos** denominado **NumAsObjectCollection**.

  En realidad, no es necesario dada la buena calidad de las imágenes de este proyecto y solo se muestra como ejemplo (para él se especifica el comando **Disable**).

  Puede ser necesario un elemento adicional de **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 entre en las hipótesis.
</Note>

<div id="why-the-regular-expression-improves-reliability">
  ## Por qué la expresión regular mejora la fiabilidad
</div>

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

<Frame>
  <img src="https://mintcdn.com/abbyy/r-nfa7jujx5b9gKX/images/flexi-capture/fls/structure_string.png?fit=max&auto=format&n=r-nfa7jujx5b9gKX&q=85&s=4fc65d41b01bf73bde4d47aae9e14f61" alt="Captura de pantalla en ABBYY FlexiLayout Studio de una imagen con mucho ruido en la que un elemento de cadena de caracteres con un alfabeto especificado detecta el campo de número de factura solo parcialmente debido al porcentaje excesivo de caracteres no pertenecientes al alfabeto." width="566" height="440" data-path="images/flexi-capture/fls/structure_string.png" />
</Frame>
