在WebBrowser控件中查看Docx文档

本文关键字:Docx 文档 WebBrowser 控件 | 更新日期: 2023-09-27 18:27:54

几天来,我一直在尝试将word docx文件加载到windows窗体c#中的Web浏览器控件中。经过几天的努力,但在谷歌和一些有用的帖子的帮助下,我成功地完成了这项工作,这是非常棒的。我已经完成了:

  1. 将docx文件转换为临时html文件
  2. 我将Web浏览器控件导航到了那个临时的html文档

只是我注意到了一个问题:Web浏览器控件似乎可以查看Web布局中的文件。这就是Ms Word Web布局,你知道在Ms Word中有三种主要的查看布局:读取模式、打印布局和Web布局。这样做的问题是,一些格式严重的docx文件在该web浏览器控件中会全部倾斜,因为它会将它们拉伸,就好像它们会出现在实际的web浏览器应用程序中一样。

现在,我想实现的是能够以类似于Ms Word中的"打印布局"的方式查看该Web浏览器控件的内容,或者至少让控件在控件自己的大小内重新调整内容。

(如果我的代码是必要的,那么我可以提供它)

在WebBrowser控件中查看Docx文档

位于http://codinglight.blogspot.de/2008/10/simple-docbrowser-control.html

这将使用webBrowser控件,但会将文档转换为HTML文件。此外,您还必须安装MS Word。

用以下代码创建一个类:

using System;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;
using System.IO;
namespace WordControls
{
    public partial class DocBrowser : UserControl
    {
        private System.Windows.Forms.WebBrowser webBrowser1;
    delegate void ConvertDocumentDelegate(string fileName);
    public DocBrowser()
    {
        InitializeComponent();
        // Create the webBrowser control on the UserControl. 
        // This code was moved from the designer for cut and paste
        // ease. 
        webBrowser1 = new System.Windows.Forms.WebBrowser();
        webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill;
        webBrowser1.Location = new System.Drawing.Point(0, 0);
        webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
        webBrowser1.Name = "webBrowser1";
        webBrowser1.Size = new System.Drawing.Size(532, 514);
        webBrowser1.TabIndex = 0;
        Controls.Add(webBrowser1);
        // set up an event handler to delete our temp file when we're done with it. 
        webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
    }
    string tempFileName = null;
    public void LoadDocument(string fileName)
    {
        // Call ConvertDocument asynchronously. 
        ConvertDocumentDelegate del = new ConvertDocumentDelegate(ConvertDocument);
        // Call DocumentConversionComplete when the method has completed. 
        del.BeginInvoke(fileName, DocumentConversionComplete, null);
    }
    void ConvertDocument(string fileName)
    {
        object m = System.Reflection.Missing.Value;
        object oldFileName = (object)fileName;
        object readOnly = (object)false;
        ApplicationClass ac = null;
        try
        {
            // First, create a new Microsoft.Office.Interop.Word.ApplicationClass.
            ac = new ApplicationClass();
            // Now we open the document.
            Document doc = ac.Documents.Open(ref oldFileName, ref m, ref readOnly,
                ref m, ref m, ref m, ref m, ref m, ref m, ref m,
                 ref m, ref m, ref m, ref m, ref m, ref m);
            // Create a temp file to save the HTML file to. 
            tempFileName = GetTempFile("html");
            // Cast these items to object.  The methods we're calling 
            // only take object types in their method parameters. 
            object newFileName = (object)tempFileName;
            // We will be saving this file as HTML format. 
            object fileType = (object)WdSaveFormat.wdFormatHTML;
            // Save the file. 
            doc.SaveAs(ref newFileName, ref fileType,
                ref m, ref m, ref m, ref m, ref m, ref m, ref m,
                ref m, ref m, ref m, ref m, ref m, ref m, ref m);
        }
        finally
        {
            // Make sure we close the application class. 
            if (ac != null)
                ac.Quit(ref readOnly, ref m, ref m);
        }
    }
    void DocumentConversionComplete(IAsyncResult result)
    {
        // navigate to our temp file. 
        webBrowser1.Navigate(tempFileName);
    }
    void webBrowser1_DocumentCompleted(object sender,
        WebBrowserDocumentCompletedEventArgs e)
    {
        if (tempFileName != string.Empty)
        {
            // delete the temp file we created. 
            File.Delete(tempFileName);
            // set the tempFileName to an empty string. 
            tempFileName = string.Empty;
        }
    }
    string GetTempFile(string extension)
    {
        // Uses the Combine, GetTempPath, ChangeExtension, 
        // and GetRandomFile methods of Path to 
        // create a temp file of the extension we're looking for. 
        return Path.Combine(Path.GetTempPath(),
            Path.ChangeExtension(Path.GetRandomFileName(), extension));
        }
    }
}

将控件添加到窗体并调用LoadDocument方法。

docBrowser1.LoadDocument(@"Path_to_Doc_as_String");

保存方法没有这样的选项来选择布局。

您可以将网络浏览器用作ActiveX文档服务器,然后访问单词DOM。设置布局类型的方法是通过Document.ActiveWindow.View.type:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            var webbrowser = webBrowser1.ActiveXInstance as SHDocVw.IWebBrowser2;
            var document =webbrowser.Document;
            if (document != null)
            {
                var wordDocument = document as Microsoft.Office.Interop.Word.Document ;
                if (wordDocument != null)
                {
                    var activeWindow=wordDocument.ActiveWindow;
                    if (activeWindow != null)
                    {
                        var view=activeWindow.View;
                        if (view != null)
                        {
                            view.Type = WdViewType.wdPrintView;
                            Marshal.ReleaseComObject(view);
                        }
                        Marshal.ReleaseComObject(activeWindow);
                    }
                    Marshal.ReleaseComObject(wordDocument);
                }
                Marshal.ReleaseComObject(document);
            }
            Marshal.ReleaseComObject(webbrowser);
        }
    }

根据用户对不安全对象的互联网安全设置,您可能会在打开文档之前看到提示,或者只是从IWebBrowser2.document中获取null(因此无法自动使用DOM)。