2010-05-08 78 views
6

me ahorro un WPF FlowDocument al sistema de archivos, el uso de este código y un nombre de archivo con una extensión XPS:¿Abrir FlowDocument guardado como documento XPS con 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); 
} 

Mi aplicación puede volver a cargar el documento utilizando este código:

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

Sin embargo, el XPS Viewer que se envía con Windows 7 no puede abrir los archivos. Los archivos XPS guardados muestran el icono XPS, pero cuando hago doble clic en uno, el visor XPS no puede abrirlo. El mensaje de error dice "El visor de XPS no puede abrir este documento".

¿Alguna idea de lo que tengo que hacer con mi documento XPS para que pueda abrirlo con XPS Viewer? Gracias por tu ayuda.

+3

El documento XPS no es lo mismo que el paquete XAML. –

Respuesta

6

Como comentó Michael, un FlowDocument no es lo mismo que un documento XPS. Los FlowDocuments están pensados ​​para la lectura en pantalla y se redistribuirán automáticamente cuando se cambie el tamaño de la ventana, mientras se arregla el diseño de un documento XPS.

La clase que necesita para escribir documentos XPS se llama XpsDocument. Debe hacer referencia al ensamblado ReachFramework.dll para usarlo. He aquí un breve ejemplo de un método que ahorra una FlowDocument a un documento 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 (incluyendo cómo añadir cabeceras y pies de página y reescalar salida).

Cuestiones relacionadas