Saltar al contenido principal
Si crea una Habilidad de Separación de Documentos, el flujo de procesamiento del documento finalizará con una actividad de Script de Separación. Este paso final sirve para dividir el flujo de páginas en una transacción en un conjunto de documentos. A diferencia de otras actividades, esta actividad procesa todas las páginas de una transacción a la vez.

Configuración de la actividad

Para configurar la actividad, haga lo siguiente:
  1. Agregue los posibles tipos de documentos haciendo clic en el ícono de suma en el panel Splitter Script Properties y creando las clases una por una.
  2. Haga clic en Script Editor en el panel Splitter Script Properties.
  3. Configure un script que determine cómo se ensamblan las páginas en documentos. El script tiene acceso a todas las páginas de una transacción. Un escenario común es iterar por las páginas y comprobar cada vez si una página inicia un nuevo documento. Si no es así, se agrega al documento anterior. Para una descripción detallada de los objetos que pueden usarse en su script, consulte Object model.
  4. Haga clic en Guardar.

Scripts de ejemplo

En esta sección encontrará scripts de ejemplo que corresponden a diversos casos de uso de la skill Document Splitter. Todos los siguientes ejemplos de script suponen que existe un campo llamado “ResultClassId” en la definición del documento. Este campo debe contener la clase del documento.

Separación de documentos del mismo tipo

El archivo de entrada contiene facturas de un proveedor para un período determinado. La primera página de cada factura incluye el número de factura. La primera página de un documento puede contener datos específicos, por ejemplo, un título o un número de factura. Para determinar que la página actual es la primera página de un nuevo documento, debe verificar si se encontró el campo correspondiente en la página. También puede analizar los valores de los campos en las páginas consecutivas (por ejemplo, números de página o números de factura). En el siguiente ejemplo, comparamos los números de factura encontrados en dos páginas consecutivas y comprobamos si se encontró el campo “FirstPageMarker” en la página actual. Si se encontró el campo o si el número de factura difiere, se considera que la página actual es la primera página de un nuevo documento.
var documents = [];
var currentDocument = null;
var currentInvoiceNumber = "";

for (let i = 0; i < Context.Pages.length; i++)
{
    const page = Context.Pages[i];
    let invoiceNumberField = page.GetField("InvoiceNumber");
    let invoiceNumberNormalized = invoiceNumberField.Text.replace(/[. -]/g, '');
    let firstPageMarker = page.GetField("FirstPageMarker");
    var hasInvoiceNumber = invoiceNumberField !== null &&  invoiceNumberNormalized !== "";
    var hasNewInvoiceNumber = hasInvoiceNumber && invoiceNumberNormalized !== currentInvoiceNumber;
    var hasFirstPageMarker = firstPageMarker !== null && firstPageMarker.Text;

    if (!currentDocument || hasNewInvoiceNumber || (!hasInvoiceNumber && hasFirstPageMarker))
    { 
        currentDocument = new Document('invoice');
        documents.push(currentDocument);
    }

    if (hasInvoiceNumber)
    {
        currentInvoiceNumber =  invoiceNumberNormalized;
    }
 
    currentDocument.Pages.push(page);
}

return documents;

Separación de documentos y eliminación de anexos

El documento contiene un anexo o páginas vacías que deben almacenarse sin extraer ningún dato de ellas. Para determinar si el documento tiene un anexo o páginas vacías, debe verificar si hay páginas en las que no se encuentre ningún dato relevante. Por ejemplo, agregue un campo que busque cualquier palabra y considere en blanco todas las páginas donde no se hayan encontrado palabras. En el siguiente ejemplo, separamos las páginas vacías de las que no lo están en función del texto de un campo.
var empty = new Document('empty'); 
var invoice = new Document('invoice'); 

for (let i = 0; i < Context.Pages.length; i++) { 
    const page = Context.Pages[i]; 

    // Obtener el valor de texto de la propiedad "Field" de la página actual 
    var currentResult = page.GetField("Field").Text; 

    // Comprobar si el resultado actual tiene una longitud mayor que 0 
    if (currentResult.length > 0) { 
        invoice.Pages.push(page); 
    } else { 
        empty.Pages.push(page); 
    } 
}

return [invoice, empty];

Separación de Documentos y determinación del tipo

Caso 1. Cada tipo de Document está representado por un único documento

Una solicitud de préstamo contiene documentos de distintos tipos. Cada tipo está representado por un único documento. Todos los documentos se entregan en un solo archivo. Para determinar que la Página actual es la primera Página de un nuevo documento, simplemente compare su clase con la clase de la Página anterior.
var documents = [];
var currentResultClassId = null;
var currentDocument = null;

for (let i = 0; i < Context.Pages.length; i++)
{
    const page = Context.Pages[i];
    const pageResultClassId = page.GetField('ResultClassId').Text;

    // Comprobar si la página actual tiene la misma clase que la página anterior. De lo contrario, iniciar un nuevo documento.
    if (pageResultClassId != currentResultClassId || !currentDocument)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

Caso 2. Cada tipo de Document está representado por uno o varios Documentos

Una solicitud de préstamo presentada por dos co-solicitantes contiene una amplia variedad de documentos de distintos tipos. Cada tipo puede estar representado por varios documentos en secuencia. Por ejemplo, una solicitud puede incluir imágenes de las identificaciones de ambos co-solicitantes, varios estados de cuenta bancarios, etc. Para determinar que la página actual es la primera página de un nuevo documento, debe combinar las dos estrategias descritas anteriormente. En el siguiente ejemplo, primero comparamos las clases de dos páginas consecutivas. Si la clase ha cambiado, se considera que la página actual es la primera página de un nuevo documento. Si las páginas pertenecen a la misma clase, comprobamos si se encontró el campo “title” en la página actual. La página en la que se encontró este campo se considera la primera página de un nuevo documento.
var documents = [];
var currentResultClassId = null;
var currentDocument = null;

for (let i = 0; i < Context.Pages.length; i++)
{
    const page = Context.Pages[i];
    const pageResultClassId = page.GetField('ResultClassId').Text;

    // Comprobar si la página actual tiene la misma clase que la página anterior. Si no es así, iniciar un nuevo documento.
    if (pageResultClassId != currentResultClassId)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }
    // Iniciar un nuevo documento si se encontró el campo "Title" en la página actual.
    else if (page.GetField("Title").Text || !currentDocument)
    {
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

Reordenar páginas y eliminar páginas en blanco

El documento contiene páginas en un orden incorrecto. Cada página incluye un campo que indica su número (por ejemplo, «Página 1 de 10»). Para organizar las páginas, debe crear un campo que extraiga los números de página. Además, puede crear un campo que indique si una página está en blanco o no buscando cualquier texto en esa página. Esto puede usarse para descartar páginas en blanco o irrelevantes (p. ej., las que resultan del escaneo dúplex de pliegues de página con reversos vacíos), como se describe en la sección Separating documents and removing annexes. En el siguiente ejemplo, reordenamos las páginas según sus números.
var documents = new Document('document'); 
var currentDocument = null; 
let arr = []; 

for (let i = 0; i < Context.Pages.length; i++) { 
    arr[i] = Context.Pages[i]; 
} 

// Ordenar el array "arr" según los valores numéricos de un campo específico en cada página
arr.sort((page1, page2) => parseInt(page1.GetField("Field").Text) - parseInt(page2.GetField("Field").Text));

// Iterar sobre el array ordenado "arr" y anexar cada objeto "page" a la propiedad "Pages" del documento "documents"
for (let i = 0; i < arr.length; i++) { 
    const page = arr[i]; 
    documents.Pages.push(page); 
} 

return [documents];