Saltar al contenido principal
Cuando trabaje con resultados de análisis, reconocimiento o síntesis, puede que necesite recorrer las páginas de un documento y los bloques que contienen. En ese caso, debe tener en cuenta que, cuando solicita un elemento del documento (por ejemplo, una página o un bloque) para verlo o editarlo, los datos se cargan en memoria y permanecen allí hasta que se descargan explícitamente. Esto puede provocar un error de “memoria insuficiente”. Para evitarlo, siga las recomendaciones que se indican a continuación.

Recorrer las páginas del documento

Cuando usa los métodos de procesamiento del objeto FRDocument, los layouts y los documentos de imagen en Linux y macOS se descargan automáticamente en disco. En Windows, los layouts y los documentos de imagen pueden guardarse automáticamente en disco; sin embargo, este comportamiento depende del valor seleccionado de la propiedad PageFlushingPolicy. Pero si solicita una página de un documento y sus bloques para verlos o editarlos, los datos no se descargan ni se guardan automáticamente. Si está viendo o editando varias páginas, debe descargar los datos después de terminar de trabajar con cada página. Esto significa que debe llamar al método Flush del objeto FRPage.
Los usuarios de Windows que trabajen con .NET también deben llamar a GC.Collect y GC.WaitForPendingFinalizers .
Por otro lado, si realiza cambios mientras recorre las páginas, debe llamar al método Flush para guardar esos cambios. De lo contrario, si llama, por ejemplo, al método SaveToFolder o a uno de los métodos de exportación del objeto FRDocument correspondiente, sus cambios se guardarán en la carpeta (o en el documento exportado), pero se eliminarán del objeto con el que está trabajando. En Windows, el comportamiento del método Flush depende del valor de la propiedad IFRDocument::PageFlushingPolicy. Si el valor de PageFlushingPolicy es PFP_FlushToDisk, al llamar al método se descargan en disco los layouts y los documentos de imagen. Si es PFP_Auto, al llamar al método se descargan los datos en disco si hay más de 30 páginas en el documento; de lo contrario, los datos se mantienen en memoria. Si es PFP_KeepInMemory, los datos no se descargan. Esto resulta práctico cuando procesa documentos pequeños y grandes en una misma solución, ya que puede usar el mismo código de procesamiento.

Ejemplos de Windows

FREngine.IFRPages pages = document.Pages;
int pagesCount = pages.Count;
for (int i = 0; i < pagesCount; i++)
{
 FREngine.IFRPage page = pages.Item(i);
 // Iterar las páginas: trabajar con bloques, párrafos y caracteres
 iteratePage(page);
 // Forzar al recolector de basura a liberar todos los objetos de la página que no tengan referencias
 GC.Collect();
 GC.WaitForPendingFinalizers();
 // Descargar los datos de la página no utilizados
 // Si se cambió la página en iteratePage(), llame a Flush(true) para conservar los cambios
 page.Flush(true);
 // Si no es necesario conservar los cambios, llame a 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 las páginas: trabajar con bloques, párrafos y caracteres
 iteratePage( page );
 // Descargar los datos de la página no utilizados
 // Si se cambió la página en iteratePage(), llame a Flush( true ) para conservar los cambios
 page->Flush( true );
 // Si no es necesario conservar los cambios, llame a Flush(false)
 // page->Flush( false );
}
Consulte también FRDocument Trabajar con texto