Типы документов

73

Документы в WPF делятся на две крупных категории:

Фиксированные документы

К этой категории относятся набранные документы, пригодные к печати. Расположение всего содержимого фиксировано (например, нельзя изменить способ разрыва строк и переноса слов). Фиксированные документы можно читать с монитора, но в первую очередь они предназначены для печати на принтере. В принципе они эквивалентны PDF-файлам Adobe. В WPF имеется один тип фиксированных документов, в котором используется стандарт Microsoft XPS (XML Paper Specification — XML-спецификация печатных документов).

Потоковые документы

Это документы, предназначенные для просмотра на экране монитора. Как и фиксированные документы, потоковые документы поддерживают расширенную компоновку. Однако WPF может оптимизировать потоковый документ на основе указанного способа просмотра документа: динамически компоновать содержимое на основе такой информации, как размеры окна просмотра, разрешение экрана и т.д.

В принципе потоковые документы в основном используются для тех же целей, что и документы HTML, но обладают более совершенными возможностями компоновки текста.

Понятно, что потоковые документы более важны для создания приложений, а фиксированные — для создания документов, которые нужно распечатывать без изменений (например, форм и публикаций).

WPF обеспечивает поддержку обоих видов документов посредством различных контейнеров. Элементы DocumentViewer позволяют выводить фиксированные документы в окне WPF, a FlowDocumentReader, FlowDocumentPageViewer и FlowDocumentScrollViewer предоставляют разные способы отображения потоковых документов. Каждый из этих контейнеров доступен только для чтения. Однако в составе WPF имеются API для программного создания фиксированных документов, а элемент RichTextBox позволяет пользователям редактировать потоковое содержимое.

Потоковые документы

В потоковом документе содержимое адаптируется к содержащему его контейнеру. Потоковое содержимое ориентировано на экранный просмотр и лишено многих недостатков простых HTML-документов.

Обычно HTML-содержимое использует потоковую компоновку для заполнения окна браузера. (WPF упорядочивает элементы точно так же, если используется WrapPanel.) Такой подход является очень гибким, но он годится лишь для ограниченного набора размеров окон. Если развернуть окно на весь экран монитора с высоким разрешением (или, что еще хуже, широкоформатного монитора), получатся длинные неудобочитаемые строки. Эта проблема демонстрируется на рисунке ниже на примере одной из веб-страниц Wikipedia:

Длинные строки в потоковом содержимом

На многих сайтах с этой проблемой справляются с помощью какой-либо фиксированной компоновки, когда содержимое помещается в узкие колонки. (В WPF это тоже можно сделать, поместив содержимое в колонку в контейнере Grid и задав свойство ColumnDefinition.MaxWidth.) Это действительно повышает удобство чтения содержимого, но в больших окнах появляется пустое место.

Для содержимого потокового документа в WPF добавлены усовершенствования этих современных подходов: лучший механизм разбиения на страницы, вывод в несколько колонок, более разумные алгоритмы переноса слов и обтекания текста, а также предпочтительные режимы отображения, выбираемые пользователем. В результате пользователю предоставляется более удобная среда для чтения больших объемов содержимого.

Фиксированные документы

Потоковые документы позволяют динамически компоновать сложное текстовое содержимое таким способом, который удобен для чтения на экране. Фиксированные документы — документы на основе XPS — гораздо менее гибки. Это документы, пригодные для печати, которые можно распространять и печатать на любом выводном устройстве в полном соответствии с первоначальным источником. В них используется точная, фиксированная компоновка, поддерживается внедрение шрифтов и исключается случайное изменение компоновки.

XPS не просто часть WPF. Это стандарт, тесно интегрированный в системы Windows Vista и Windows 7. Обе версии Windows содержат драйвер печати, который может создавать документы XPS (в любом приложении) и средство просмотра для их отображения.

Эти две части похожи на Adobe Acrobat, позволяя пользователям создавать и просматривать электронные документы, пригодные для печати, и добавлять аннотации. Кроме того, Microsoft Office 2007 позволяет сохранять документы в форматах XPS и PDF.

XPS-файлы на самом деле являются ZIP-файлами, содержащими библиотеку сжатых файлов: шрифтов, изображений и текстового содержимого для отдельных страниц (в том числе ХМL-разметку, похожую на XAML). Чтобы увидеть внутреннее содержимое XPS-файла, достаточно поменять его расширение на .zip и открыть его.

Вывести на экран документ XPS не труднее, чем потоковый документ. Единственным отличием является средство просмотра. Вместо использования одного из контейнеров FlowDocument (FlowDocumentReader, FlowDocumentScrollViewer или FlowDocumentPageViewer), применяется именованный DocumentViewer, в котором имеются элементы управления для поиска и изменения масштаба:

Фиксированный документ

Кроме того, он предлагает такой же набор свойств, методов и команд, как и контейнеры FlowDocument.

Вот код, который позволяет загрузить XPS-файл в память и вывести его в контейнере DocumentViewer:

XpsDocument doc = new XpsDocument("filename.xps", FileAccess.Read);
docViewer.Document = doc.GetFixedDocumentSequence();
doc.Close();

В классе XpsDocument нет ничего особенного. Он предоставляет нам метод GetFixedDocumentSequence(), который возвращает ссылку на корень документа со всем его содержимым. Он также содержит метод AddFixedDocument() для создания последовательности документов в новом документе и два метода для управления цифровыми подписями (SignDigitally() и RemoveSignature()).

XPS-документы тесно связаны с концепцией печати. Отдельный XPS-документ имеет фиксированный размер страницы и компонует свой текст так, чтобы он занял доступное место. Как и при работе с потоковыми документами, имеется непосредственная поддержка печати фиксированных документов с помощью команды ApplicationCommands.Print.

Пройди тесты
Лучший чат для C# программистов