6

このコードと拡張子 xps の fileName を使用して、WPF FlowDocument をファイル システムに保存しています。

// 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 アイコンが表示されますが、1 つをダブルクリックすると、XPS ビューアーで開くことができません。エラー メッセージには、「XPS Viewer はこのドキュメントを開けません」と表示されます。

XPS Viewer で開くことができるようにするには、XPS ドキュメントに対して何をする必要がありますか? ご協力いただきありがとうございます。

4

1 に答える 1

8

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 のブログに、より大きな例があります(ヘッダーとフッターを追加し、出力を再スケーリングする方法を含む)。

于 2010-06-24T13:20:12.597 に答える