Carregamento lento de páginas DOCX no visualizador WinForms/WPF

Categoria do blog: ImagensEscritório.NET

19.04.2024

Um documento DOCX é um documento no formato Open XML do Microsoft Word que contém texto, imagens, gráficos e muito mais. A vantagem de um documento DOCX é a edição simples e intuitiva do seu conteúdo. A desvantagem é que ele exige a formatação do conteúdo para dividi-lo em páginas. Em outras palavras, para um documento DOCX de 1000 páginas, é necessário renderizar todas as páginas, mesmo que você precise visualizar apenas a última.

Ao abrir um documento DOCX com um grande número de páginas (1000 ou mais) no Microsoft Office Word, você notará que o Word abre o documento quase instantaneamente e exibe apenas algumas páginas (3 a 5). Posteriormente, em segundo plano, o Word carrega todas as outras páginas do documento. Isso é feito para que o usuário não precise esperar que o Word carregue todas as páginas do documento DOCX, o que pode levar bastante tempo. O carregamento em segundo plano das páginas do DOCX é muito conveniente, pois permite que o usuário comece rapidamente a visualizar e editar o início do documento. Caso precise visualizar ou editar a última página do documento, será necessário aguardar até que o Word carregue todas as páginas.

O VintaSoft Imaging .NET SDK permite visualizar documentos DOCX e, por padrão, recupera informações sobre todas as páginas do documento. Somente após essa recuperação, as páginas podem ser visualizadas no visualizador de documentos. Para documentos DOCX grandes (1000 páginas ou mais), isso não é conveniente, pois é necessário aguardar até que as informações de todas as páginas sejam recuperadas para então visualizá-las.

O VintaSoft Imaging .NET SDK também permite reproduzir o comportamento do Microsoft Office Word, ou seja, recuperar informações sobre as páginas do documento DOCX em segundo plano. Para habilitar a recuperação em segundo plano de informações sobre páginas/imagens de uma coleção de imagens, é necessário usar a classe [ImageViewerImagesManager] e especificar que essa classe deve:

Aqui está o código C# que permite exibir páginas de documentos DOCX no visualizador de documentos enquanto carrega informações sobre as páginas do documento DOCX em segundo plano:
/// <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");
}