Caricamento differito di pagine DOCX nel visualizzatore WinForms/WPF

Categoria del blog: ImagingOffice.NET

19.04.2024

Un documento DOCX è un documento in formato Microsoft Word Open XML che contiene testo, immagini, grafica e altro. Il vantaggio di un documento DOCX è la possibilità di modificare il suo contenuto in modo semplice e intuitivo. Lo svantaggio di un documento DOCX è che richiede di impostare il contenuto del documento per suddividerlo in pagine. In altre parole, per un documento DOCX di 1000 pagine, è necessario visualizzare tutte le pagine del documento, anche se si desidera visualizzare solo l'ultima pagina.

Se si apre un documento DOCX con un numero elevato di pagine (1000 o più pagine) in Microsoft Office Word, si noterà che Word apre il documento DOCX quasi istantaneamente e visualizza solo alcune pagine (3-5 pagine). Successivamente, in background, Word carica tutte le altre pagine del documento. Questo viene fatto in modo che l'utente non debba attendere che Word impagina tutte le pagine del documento DOCX, operazione che può richiedere molto tempo. Il caricamento in background delle pagine DOCX è molto comodo, poiché l'utente può iniziare rapidamente a visualizzare e modificare l'inizio del documento. Se l'utente deve visualizzare o modificare l'ultima pagina del documento, è necessario attendere che Word carichi tutte le pagine del documento.

VintaSoft Imaging .NET SDK consente di visualizzare i documenti DOCX e, per impostazione predefinita, recupera informazioni su tutte le pagine del documento DOCX e solo dopo le pagine del documento DOCX possono essere visualizzate nel visualizzatore di documenti. Per documenti DOCX di grandi dimensioni (1000 o più pagine) questo non è comodo, perché è necessario attendere che vengano recuperate le informazioni su tutte le pagine e solo allora le pagine potranno essere visualizzate.

Inoltre VintaSoft Imaging .NET SDK consente di riprodurre il comportamento di Microsoft Office Word, ovvero di recuperare informazioni sulle pagine del documento DOCX in background. Per abilitare il recupero in background delle informazioni sulle pagine/immagini di una raccolta di immagini, è necessario utilizzare la classe [ImageViewerImagesManager] e specificare che la classe deve:

Ecco il codice C# che consente di visualizzare le pagine del documento DOCX nel visualizzatore di documenti durante il caricamento delle informazioni sulle pagine del documento DOCX in background:
/// <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");
}