Passer au contenu principal
Si vous créez une Skill de séparation de Document, le flux de traitement du document se terminera par une activité Script de séparation. Cette étape finale sert à scinder le flux de pages d’une transaction en un ensemble de documents. Contrairement aux autres activités, cette activité traite toutes les pages d’une transaction en une seule fois.

Configuration de l’activité

Pour configurer l’activité, procédez comme suit :
  1. Ajoutez les types de documents possibles en cliquant sur l’icône « plus » dans le volet Splitter Script Properties, puis créez les classes une par une.
  2. Cliquez sur Script Editor dans le volet Splitter Script Properties.
  3. Créez un script qui détermine comment les pages sont assemblées en documents. Le script a accès à toutes les pages d’une transaction. Le scénario le plus courant consiste à parcourir les pages et, à chaque fois, vérifier si une page commence un nouveau document. Sinon, elle est ajoutée au document précédent. Pour une description détaillée des objets utilisables dans votre script, consultez Object model.
  4. Cliquez sur Save.

Scripts d’exemple

Dans cette section, vous trouverez des scripts d’exemple correspondant à divers cas d’utilisation de la compétence Document Splitter. Tous les exemples de script ci-dessous partent du principe qu’un champ nommé « ResultClassId » existe dans la définition du document. Ce champ doit contenir la classe du document.

Séparer des documents du même type

Le fichier d’entrée contient des factures d’un fournisseur pour une période donnée. La première page de chaque facture contient le numéro de facture. La première page d’un document peut contenir des données spécifiques, par exemple un titre ou un numéro de facture. Pour déterminer que la page actuelle est la première page d’un nouveau document, vous devez vérifier si le champ correspondant a été détecté sur la page. Vous pouvez également analyser les valeurs des champs sur les pages consécutives (par exemple, les numéros de page ou les numéros de facture). Dans l’exemple suivant, nous comparons les numéros de facture trouvés sur deux pages consécutives et vérifions si le champ “FirstPageMarker” a été détecté sur la page actuelle. Si le champ a été trouvé ou si le numéro de facture diffère, la page actuelle est considérée comme la première page d’un nouveau document.
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;

Séparer les documents et supprimer les annexes

Le document contient une annexe ou des pages vides qui doivent être conservées sans extraction de données. Pour déterminer si le document comporte une annexe ou des pages vides, vérifiez s’il existe des pages sur lesquelles aucune donnée utile n’est présente. Par exemple, ajoutez un champ qui détecte n’importe quel mot et considérez comme vides toutes les pages sur lesquelles aucun mot n’a été trouvé. Dans l’exemple suivant, nous séparons les pages vides des pages non vides en nous basant sur le texte d’un champ.
var empty = new Document('empty'); 
var invoice = new Document('invoice'); 

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

    // Obtenir la valeur texte de la propriété "Field" de la page actuelle 
    var currentResult = page.GetField("Field").Text; 

    // Vérifier si le résultat actuel a une longueur supérieure à 0 
    if (currentResult.length > 0) { 
        invoice.Pages.push(page); 
    } else { 
        empty.Pages.push(page); 
    } 
}

return [invoice, empty];

Séparer les documents et déterminer leur type

Cas 1. Chaque type de Document est représenté par un seul document

Une demande de prêt contient des documents de types différents. Chaque type est représenté par un seul document. Tous les documents sont fournis dans un seul fichier. Pour déterminer que la page actuelle est la première page d’un nouveau document, vous pouvez simplement comparer sa classe à celle de la page précédente.
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;

    // Vérifiez si la page actuelle a la même classe que la page précédente. Si ce n'est pas le cas, commencez un nouveau document.
    if (pageResultClassId != currentResultClassId || !currentDocument)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

Cas 2. Chaque type de Document est représenté par un ou plusieurs documents

Une demande de prêt soumise par deux coemprunteurs contient un grand nombre de documents de types différents. Chaque type peut être représenté par plusieurs documents consécutifs. Par exemple, une demande peut contenir les images des pièces d’identité des deux coemprunteurs, plusieurs relevés bancaires, etc. Pour déterminer que la Page actuelle est la première Page d’un nouveau document, vous devez combiner les deux stratégies décrites ci-dessus. Dans l’exemple suivant, nous comparons d’abord les classes des deux Pages consécutives. Si la classe a changé, la Page actuelle est considérée comme la première Page d’un nouveau document. Si les Pages appartiennent à la même classe, nous vérifions si le champ “title” a été trouvé sur la Page actuelle. La Page sur laquelle ce champ a été trouvé est considérée comme la première Page d’un nouveau document.
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;

    // Vérifier si la page actuelle a la même classe que la page précédente. Si ce n'est pas le cas, commencer un nouveau document.
    if (pageResultClassId != currentResultClassId)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }
    // Commencer un nouveau document si le champ "Title" a été trouvé sur la page actuelle.
    else if (page.GetField("Title").Text || !currentDocument)
    {
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

Réordonner les pages et supprimer les pages vides

Le document contient des pages dans un ordre incorrect. Chaque page comporte un champ indiquant son numéro (par exemple « Page 1 sur 10 »). Pour organiser les pages, vous devez créer un champ qui extrait les numéros de page. Vous pouvez également créer un champ qui indique si une page est vierge ou non en recherchant la présence de texte sur cette page. Cela permet d’écarter les pages vierges ou parasites (par exemple celles issues de la numérisation en mode recto verso de plis avec un verso vide), comme décrit dans la section Séparer les documents et supprimer les annexes. Dans l’exemple suivant, nous réordonnons les pages selon leur numéro.
var documents = new Document('document'); 
var currentDocument = null; 
let arr = []; 

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

// Trier le tableau "arr" en fonction des valeurs numériques d'un champ spécifique de chaque page
arr.sort((page1, page2) => parseInt(page1.GetField("Field").Text) - parseInt(page2.GetField("Field").Text)); 

// Parcourir le tableau "arr" trié et ajouter chaque objet "page" à la propriété "Pages" du document "documents"
for (let i = 0; i < arr.length; i++) { 
    const page = arr[i]; 
    documents.Pages.push(page); 
} 

return [documents];