none
Отображение Word документа через Package RRS feed

  • Общие обсуждения

  • Добрый день!

    Необходимо отобразить Word документ. Реализация состоит из:

    1. Word документ упаковать

    2. Отобразить упакованный Word документ

    вот небольшие наброски:

    Отображение локального Word документа

    /// <summary>
            /// Метод конвертирует документ типа Word в XPS
            /// </summary>
            /// <param name="wordDocName">Полный путь к doc файлу, который необходимо отобразить</param>
            /// <returns>Возвращает XPS документ конвертированный из Word документа</returns>
            private XpsDocument ConvertWordDocToXPSDoc(string wordDocName)
            {
                string appData = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData)+"\\Vexperte_\\Temp\\tmpf.tmp";
                Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application();
                try
                {
                    wordApplication.Documents.Add(wordDocName);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                    wordApplication.Quit();
                }
                Document doc = wordApplication.ActiveDocument;
                Stream f = null;
                try
                {
                    doc.SaveAs(f, WdSaveFormat.wdFormatXPS);
                    doc.SaveAs(appData, WdSaveFormat.wdFormatXPS);
                    wordApplication.Quit();
                    XpsDocument xpsDoc = new XpsDocument(appData, System.IO.FileAccess.Read);
                    return xpsDoc;
                }
                catch (Exception exp)
                {
                    MessageBox.Show(exp.Message,"Error");
                    wordApplication.Quit();
                    return null;
                }
            }
    
    private void viewer_Click_1(object sender, RoutedEventArgs e)
            {
                OpenFileDialog fd = new OpenFileDialog();
                fd.Filter = "Word (*.doc;*.docx)|*.doc;*.docx";
                fd.ShowDialog();
                if (fd.FileName.Length > 0)
                {
                    try
                    {
                        documentViewer1.Document = ConvertWordDocToXPSDoc(fd.FileName).GetFixedDocumentSequence();
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }


    Данный код работает

    Вот уаковка файла

    /// <summary>
            ///   Копировать данные из исходного потока в целевой поток.</summary>
            /// <param name="source">
            ///   Исходный поток для копирования.</param>
            /// <param name="target">
            ///   Поток назначения для копирования.</param>
            private void CopyStream(Stream source, Stream target)
            {
                const int bufSize = 0x1000;
                byte[] buf = new byte[bufSize];
                int bytesRead = 0;
                while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
                    target.Write(buf, 0, bytesRead);
            }
    
    /// <summary>
            /// Упаковка выбранного файла
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void arhiv_Click(object sender, RoutedEventArgs e)
            {
                OpenFileDialog fd = new OpenFileDialog();
                fd.Filter = "Microsoft Word (*.doc;*docx)|*.doc;*docx";
                fd.ShowDialog();
                if (fd.FileName.Length > 0)
                {
                    string appData = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData) + "\\Temp\\tmpf.tmp";
                    Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application();
                    try
                    {
                        wordApplication.Documents.Add(fd.FileName);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        wordApplication.Quit();
                        return;
                    }
                    Document doc = wordApplication.ActiveDocument;
                    Stream f = null;
                    try
                    {
                        doc.SaveAs(appData, WdSaveFormat.wdFormatXPS);
                        doc.Close();
                        wordApplication.Quit();
                    }
                    catch (Exception exp)
                    {
                        MessageBox.Show(exp.Message, "Error");
                        wordApplication.Quit();
                        return;
                    }
                    string t = fd.SafeFileName;
                    t = t.Split('.')[0];
                    Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(appData, UriKind.Relative));
                    // Создать пакет
                    // (Если файл пакета уже существует, FileMode.Create сначала
                    //  автоматически удалит его, прежде чем создать новый.
                    //  Благодаря оператору using объект package
                    //  закрыт и удален при его отсутствии в области видимости.)
                    using (Package package = Package.Open("C:\\"+t+".pak", FileMode.Create))
                    {
                        PackagePart packagePartDocument = package.CreatePart(partUriDocument, System.Net.Mime.MediaTypeNames.Text.RichText);
    
                        // Скопировать данные в Document Part
                        using (FileStream fileStream = new FileStream(appData, FileMode.Open, FileAccess.Read))
                        {
                            CopyStream(fileStream, packagePartDocument.GetStream());
                        }// end:using(fileStream) - Закрыть fileStream и освободить его ресурсы.
                        package.CreateRelationship(packagePartDocument.Uri, TargetMode.Internal, PackageRelationshipType);
                    }// end:using (Package package) - Закрыть пакет и освободить его ресурсы.
                    MessageBox.Show("Упаковка файла прошла успешно");
                }
            }


    А вот уже где проблема происходит.

    Пользователь указывает zip файл, и программа пытается его закинуть в Package

    /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void read_Click(object sender, RoutedEventArgs e)
            {
                OpenFileDialog fd = new OpenFileDialog();
                fd.Filter = "Архив (*.pak)|*.pak";
                fd.ShowDialog();
                if (fd.FileName.Length > 0)
                {
                    using (Package package = Package.Open(fd.FileName, FileMode.Open, FileAccess.Read))
                    {
                        XpsDocument xpsDoc = new XpsDocument(package);
                        documentViewer1.Document = xpsDoc.GetFixedDocumentSequence();
                    }
                }
            }


    Но вот на моменте

    documentViewer1.Document = xpsDoc.GetFixedDocumentSequence();

    Выдает исключение:Идентификатор XpsDocument URI не определен. Воспользуйтесь конструктором XpsDocument, который принимает параметр URI.

    Что я делаю не так? Подскажите пожалуйста!

    Спасибо заранее за ответы.

    19 июля 2013 г. 7:40