메인 콘텐츠로 건너뛰기
Document Splitter Skill을 생성하면 문서 처리 흐름은 Splitter Script 액티비티에서 종료됩니다. 이 마지막 단계는 하나의 트랜잭션 내 페이지 흐름을 여러 개의 문서로 분할하는 역할을 합니다. 다른 액티비티와 달리, 이 액티비티는 하나의 트랜잭션에 포함된 모든 페이지를 한 번에 처리합니다.

활동 설정

활동을 설정하려면 다음을 수행합니다.
  1. Splitter Script Properties 창에서 플러스 아이콘을 클릭하여 가능한 문서 유형을 추가하고 클래스를 하나씩 만듭니다.
  2. Splitter Script Properties 창에서 Script Editor를 클릭합니다.
  3. 페이지를 문서로 어떻게 구성할지 결정하는 스크립트를 설정합니다. 이 스크립트는 트랜잭션의 모든 페이지에 액세스할 수 있습니다. 일반적인 시나리오는 페이지를 순차적으로 처리하면서 각 페이지가 새 문서를 시작하는지 매번 확인하는 것입니다. 새 문서를 시작하지 않으면 이전 문서에 추가됩니다. 스크립트에서 사용할 수 있는 객체에 대한 자세한 설명은 개체 모델을 참조하십시오.
  4. Save를 클릭합니다.

샘플 스크립트

이 절에서는 다양한 Document Splitter Skill 사용 사례에 대응하는 샘플 스크립트를 확인할 수 있습니다. 아래의 모든 스크립트 예시는 문서 정의에 “ResultClassId”라는 field가 정의되어 있다고 가정합니다. 이 field에는 문서 클래스가 포함되어야 합니다.

동일한 유형의 문서 분리

입력 파일에는 특정 기간 동안 한 공급업체에서 발행한 송장들이 포함되어 있습니다. 각 송장의 첫 페이지에는 송장 번호가 있습니다. 문서의 첫 페이지에는 예를 들어 제목이나 송장 번호와 같은 특정 데이터가 포함될 수 있습니다. 현재 페이지가 새 문서의 첫 페이지인지 판별하려면 해당 페이지에서 대응하는 field가 발견되었는지 확인해야 합니다. 또한 연속된 페이지에서 field 값(예: 페이지 번호 또는 송장 번호)을 분석할 수도 있습니다. 다음 예에서는 두 개의 연속된 페이지에서 발견된 송장 번호를 비교하고, 현재 페이지에서 “FirstPageMarker” field가 발견되었는지 확인합니다. field가 발견되었거나 송장 번호가 다른 경우, 현재 페이지는 새 문서의 첫 페이지로 간주됩니다.
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;

문서 분리 및 부록 제거

문서에 부록이나 빈 페이지가 포함되어 있으며, 이들에서는 어떤 데이터도 추출하지 않은 채로 저장해야 합니다. 문서에 부록이나 빈 페이지가 있는지 확인하려면, 유용한 데이터를 찾을 수 없는 페이지가 있는지 검사해야 합니다. 예를 들어, 아무 단어나 찾는 field를 하나 추가하고, 어떤 단어도 찾지 못한 모든 페이지를 빈 페이지로 간주합니다. 다음 예제에서는 field의 텍스트(Text)를 기준으로 빈 페이지와 빈 페이지가 아닌 페이지를 분리합니다.
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” field가 발견되었는지 확인합니다. 이 field가 발견된 페이지는 새 문서의 첫 페이지로 간주됩니다.
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;

페이지 재정렬 및 빈 페이지 제거

이 문서에는 페이지가 잘못된 순서로 배열되어 있습니다. 각 페이지에는 페이지 번호를 나타내는 field가 포함되어 있습니다(예: “Page 1 of 10”). 페이지를 정리하려면 페이지 번호를 추출하는 field를 생성해야 합니다. 또한 해당 페이지에 Text가 존재하는지 여부를 확인하여, 페이지가 비어 있는지 여부를 표시하는 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]; 
} 

// 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];