2010-05-08 7 views
6

ich eine WPF-Flowdocument in das Dateisystem speichere, diesen Code verwenden und einen Dateinamen mit einer xps Erweiterung:Öffnen von FlowDocument als XPS-Dokument mit XPS Viewer?

// 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); 
} 

Meine App das Dokument mit diesem Code nachladen:

// 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); 
} 

jedoch Der XPS Viewer, der mit Windows 7 ausgeliefert wird, kann die Dateien nicht öffnen. Die gespeicherten XPS-Dateien zeigen das XPS-Symbol an, aber wenn ich einen Doppelklick anklicke, kann der XPS-Viewer den XPS-Viewer nicht öffnen. Die Fehlermeldung lautet "Der XPS Viewer kann dieses Dokument nicht öffnen."

Haben Sie eine Idee, was ich mit meinem XPS-Dokument machen muss, damit es vom XPS Viewer geöffnet werden kann? Danke für Ihre Hilfe.

+3

XPS-Dokument ist nicht dasselbe wie XAML-Paket. –

Antwort

6

Wie Michael kommentierte, ist ein FlowDocument nicht dasselbe wie ein XPS-Dokument. FlowDocuments sind für das On-Screen-Lesen gedacht und werden automatisch wieder geschlossen, wenn die Fenstergröße geändert wird, während das Layout eines XPS-Dokuments festgelegt ist.

Die Klasse, die Sie zum Schreiben von XPS-Dokumenten benötigen, heißt XpsDocument. Sie müssen auf die ReachFramework.dll-Assembly verweisen, um sie zu verwenden. Hier ein kurzes Beispiel für ein Verfahren, das ein Flowdocument zu einem XPS-Dokument speichert:

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 (einschließlich, wie Kopf- und Fußzeilen hinzuzufügen und rescale Ausgabe).