분석, 인식 또는 합성 결과를 다룰 때는 문서 페이지와 해당 페이지의 블록을 순회해야 할 수 있습니다. 이 경우, 보기 또는 편집을 위해 문서 요소(예: 페이지나 블록)를 요청하면 해당 데이터가 메모리에 로드되고 명시적으로 언로드할 때까지 메모리에 유지된다는 점에 유의해야 합니다. 이로 인해 “메모리 부족” 오류가 발생할 수 있습니다. 이를 방지하려면 아래 권장 사항을 따르세요.
FRDocument 객체의 처리 메서드를 사용하면 Linux와 macOS에서는 레이아웃과 이미지 문서가 자동으로 디스크로 언로드됩니다. Windows에서는 레이아웃과 이미지 문서를 자동으로 디스크에 저장할 수 있지만, 이 동작은 선택한 PageFlushingPolicy 속성 값에 따라 달라집니다.하지만 보기 또는 편집을 위해 문서의 페이지와 해당 블록을 요청하면 데이터는 자동으로 언로드되거나 저장되지 않습니다. 여러 페이지를 보거나 편집하는 경우에는 각 페이지 작업을 마친 후 해당 데이터를 언로드해야 합니다. 즉, FRPage 객체의 Flush 메서드를 호출해야 합니다.
Windows에서 .NET으로 작업하는 사용자는 GC.Collect 및 GC.WaitForPendingFinalizers도 호출해야 합니다.
반면 페이지를 반복 처리하는 동안 일부 내용을 변경하는 경우에는 이러한 변경 사항을 저장하기 위해 Flush 메서드를 호출해야 합니다. 그렇지 않으면 예를 들어 해당 FRDocument의 SaveToFolder 메서드나 내보내기 메서드 중 하나를 호출할 때 변경 사항은 폴더(또는 내보낸 문서)에 저장되지만, 현재 작업 중인 객체에서는 사라집니다.Windows에서 Flush 메서드의 동작은 IFRDocument::PageFlushingPolicy 속성 값에 따라 달라집니다. PageFlushingPolicy 값이 PFP_FlushToDisk이면 메서드를 호출할 때 레이아웃과 이미지 문서가 디스크로 언로드됩니다. 값이 PFP_Auto이면 문서가 30페이지를 초과할 경우 메서드 호출 시 데이터가 디스크로 언로드되고, 그렇지 않으면 데이터는 메모리에 유지됩니다. 값이 PFP_KeepInMemory이면 데이터는 언로드되지 않습니다. 따라서 하나의 솔루션에서 작은 문서와 큰 문서를 모두 처리할 때도 동일한 처리 코드를 사용할 수 있어 편리합니다.
FREngine.IFRPages pages = document.Pages;int pagesCount = pages.Count;for (int i = 0; i < pagesCount; i++){ FREngine.IFRPage page = pages.Item(i); // 페이지를 순회하며 블록, 단락, 문자 처리 iteratePage(page); // 페이지에서 참조되지 않는 모든 객체를 해제하도록 가비지 컬렉터 강제 실행 GC.Collect(); GC.WaitForPendingFinalizers(); // 사용하지 않는 페이지 데이터 로드 해제 // iteratePage()에서 페이지가 변경된 경우 변경 사항을 유지하려면 Flush(true) 호출 page.Flush(true); // 변경 사항을 유지할 필요가 없으면 Flush(false) 호출 // page.Flush(false);}
C++ (COM) 코드
FREngine::IFRPagesPtr pages = document->Pages;int pagesCount = pages->Count;for( int i = 0; i < pagesCount; i++ ) { FREngine::IFRPagePtr page = pages->Item( i ); // 페이지를 순회하며 블록, 단락, 문자 처리 iteratePage( page ); // 사용하지 않는 페이지 데이터 로드 해제 // iteratePage()에서 페이지가 변경된 경우 변경 사항을 유지하려면 Flush( true ) 호출 page->Flush( true ); // 변경 사항을 유지할 필요가 없으면 Flush(false) 호출 // page->Flush( false );}