Pular para o conteúdo principal
Ao trabalhar com resultados de análise, reconhecimento ou síntese, talvez seja necessário percorrer as páginas do documento e os blocos nelas contidos. Nesse caso, leve em consideração que, ao solicitar um elemento do documento (por exemplo, uma página ou um bloco) para visualização ou edição, os dados são carregados na memória e permanecem lá até serem descarregados explicitamente. Isso pode causar um erro de “falta de memória”. Para evitá-lo, siga as recomendações abaixo.

Iterando pelas páginas do documento

Ao usar os métodos de processamento do objeto FRDocument, os layouts e documentos de imagem no Linux e no macOS são descarregados automaticamente para o disco. No Windows, os layouts e documentos de imagem podem ser salvos automaticamente em disco; no entanto, esse comportamento depende do valor selecionado para a propriedade PageFlushingPolicy. Mas, se você solicitar uma página de um documento e seus blocos para visualização ou edição, os dados não serão descarregados nem salvos automaticamente. Se você estiver visualizando ou editando várias páginas, deverá descarregar os dados depois de terminar de trabalhar com cada página. Isso significa que você deve chamar o método Flush do objeto FRPage.
Os usuários do Windows que trabalham com .NET também devem chamar GC.Collect e GC.WaitForPendingFinalizers .
Por outro lado, se você fizer alterações ao iterar pelas páginas, precisará chamar o método Flush para salvá-las. Caso contrário, se você chamar, por exemplo, SaveToFolder ou um dos métodos de exportação do FRDocument correspondente, suas alterações serão salvas na pasta (ou no documento exportado), mas serão removidas do objeto com o qual você está trabalhando. No Windows, o comportamento do método Flush depende do valor da propriedade IFRDocument::PageFlushingPolicy. Se o valor de PageFlushingPolicy for PFP_FlushToDisk, uma chamada ao método descarrega os layouts e documentos de imagem para o disco. Se for PFP_Auto, uma chamada ao método descarrega os dados para o disco se houver mais de 30 páginas no documento; caso contrário, os dados são mantidos na memória. Se for PFP_KeepInMemory, os dados não são descarregados. Isso é conveniente quando você processa documentos pequenos e grandes em uma mesma solução, pois pode usar o mesmo código para o processamento.

Exemplos no Windows

FREngine.IFRPages pages = document.Pages;
int pagesCount = pages.Count;
for (int i = 0; i < pagesCount; i++)
{
 FREngine.IFRPage page = pages.Item(i);
 // Iterar pelas páginas — trabalhar com blocos, parágrafos e caracteres
 iteratePage(page);
 // Forçar o Garbage Collector a liberar todos os objetos da página que não têm mais referência
 GC.Collect();
 GC.WaitForPendingFinalizers();
 // Descarregar os dados não utilizados da página
 // Se a página foi alterada em iteratePage(), chame Flush(true) para manter as alterações
 page.Flush(true);
 // Se não for necessário manter as alterações, chame 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 );
 // Iterar pelas páginas — trabalhar com blocos, parágrafos e caracteres
 iteratePage( page );
 // Descarregar os dados não utilizados da página
 // Se a página foi alterada em iteratePage(), chame Flush( true ) para manter as alterações
 page->Flush( true );
 // Se não for necessário manter as alterações, chame Flush(false)
 // page->Flush( false );
}
Veja também FRDocument Trabalhando com texto