跳轉到主要內容
如果您建立 Document Splitter skill,文件處理流程會以 Splitter Script 活動作為結尾。最後這個步驟負責將處理作業中的頁面流分割成一組文件。 與其他活動不同,此活動會一次處理該處理作業中的所有頁面。

設定活動

若要設定活動,請執行下列操作:
  1. Splitter Script Properties 窗格中按一下加號 icon,逐一建立類別以新增可能的文件類型。
  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]; 
} 

// Sort the "arr" array based on the numerical values of a specific field in each page 
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];