2013-08-14 2 views
2

Я уже несколько дней пытаюсь загрузить файл docx word в элемент управления webbrowser, который существует в форме окна C#. После долгих дней, чтобы это сделать, но с помощью Google и некоторых полезных сообщений мне удалось это сделать, и это beauuuuuupiful. Я сделал это через:Просмотр документов Docx в элементе управления WebBrowser

  1. Преобразование файла docx во временный html-файл.
  2. Я переместил свой элемент управления веб-браузером на этот временный html-документ.

Только это я заметил одну проблему: Управление веб-браузером, похоже, просматривает файлы в макете веб-сайта. Это Ms-Word Web Layout, вы знаете, что есть 3 основных макета просмотра в Ms-Word, режиме чтения, макете печати и веб-макете. Проблема заключается в том, что некоторые сильно отформатированные файлы docx перекошены в этом элементе управления webbrowser, потому что они растягивают их, как если бы они отображались в реальном приложении веб-браузера.

Теперь я хотел бы получить доступ к содержимому этого элемента управления веб-браузером в чем-то, аналогичном макету печати в Ms-Word, или, по крайней мере, для того, чтобы элемент управления мог обновлять содержимое в пределах собственного размера элемента управления ,

(Если мой код нужен, то я могу предоставить его)

+0

Это приложение для Windows Form. Я добавил его в качестве настраиваемого элемента управления для своего инструментария. Щелкните правой кнопкой мыши на панели инструментов >> «Выберите элемент панели инструментов (Window)/компонент .NET Framework (вкладка)/веб-браузер (пространство имен System.windows.Forms). думаю, что это управление WinForm, но исправьте меня, если я ошибаюсь. –

ответ

0

Найдено в http://codinglight.blogspot.de/2008/10/simple-docbrowser-control.html

Это использует WebBrowser-Control, но преобразует документ в 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"); 
+0

Я видел код выше, и это помогло мне создать мой собственный класс, за исключением того, что я думаю, что он очень длинный, и многое из этого переуплотнено. собственный класс меньшего класса, который делает то же самое. Во-вторых, этот класс по-прежнему имеет несколько ошибок, когда я его пробовал. И последнее, но не менее важное: даже этот класс, когда он правильно работает, проверив код, все равно будет иметь ту же проблему. я хочу, чтобы документ был загружен в веб-макет. Я хочу, чтобы документ был загружен. Макет печати или его содержимое должно быть правильно переработано в элементе управления веб-браузером. –

+0

Уверен, потому что webBrowser-Control не предназначен для просмотра документы. Почему вам даже нужно использовать webBrowser? может, например, начинать слово в вашей заявке –

0

Нет такой возможности для сохранения метода выбора макета.

Вы можете использовать веб-браузер в качестве сервера документов 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 (таким образом, невозможно автоматизировать слово DOM).

Смежные вопросы