wpf - 使用 XPS 查看器打开保存为 XPS 文档的 FlowDocument?

标签 wpf xps flowdocument

我正在将 WPF 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 查看器无法打开这些文件。保存的 XPS 文件显示 XPS 图标,但当我双击一个文件时,XPS 查看器无法打开它。错误消息显示“XPS 查看器无法打开此文档。”

知道我需要对 XPS 文档执行什么操作才能使其可由 XPS 查看器打开吗?感谢您的帮助。

最佳答案

正如 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 (包括如何添加页眉和页脚以及重新缩放输出)。

关于wpf - 使用 XPS 查看器打开保存为 XPS 文档的 FlowDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794532/

相关文章:

c# - 在 .NET 4.7 中使用长路径时出现 DirectoryNotFoundException

c# - 为了鼠标事件,如何将 Popup 包含在它的父控件中?

c# - 拦截 PrintDialog 到 XPS Document Writer

c - 在 Xilinx Platform Studio 中映射端口并用 C 读取它

c# - 使用 UIElement 将 FlowDocument 导出为 rtf

wpf - 在样式中绑定(bind)命令

wpf - 与 UpdateSourceTrigger==LostFocus 绑定(bind)不会触发菜单或工具栏交互

.net - 从wpf打印的xps文档-太短,纸张尺寸奇怪吗?

c# - 如何通过编程调整流文档中的段落间距

c# - 打印到新页面的转义序列