Открытие FlowDocument, сохраненного как документ XPS со средством просмотра XPS?

Я сохраняю 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);
}

Однако Средство просмотра XPS, которое поставлется с Windows 7, не может открыть файлы. Сохраненные файлы XPS отображают значок XPS, но когда я дважды щелкаю один, средству просмотра XPS не удается открыть его. Чтения сообщения об ошибке "Средство просмотра XPS не могут открыть этот документ".

Какая-либо идея, что я должен сделать к своему документу XPS для создания этого открываемым Средством просмотра XPS?Спасибо за помощь.

6
задан David Veeneman 8 May 2010 в 15:00
поделиться

1 ответ

Как прокомментировал Майкл, 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);
                }
            }
        }
    }
}

У Фэн Юаня есть более крупный пример в своем блоге (включая то, как добавлять верхние и нижние колонтитулы и масштабировать вывод).

7
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: