2010-05-08 11 views
6

jestem zapisywania WPF FlowDocument do systemu plików, wykorzystując ten kod i nazwę pliku z rozszerzeniem XPS:Otwieranie dokumentu Flow zapisanego jako dokument XPS z przeglądarką 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); 
} 

Moja aplikacja może przeładować dokument przy użyciu tego kodu:

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

jednak Przeglądarka XPS dostarczana z systemem Windows 7 nie może otworzyć plików. Zapisane pliki XPS wyświetlają ikonę XPS, ale kiedy dwukrotnie kliknę jeden, przeglądarka XPS nie otworzy go. Komunikat o błędzie brzmi: "Przeglądarka XPS nie może otworzyć tego dokumentu."

Jakieś pojęcie, co muszę zrobić z moim dokumentem XPS, aby można go było otworzyć za pomocą XPS Viewer? Dzięki za pomoc.

+3

Dokument XPS to nie to samo, co pakiet XAML. –

Odpowiedz

6

Jak Michael skomentował, FlowDocument to nie to samo, co dokument XPS. Dokumenty FlowDocuments są przeznaczone do odczytu na ekranie i będą automatycznie odnawiać się po zmianie rozmiaru okna, a układ dokumentu XPS zostanie naprawiony.

Klasa potrzebna do pisania dokumentów XPS nosi nazwę XpsDocument. Musisz odwołać się do zestawu ReachFramework.dll, aby go użyć. Oto krótki przykład sposobu, który zbawia FlowDocument do dokumentu 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 (w tym sposobu dodawania nagłówków i stopek oraz przeskalować wyjście).

Powiązane problemy