跳轉到主要內容
當您處理分析、辨識或合成結果時,可能需要逐一處理文件頁面及其中的區塊。在這種情況下,請注意,當您要求檢視或編輯某個文件元素 (例如頁面或區塊) 時,資料會載入記憶體,並會一直保留在記憶體中,直到明確將其卸載為止。這可能會導致「記憶體不足」錯誤。為避免發生此問題,請遵循下列建議。

逐一處理文件頁面

當您使用 FRDocument 物件的處理方法時,在 Linux 和 macOS 中,版面配置和影像文件會自動卸載至磁碟。在 Windows 中,版面配置和影像文件也可以自動儲存至磁碟;不過,此行為取決於所選的 PageFlushingPolicy 屬性值。 但是,如果您要求檢視或編輯某個文件的頁面及其區塊,資料不會自動卸載或儲存。如果您正在檢視或編輯多個頁面,則應在完成每個頁面的工作後卸載資料。也就是說,您應呼叫 FRPage 物件的 Flush 方法。
使用 .NET 的 Windows 使用者也應呼叫 GC.Collect 和 GC.WaitForPendingFinalizers。
另一方面,如果您在逐一處理頁面時進行了某些變更,就需要呼叫 Flush 方法來儲存這些變更。否則,例如當您呼叫對應 FRDocumentSaveToFolder 或其中一個匯出方法時,您的變更將會儲存到資料夾 (或匯出的文件) 中,但會從您目前操作的物件中清除。 在 Windows 中,Flush 方法的行為取決於 IFRDocument::PageFlushingPolicy 屬性的值。如果 PageFlushingPolicy 的值為 PFP_FlushToDisk,呼叫此方法會將版面配置和影像文件卸載至磁碟。如果值為 PFP_Auto,則當文件超過 30 頁時,呼叫此方法會將資料卸載至磁碟;否則,資料會保留在記憶體中。如果值為 PFP_KeepInMemory,資料則不會被卸載。當您在同一個解決方案中同時處理小型和大型文件時,這會很方便,因為您可以使用相同的程式碼進行處理。

Windows 範例

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);
}
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 );
}
另請參閱 FRDocument 處理文字