2010-05-08 125 views
6

我節省了WPF的FlowDocument文件系統,使用此代碼,並與XPS擴展名的文件名:使用XPS查看器打開FlowDocument作爲XPS文檔保存?

// Save FlowDocument to file system as XPS document 
using (var fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
{ 
    var textRange = new TextRange(m_Text.ContentStart, m_Text.ContentEnd); 
    textRange.Save(fs, DataFormats.XamlPackage); 
} 

我的應用程序可以使用此代碼重新加載文件:

// Load file 
using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
{ 
    m_Text = new FlowDocument(); 
    var textRange = new TextRange(m_Text.ContentStart, m_Text.ContentEnd); 
    textRange.Load(fs, DataFormats.XamlPackage); 
} 

然而, Windows 7附帶的XPS Viewer無法打開文件。保存的XPS文件顯示XPS圖標,但是當我雙擊它時,XPS查看器無法打開它。錯誤消息顯示「XPS查看器無法打開此文檔。」

任何想法,我需要做我的XPS文檔,使其可以通過XPS查看器打開?謝謝你的幫助。

+3

XPS Document與XAML包不一樣。 – 2010-06-23 13:27:20

回答

6

正如Michael所評論的,FlowDocument與XPS文檔不同。 FlowDocuments用於在屏幕上閱讀,並且在更改窗口大小時自動重新排列,而XPS文檔的佈局是固定的。

您需要編寫XPS文檔的類稱爲XpsDocument。您需要引用ReachFramework.dll程序集來使用它。下面是一個用於保存的FlowDocument到XPS文檔的方法的簡短的例子:

using System.IO; 
using System.IO.Packaging; 
using System.Windows.Documents; 
using System.Windows.Xps.Packaging; 
using System.Windows.Xps.Serialization; 

namespace XpsConversion 
{ 
    public static class FlowToXps 
    { 
     public static void SaveAsXps(string path, FlowDocument document) 
     { 
      using (Package package = Package.Open(path, FileMode.Create)) 
      { 
       using (var xpsDoc = new XpsDocument(
        package, System.IO.Packaging.CompressionOption.Maximum)) 
       { 
        var xpsSm = new XpsSerializationManager(
         new XpsPackagingPolicy(xpsDoc), false); 
        DocumentPaginator dp = 
         ((IDocumentPaginatorSource)document).DocumentPaginator; 
        xpsSm.SaveAsXaml(dp); 
       } 
      } 
     } 
    } 
}

Feng Yuan has a larger example on his blog(包括如何添加頁眉和頁腳和重新調整輸出)。