Passer au contenu principal
Lorsque vous travaillez avec des résultats d’analyse, de reconnaissance ou de synthèse, vous pouvez avoir besoin de parcourir les pages d’un document ainsi que les blocs qu’elles contiennent. Dans ce cas, gardez à l’esprit que lorsque vous demandez l’affichage ou la modification d’un élément du document (par exemple, une page ou un bloc), les données sont chargées en mémoire et y restent jusqu’à ce qu’elles soient explicitement déchargées. Cela peut entraîner une erreur de type « mémoire insuffisante ». Pour l’éviter, suivez les recommandations ci-dessous.

Parcourir les pages d’un document

Lorsque vous utilisez les méthodes de traitement de l’objet FRDocument, les layouts et les documents image sont automatiquement déchargés sur le disque sous Linux et macOS. Sous Windows, les layouts et les documents image peuvent être enregistrés automatiquement sur le disque ; toutefois, ce comportement dépend de la valeur sélectionnée pour la propriété PageFlushingPolicy. Mais si vous demandez une page d’un document ainsi que ses blocs pour les afficher ou les modifier, les données ne sont ni déchargées ni enregistrées automatiquement. Si vous affichez ou modifiez plusieurs pages, vous devez décharger les données après avoir fini de travailler sur chaque page. Cela signifie que vous devez appeler la méthode Flush de l’objet FRPage.
Les utilisateurs Windows travaillant avec .NET doivent également appeler GC.Collect et GC.WaitForPendingFinalizers .
En revanche, si vous apportez des modifications lors du parcours des pages, vous devez appeler la méthode Flush pour enregistrer ces modifications. Sinon, si vous appelez, par exemple, SaveToFolder ou l’une des méthodes d’exportation du FRDocument correspondant, vos modifications seront enregistrées dans le dossier (ou dans le document exporté), mais elles seront effacées de l’objet sur lequel vous travaillez. Sous Windows, le comportement de la méthode Flush dépend de la valeur de la propriété IFRDocument::PageFlushingPolicy. Si la valeur de PageFlushingPolicy est PFP_FlushToDisk, l’appel à la méthode décharge les layouts et les documents image sur le disque. Si elle est définie sur PFP_Auto, l’appel à la méthode décharge les données sur le disque s’il y a plus de 30 pages dans le document ; sinon, les données restent en mémoire. Si elle est définie sur PFP_KeepInMemory, les données ne sont pas déchargées. C’est pratique lorsque vous traitez à la fois de petits et de grands documents dans une même solution, car vous pouvez utiliser le même code de traitement.

Exemples Windows

FREngine.IFRPages pages = document.Pages;
int pagesCount = pages.Count;
for (int i = 0; i < pagesCount; i++)
{
 FREngine.IFRPage page = pages.Item(i);
 // Parcourir les pages et travailler avec les blocs, les paragraphes et les caractères
 iteratePage(page);
 // Forcer le garbage collector à libérer tous les objets de la page qui ne sont plus référencés
 GC.Collect();
 GC.WaitForPendingFinalizers();
 // Décharger les données inutilisées de la page
 // Si la page a été modifiée dans iteratePage(), appelez Flush(true) pour conserver les modifications
 page.Flush(true);
 // S'il n'est pas nécessaire de conserver les modifications, appelez 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 );
 // Parcourir les pages et travailler avec les blocs, les paragraphes et les caractères
 iteratePage( page );
 // Décharger les données inutilisées de la page
 // Si la page a été modifiée dans iteratePage(), appelez Flush( true ) pour conserver les modifications
 page->Flush( true );
 // S'il n'est pas nécessaire de conserver les modifications, appelez Flush(false)
 // page->Flush( false );
}
Voir aussi FRDocument Travailler avec le texte