Vai al contenuto principale
Se crei una Skill Document Splitter, il flusso di elaborazione del documento terminerà con un’attività Splitter Script. Questo passaggio finale serve per dividere il flusso di pagine in una transaction in un insieme di documenti. A differenza di altre attività, questa attività elabora tutte le pagine in una transaction contemporaneamente.

Configurazione dell’attività

Per configurare l’attività, procedere come segue:
  1. Aggiungere i possibili tipi di documento facendo clic sull’icona del segno più nel riquadro Splitter Script Properties e creando le classi una alla volta.
  2. Fare clic su Script Editor nel riquadro Splitter Script Properties.
  3. Configurare uno script che determini come le pagine vengono assemblate in documenti. Lo script ha accesso a tutte le pagine di una transaction. Uno scenario comune consiste nell’iterare sulle pagine verificando ogni volta se una pagina avvia un nuovo documento. In caso contrario, viene aggiunta al documento precedente. Per una descrizione dettagliata degli oggetti che è possibile utilizzare nello script, vedere Object model.
  4. Fare clic su Save.

Script di esempio

In questa sezione troverai script di esempio relativi a una varietà di casi d’uso della skill Document Splitter. Tutti i seguenti esempi di script presuppongono che nella definizione del documento esista un field chiamato “ResultClassId”. Questo field deve contenere la classe del documento.

Separazione dei Documenti dello Stesso Tipo

Il file di input contiene fatture di un unico fornitore per un determinato periodo. La prima pagina di ciascuna fattura riporta il numero della fattura. La prima pagina di un documento può contenere dati specifici, ad esempio un titolo o un numero della fattura. Per stabilire che la pagina corrente sia la prima pagina di un nuovo documento, è necessario verificare se il relativo field è stato trovato sulla pagina. È inoltre possibile analizzare i valori dei field nelle pagine consecutive (ad es. numeri di pagina o numeri della fattura). Nel seguente esempio, confrontiamo i numeri della fattura trovati su due pagine consecutive e verifichiamo se il field “FirstPageMarker” è stato trovato sulla pagina corrente. Se il field è stato trovato o se il numero della fattura è diverso, la pagina corrente è considerata la prima pagina di un nuovo 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;

Separazione dei documenti e rimozione degli allegati

Il documento contiene un allegato o pagine vuote che devono essere archiviate senza estrarne alcun dato. Per determinare se il documento include un allegato o pagine vuote, è necessario verificare se ci sono pagine in cui non è possibile trovare dati rilevanti. Ad esempio, aggiungi un field che cerchi qualsiasi parola e considera vuote tutte le pagine in cui non è stata trovata alcuna parola. Nel seguente esempio, separiamo le pagine vuote da quelle non vuote in base al testo di un field.
var empty = new Document('empty'); 
var invoice = new Document('invoice'); 

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

    // Ottieni il valore testuale del field "Field" della pagina corrente 
    var currentResult = page.GetField("Field").Text; 

    // Verifica se il risultato corrente ha una lunghezza superiore a 0 
    if (currentResult.length > 0) { 
        invoice.Pages.push(page); 
    } else { 
        empty.Pages.push(page); 
    } 
}

return [invoice, empty];

Separazione dei documenti e determinazione del relativo tipo

Caso 1. Ogni tipo di documento è rappresentato da un singolo documento

Una domanda di prestito include documenti di tipologie diverse. Ogni tipologia è rappresentata da un singolo documento. Tutti i documenti vengono forniti in un unico file. Per stabilire se la pagina corrente è la prima pagina di un nuovo documento, puoi semplicemente confrontare la sua classe con quella della pagina precedente.
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;

    // Verifica se la pagina corrente ha la stessa classe della pagina precedente. In caso contrario, inizia un nuovo documento.
    if (pageResultClassId != currentResultClassId || !currentDocument)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

Caso 2. Ogni tipo di Document è rappresentato da uno o più Documenti

Una richiesta di prestito presentata da due co-richiedenti contiene un ampio insieme di documenti di tipi diversi. Ogni tipo può essere rappresentato da più documenti in sequenza. Ad esempio, una domanda può includere le immagini dei documenti d’identità di entrambi i co-richiedenti, diversi estratti conto bancari, ecc. Per stabilire che la Pagina corrente è la prima Pagina di un nuovo documento, è necessario combinare le due strategie descritte sopra. Nel seguente esempio, innanzitutto confrontiamo le classi delle due Pagine consecutive. Se la classe è cambiata, la Pagina corrente è considerata la prima Pagina di un nuovo documento. Se le Pagine appartengono alla stessa classe, verifichiamo se il field “Title” è stato trovato sulla Pagina corrente. La Pagina in cui è stato trovato questo field è considerata la prima Pagina di un nuovo 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;

    // Verifica se la pagina corrente ha la stessa classe della pagina precedente. In caso contrario, inizia un nuovo Document.
    if (pageResultClassId != currentResultClassId)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }
    // Inizia un nuovo Document se il field "title" è stato trovato nella pagina corrente.
    else if (page.GetField("Title").Text || !currentDocument)
    {
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

Riordinare le pagine e rimuovere le pagine vuote

Il documento contiene pagine disposte in un ordine errato. Ogni pagina contiene un field che indica il suo numero (ad esempio, “Pagina 1 di 10”). Per organizzare le pagine, è necessario creare un field che estragga i numeri di pagina. Inoltre, è possibile creare un field che indichi se una pagina è vuota o meno cercando la presenza di testo su quella pagina. Questo può essere usato per scartare pagine vuote o indesiderate (ad esempio, quelle risultanti dalla scansione fronte-retro di pieghe di pagina con retro vuoto), come descritto nella sezione Separare i documenti e rimuovere gli allegati. Nel seguente esempio, le pagine vengono riordinate in base ai loro numeri.
var documents = new Document('document'); 
var currentDocument = null; 
let arr = []; 

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

// Ordina l'array "arr" in base ai valori numerici di un field specifico in ogni pagina
arr.sort((page1, page2) => parseInt(page1.GetField("Field").Text) - parseInt(page2.GetField("Field").Text));

// Itera sull'array "arr" ordinato e aggiunge ogni oggetto "page" alla proprietà "Pages" del document "documents"
for (let i = 0; i < arr.length; i++) { 
    const page = arr[i]; 
    documents.Pages.push(page); 
} 

return [documents];