跳转到主要内容
如果你创建一个 Document Splitter Skill,文档处理流程将以一个 Splitter Script 活动结束。此最终步骤用于将处理事务中的页流拆分为一组文档。 与其他活动不同,该活动会一次性处理一个处理事务中的所有页。

设置活动

要设置此活动,请执行以下操作:
  1. Splitter Script Properties 窗格中点击加号 icon,逐一创建类以添加可能的文档类型。
  2. Splitter Script Properties 窗格中点击 Script Editor
  3. 配置脚本以确定如何将页组装为文档。脚本可访问处理事务中的所有页。常见做法是遍历各页,每次检查当前页是否为新文档的起始页;如果不是,则将其追加到上一文档。有关脚本中可用对象的详细说明,请参见 对象模型
  4. 点击 Save

示例脚本

在本节中,您将看到与多种 Document Splitter Skill 用例相对应的示例脚本。以下所有脚本示例均假设在文档定义中存在一个名为“ResultClassId”的字段。该字段应包含文档类别。

分离同类型的 Document

输入文件包含某一时间段内来自同一 Vendor 的发票。每张发票的第一页都包含发票号码。 一个 Document 的第一页可能包含特定数据,例如标题或发票号码。要判断当前页是否为新 Document 的第一页,需要检查该页上是否找到了相应的 field。您也可以分析连续页面中的 field 值(例如页码或发票号码)。 在以下示例中,我们比较两个连续页面上识别到的发票号码,并检查当前页是否找到了 “FirstPageMarker” 字段。如果找到了该 field,或发票号码不同,则将当前页视为新 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;

分离 Document 并移除附录

该文档包含附录或空白页,应在不从中提取任何数据的情况下进行存储。 要判断文档是否包含附录或空白页,需要检查是否存在找不到任何有价值数据的页。例如,添加一个用于查找任意词语的 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]; 

    // 获取当前页面的"Field"字段的文本值
    var currentResult = page.GetField("Field").Text;

    // 检查当前结果的长度是否大于0
    if (currentResult.length > 0) { 
        invoice.Pages.push(page); 
    } else { 
        empty.Pages.push(page); 
    } 
}

return [invoice, empty];

拆分文档并确定其类型

情况 1:每种 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;

    // 检查当前页是否与前一页具有相同的类。如果不同,则开始一个新文档。
    if (pageResultClassId != currentResultClassId || !currentDocument)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

情况 2:每种文档类型由一个或多个文档构成

由两位共同申请人提交的贷款申请包含大量不同类型的文档。每种类型可能由多个文档按顺序出现。例如,申请中可能包含两位共同申请人的身份证件图像、若干银行对账单等。 要确定当前页是否为新文档的第一页,需要结合上文描述的两种策略。 在以下示例中,我们首先比较两个相邻页的类别。如果类别发生变化,则将当前页视为新文档的第一页。如果两个页面属于同一类别,则检查当前页是否找到 “title” 字段。找到该字段的页面被视为新文档的第一页。
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;

    // 检查当前页面是否与前一页面具有相同的类。如果不同,则开始新文档。
    if (pageResultClassId != currentResultClassId)
    {
        currentResultClassId = pageResultClassId;
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }
    // 如果在当前页面上找到"Title"字段,则开始新文档。
    else if (page.GetField("Title").Text || !currentDocument)
    {
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

重新排序页并移除空白页

该文档中的页顺序不正确。每一页都有一个用于指示其编号的 field(例如,“第 1 页,共 10 页”)。要整理这些页,您需要创建一个用于提取页码的 field。 此外,您还可以创建一个 field,通过检查该页上是否存在任何文本来判断该页是否为空白。这样可用于丢弃空白或无效页(例如,由于对折页双面扫描导致背面为空的页),具体说明见分离文档并移除附件一节。 在以下示例中,我们将根据页码对页面重新排序。
var documents = new Document('document'); 
var currentDocument = null; 
let arr = []; 

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

// 根据每个页面中特定字段的数值对"arr"数组进行排序
arr.sort((page1, page2) => parseInt(page1.GetField("Field").Text) - parseInt(page2.GetField("Field").Text));

// 遍历已排序的"arr"数组,并将每个"page"对象追加到"documents"文档的"Pages"属性
for (let i = 0; i < arr.length; i++) { 
    const page = arr[i]; 
    documents.Pages.push(page); 
} 

return [documents];