- En el elemento InvoiceHeader, cree un elemento de tipo cadena de caracteres y asígnele el nombre InvoiceNumber. Nota. El nombre del elemento no tiene por qué coincidir con el nombre del bloque correspondiente al campo InvoiceNumber. Sin embargo, usar nombres idénticos resulta conveniente al trabajar con un FlexiLayout.
- Haga clic en la pestaña cadena de caracteres.
- Especifique el alfabeto: -./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
- Establezca Percentage of non-alphabet characters en 30%.
- En el campo recuento de caracteres, especifique el intervalo difuso {-1, 3, 20, INF} para la longitud de la cadena de caracteres, suponiendo que los posibles valores estén en el rango de 3 a 20 caracteres. Cualquier hipótesis que quede fuera de este intervalo se penalizará.
- En algunas imágenes, el área de búsqueda del campo Número de factura contiene el elemento kwInvoiceDate ya detectado. Excluya este elemento del área de búsqueda para que el programa no incluya este texto en sus hipótesis para el campo Número de factura:
- En la pestaña Search Constraints, haga clic en el botón Add… situado junto al campo Exclude regions of elements.
- Seleccione kwInvoiceDate de la lista de elementos.
- Haga clic en OK. La cadena SearchElements.InvoiceHeader.kwInvoiceDate aparecerá en el campo Exclude regions of elements.

- Haga clic en la pestaña Advanced.
- En Relaciones avanzadas de prebúsqueda, especifique condiciones adicionales: si no se encuentra el nombre kwInvoiceNumber, no busque el campo InvoiceNumber; de lo contrario, especifique el área de búsqueda como un array de rectángulos: un rectángulo a la derecha del nombre y otro rectángulo debajo del nombre con un pequeño desplazamiento. En FlexiLayout language, esta condición puede escribirse de la siguiente manera: if kwInvoiceNumber.IsNull then Dontfind(); else { WholeWordMOde: true; MaxGapInLine: 30dt; RectArray DataRegion; Let r1= Rect (kwInvoiceNumber.Rect.Right, kwInvoiceNumber.Rect.Top -20dt, kwInvoiceNumber.Rect.Right + 650dt, kwInvoiceNumber.Rect.Bottom + 50dt); // Limita el área de búsqueda a un rectángulo situado a la derecha del nombre del campo InvoiceNumber. Let r2 = Rect (kwInvoiceNumber.Rect.Left - 100dt, kwInvoiceNumber.Rect.Bottom, kwInvoiceNumber.Rect.Right + 100dt, kwInvoiceNumber.Rect.Bottom + 100dt); // Limita el área de búsqueda a un rectángulo situado debajo del nombre del campo InvoiceNumber. DataRegion = RectArray (r1); DataRegion.Add (r2); RestrictSearchArea (DataRegion); }
- El área de búsqueda del campo se limita a dos rectángulos: uno a la derecha del nombre del campo y otro debajo de este. Si los datos del campo están ubicados a la derecha del nombre del campo, a menudo hay otro texto debajo del campo (en las imágenes de prueba, lo más habitual es el nombre y los datos del campo fecha). Como este texto adicional se incluirá en el área de búsqueda del campo Número de factura, el programa generará una hipótesis para ese texto. Para influir en la calidad de esta hipótesis, especifique comprobaciones adicionales en el campo Relaciones avanzadas de posbúsqueda: cuanto más abajo esté el texto situado debajo del nombre del campo, mayor será la penalización. En FlexiLayout language, esta condición puede escribirse de la siguiente manera: if not IsNull then { FuzzyQuality: Top - kwInvoiceNumber.Rect.Top, {-30000,0,0,10000}*dt; } // Cuanto mayor sea la distancia entre el nombre y el límite superior del campo, mayor será la penalización de la hipótesis correspondiente. En este caso concreto, la hipótesis del elemento cuyo límite superior coincide con el límite superior del nombre tendrá la mayor calidad.
- Excluya temporalmente el elemento InvoiceFooter y ejecute Match en el FlexiLayout.
- Especifique la ubicación del bloque InvoiceNumber como una región rectangular del elemento InvoiceNumber, ampliada 5 dots en vertical y en horizontal. Para ello, seleccione Expression y escriba la siguiente expresión: Rect outputRect; outputRect = InvoiceHeader.InvoiceNumber.Rect; IsNull = InvoiceHeader.InvoiceNumber.IsNull; // Considera detectada la región del bloque si se ha detectado el elemento InvoiceNumber. OutputRegion = outputRect; OutputRegion.Inflate (5dt, 5dt);
