Chargement différé des pages DOCX dans la visionneuse WinForms/WPF.

Catégorie du blog: ImagerieBureau.NET

19.04.2024

Un document DOCX est un document au format Open XML de Microsoft Word contenant du texte, des images, des graphiques, etc. Son principal avantage réside dans la simplicité et l'intuitivité de son édition. En revanche, il nécessite une mise en page pour structurer le document en pages. Ainsi, pour un document DOCX de 1 000 pages, il faut générer toutes les pages, même si l'on souhaite uniquement consulter la dernière.

Si vous ouvrez un document DOCX de grande taille (1 000 pages ou plus) dans Microsoft Office Word, vous remarquerez que Word l'ouvre presque instantanément et n'affiche que quelques pages (3 à 5). Ensuite, en arrière-plan, Word charge toutes les autres pages. Ceci permet à l'utilisateur de ne pas avoir à attendre que Word mette en page l'ensemble du document, ce qui peut prendre un certain temps. Le chargement en arrière-plan des pages DOCX est très pratique, car il permet à l'utilisateur de commencer rapidement à consulter et à modifier le début du document. Si l'utilisateur souhaite consulter ou modifier la dernière page, il doit attendre que Word ait chargé toutes les pages.

VintaSoft Imaging .NET SDK permet de visualiser les documents DOCX. Par défaut, il récupère les informations relatives à toutes les pages du document avant de les afficher dans la visionneuse. Pour les documents DOCX volumineux (1 000 pages ou plus), cette méthode s'avère peu pratique, car il faut attendre la fin du téléchargement des informations avant de pouvoir les visualiser.

VintaSoft Imaging .NET SDK permet également de reproduire le comportement de Microsoft Office Word, c'est-à-dire de récupérer en arrière-plan des informations sur les pages d'un document DOCX. Pour activer la récupération en arrière-plan d'informations sur les pages/images d'une collection d'images, il est nécessaire d'utiliser la classe [ImageViewerImagesManager] et de spécifier que cette classe doit:

Voici un exemple de code C# permettant d'afficher les pages d'un document DOCX dans la visionneuse de documents pendant le chargement en arrière-plan des informations relatives à ces pages:
/// <summary>
/// The images manager for an image viewer.
/// </summary>
Vintasoft.Imaging.UI.ImageViewerImagesManager _imagesManager;



/// <summary>
/// Initializes a new instance of the <see cref="MainForm1"/> class.
/// </summary>
public MainForm1()
{
    InitializeComponent();

    // create images manager
    _imagesManager = new Vintasoft.Imaging.UI.ImageViewerImagesManager(imageViewer1);
    // specify that manager should retrieve information about image from file during 1 second, add images to an image viewer,
    // do previous steps until information about all images will not be retrieved
    _imagesManager.IntermediateAddInterval = 1000;
    // specify that manager should work asynchronously
    _imagesManager.IsAsync = true;
    _imagesManager.ImageSourceAddException += ImagesManager_ImageSourceAddException;
}



/// <summary>
/// Opens an image file.
/// </summary>
/// <param name="filename">The filename.</param>
internal void OpenImageFile(string filename)
{
    // cancel previous file opening process
    CancelOpening();
    // clear image collection of manager
    _imagesManager.Images.ClearAndDisposeItems();
    // add image file to the manager
    _imagesManager.Add(filename);
}

/// <summary>
/// Cancels the opening of a file.
/// </summary>
private void CancelOpening()
{
    _imagesManager.Cancel();
}

private void ImagesManager_ImageSourceAddException(object sender, Vintasoft.Imaging.ImageSourceExceptionEventArgs e)
{
    string message = string.Format("Cannot open {0} : {1}", System.IO.Path.GetFileName(e.SourceFilename), e.Exception.Message);
    System.Windows.Forms.MessageBox.Show(message, "Error");
}