Vai al contenuto principale
Quando lavori con i risultati di analisi, riconoscimento o sintesi, potresti dover scorrere le pagine del documento e i relativi blocchi. In questo caso, tieni presente che, quando richiedi un elemento del documento (ad esempio una pagina o un blocco) per visualizzarlo o modificarlo, i dati vengono caricati in memoria e vi restano finché non vengono esplicitamente scaricati. Questo può causare un errore di “memoria insufficiente”. Per evitarlo, segui le raccomandazioni riportate di seguito.

Iterazione delle pagine del documento

Quando si utilizzano i metodi di elaborazione dell’oggetto FRDocument, in Linux e macOS i layout e i documenti immagine vengono automaticamente scaricati su disco. In Windows, i layout e i documenti immagine possono essere salvati automaticamente su disco; tuttavia, questo comportamento dipende dal valore selezionato per la proprietà PageFlushingPolicy. Tuttavia, se si richiedono una pagina di un documento e i relativi blocchi per visualizzarli o modificarli, i dati non vengono né scaricati né salvati automaticamente. Se si visualizzano o si modificano più pagine, è opportuno scaricare i dati dopo aver terminato di lavorare con ciascuna pagina. Ciò significa che è necessario chiamare il metodo Flush dell’oggetto FRPage.
Gli utenti Windows che lavorano con .NET devono chiamare anche GC.Collect e GC.WaitForPendingFinalizers .
D’altra parte, se si apportano modifiche durante l’iterazione delle pagine, è necessario chiamare il metodo Flush per salvare tali modifiche. In caso contrario, se si chiama, ad esempio, SaveToFolder o uno dei metodi di esportazione del corrispondente FRDocument, le modifiche verranno salvate nella cartella (o nel documento esportato), ma saranno rimosse dall’oggetto su cui si sta lavorando. In Windows, il comportamento del metodo Flush dipende dal valore della proprietà IFRDocument::PageFlushingPolicy. Se il valore di PageFlushingPolicy è PFP_FlushToDisk, la chiamata al metodo scarica su disco i layout e i documenti immagine. Se è PFP_Auto, la chiamata al metodo scarica i dati su disco se il documento contiene più di 30 pagine; in caso contrario, i dati vengono mantenuti in memoria. Se è PFP_KeepInMemory, i dati non vengono scaricati. Questo risulta utile quando si elaborano sia documenti piccoli sia documenti grandi all’interno della stessa soluzione, poiché è possibile utilizzare lo stesso codice di elaborazione.

Esempi per Windows

FREngine.IFRPages pages = document.Pages;
int pagesCount = pages.Count;
for (int i = 0; i < pagesCount; i++)
{
 FREngine.IFRPage page = pages.Item(i);
 // Itera sulle pagine: lavora con blocchi, paragrafi e caratteri
 iteratePage(page);
 // Forza il Garbage Collector a liberare tutti gli oggetti della pagina non più referenziati
 GC.Collect();
 GC.WaitForPendingFinalizers();
 // Scarica i dati della pagina non utilizzati
 // Se la pagina è stata modificata in iteratePage(), chiama Flush(true) per mantenere le modifiche
 page.Flush(true);
 // Se non è necessario mantenere le modifiche, chiama 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 );
 // Itera sulle pagine: lavora con blocchi, paragrafi e caratteri
 iteratePage( page );
 // Scarica i dati della pagina non utilizzati
 // Se la pagina è stata modificata in iteratePage(), chiama Flush( true ) per mantenere le modifiche
 page->Flush( true );
 // Se non è necessario mantenere le modifiche, chiama Flush(false)
 // page->Flush( false );
}
Vedi anche FRDocument Lavorare con il testo