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

配置活动

要配置此活动,请执行以下操作:
  1. Splitter Script Properties 窗格中单击加号图标,逐个创建类以添加可能的文档类型。
  2. Splitter Script Properties 窗格中单击 Script Editor
  3. 配置脚本,以确定如何将页面组装成文档。脚本可以访问该事务的所有页面。常见的做法是遍历页面,每次检查某个页面是否开始了一个新文档。如果没有,则将其追加到前一个文档中。有关可在脚本中使用的对象的详细说明,请参阅 Object model
  4. 单击 Save

示例脚本

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

分离相同类型的文档

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

分离文档并拆分附录

文档中包含附录或空白页面,这些页面应被单独保存,但不从中提取任何数据。 要确定文档是否包含附录或空白页面,需要检查是否存在找不到任何有价值数据的页面。例如,可以添加一个字段,用于查找任意单词,并将所有未能找到任何单词的页面视为空白页面。 在以下示例中,我们根据某个字段的文本内容,将空白页面与非空白页面分离开来。
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. 每种文档类型由单个文档表示

一份贷款申请包含多种不同类型的文档。每种类型由一个文档表示。所有文档都存放在同一个文件中。 要确定当前页面是否是新文档的首页,您只需将其类与上一页面的类进行比较即可。
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);
    }
    // Begin a new document if the "Title" field was found on a current page.
    else if (page.GetField("Title").Text || !currentDocument)
    {
        currentDocument = new Document(pageResultClassId);
        documents.push(currentDocument);
    }

    currentDocument.Pages.push(page);
}

return documents;

重新排序页面并删除空白页面

该文档中的页面顺序不正确。每个页面都包含一个字段,用于指示其编号(例如,“Page 1 of 10”)。要整理页面,需要创建一个用于提取页码的字段。 此外,还可以创建一个字段,通过检测页面上是否存在任何文本来指示该页面是否为空白。这样即可删除空白或无用页面(例如,由于对折页面进行双面扫描而产生的、背面为空白的页面),如分离文档和删除附录部分所述。 在下面的示例中,我们根据页码重新排序页面。
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];