Pular para o conteúdo principal
Se você criar uma Skill de Divisão de Documentos (Document Splitter), o fluxo de processamento do documento terminará com uma atividade de Script de Divisão. Essa etapa final serve para dividir o fluxo de páginas em uma transação em um conjunto de documentos. Diferentemente de outras atividades, esta atividade processa todas as páginas de uma transação de uma só vez.

Configurando a Atividade

Para configurar a atividade, siga estes passos:
  1. Adicione os possíveis tipos de documento clicando no ícone de adição no painel Splitter Script Properties e criando as classes uma a uma.
  2. Clique em Script Editor no painel Splitter Script Properties.
  3. Configure um script que determinará como as páginas serão agrupadas em documentos. O script tem acesso a todas as páginas de uma transação. Um cenário comum é iterar pelas páginas, verificando a cada vez se uma página inicia um novo documento. Caso não inicie, ela é adicionada ao documento anterior. Para uma descrição detalhada dos objetos que podem ser usados no seu script, consulte Object model.
  4. Clique em Save.

Scripts de exemplo

Nesta seção, você encontrará scripts de exemplo que correspondem a uma variedade de casos de uso da skill Document Splitter. Todos os exemplos de script a seguir pressupõem que exista um Field chamado “ResultClassId” na definição do documento. Esse Field deve conter a classe do documento.

Separando documentos do mesmo tipo

O arquivo de entrada contém faturas de um fornecedor relativas a um determinado período. A primeira página de cada fatura contém o número da fatura. A primeira página de um documento pode conter dados específicos, por exemplo, um título ou um número de fatura. Para determinar que a página atual é a primeira página de um novo documento, você precisa verificar se o campo correspondente foi encontrado na página. Você também pode analisar os valores dos campos nas páginas consecutivas (por exemplo, números de página ou números de fatura). No exemplo a seguir, comparamos os números de fatura encontrados em duas páginas consecutivas e verificamos se o campo “FirstPageMarker” foi encontrado na página atual. Se o campo foi encontrado ou se o número da fatura for diferente, a página atual é considerada a primeira página de um novo 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;

Separando Documentos e Removendo Anexos

O documento contém um anexo ou páginas em branco que devem ser armazenados sem extrair nenhum dado delas. Para determinar se o documento tem um anexo ou páginas em branco, é necessário verificar se há páginas nas quais não se encontra nenhum dado relevante. Por exemplo, adicione um campo que procure por qualquer palavra e considere em branco todas as páginas onde nenhuma palavra foi encontrada. No exemplo a seguir, separamos as páginas em branco das não em branco com base no texto de um 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]; 

    // Obter o valor de texto da propriedade "Field" da página atual 
    var currentResult = page.GetField("Field").Text; 

    // Verificar se o resultado atual possui comprimento maior que 0
    if (currentResult.length > 0) { 
        invoice.Pages.push(page); 
    } else { 
        empty.Pages.push(page); 
    } 
}

return [invoice, empty];

Separação de documentos e determinação do tipo

Caso 1. Cada tipo de Document é representado por um único Document

Uma solicitação de empréstimo contém documentos de tipos diferentes. Cada tipo é representado por um único documento. Todos os documentos são entregues em um único arquivo. Para determinar se a página atual é a primeira página de um novo documento, você pode simplesmente comparar sua classe com a classe da 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;

    // Verifica se a página atual tem a mesma classe que a página anterior. Caso contrário, inicia um novo 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 documento é representado por um ou vários documentos

Uma solicitação de empréstimo apresentada por dois co-proponentes contém uma grande variedade de documentos de diferentes tipos. Cada tipo pode ser representado por vários documentos em sequência. Por exemplo, uma solicitação pode conter imagens dos documentos de identidade de ambos os co-proponentes, vários extratos bancários, etc. Para determinar que a página atual é a primeira página de um novo documento, é necessário combinar as duas estratégias descritas acima. No exemplo a seguir, primeiro comparamos as classes das duas páginas consecutivas. Se a classe tiver mudado, a página atual é considerada a primeira página de um novo documento. Se as páginas pertencerem à mesma classe, verificamos se o campo “title” foi encontrado na página atual. A página na qual esse campo foi encontrado é considerada a primeira página de um novo 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 a página atual tem a mesma classe da página anterior. Caso contrário, inicia um novo documento.
    if (pageResultClassId != currentResultClassId)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }
    // Inicia um novo documento se o campo "Title" for encontrado na página atual.
    else if (page.GetField("Title").Text || !currentDocument)
    {
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

Reordenando páginas e removendo páginas vazias

O documento contém páginas em ordem incorreta. Cada página inclui um campo indicando seu número (por exemplo, “Página 1 de 10”). Para organizar as páginas, é preciso criar um campo que extraia os números das páginas. Além disso, você pode criar um campo que indique se uma página está em branco ou não, verificando a presença de qualquer texto nessa página. Isso pode ser usado para descartar páginas em branco ou descartáveis (por exemplo, aquelas resultantes da digitalização frente e verso de dobras de página com o verso vazio), conforme descrito na seção Separating documents and removing annexes. No exemplo a seguir, as páginas são reordenadas de acordo com seus 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]; 
} 

// Ordena o array "arr" com base nos valores numéricos de um campo específico em cada página
arr.sort((page1, page2) => parseInt(page1.GetField("Field").Text) - parseInt(page2.GetField("Field").Text));

// Itera sobre o array "arr" ordenado e adiciona cada objeto "page" à propriedade "Pages" do documento "documents"
for (let i = 0; i < arr.length; i++) { 
    const page = arr[i]; 
    documents.Pages.push(page); 
} 

return [documents];