Какой смысл XPS?
Когда я читал книги о WPF, я видел, как авторы упоминают XPS, как будто это было что-то важное. Windows также включает в себя средство просмотра XPS, и я видел, что это указано как "функция" Windows.
Но почему? Какой смысл? Кто это использует? Я понимаю, что XPS, в основном, как PDF, xhtml или ePub (это всего лишь xhtml)... или даже формат Word docx. Многие из этих функций одинаковы среди этих форматов.
Похоже, что он не имеет каких-либо существенных преимуществ по сравнению с любым из этих других форматов. Мне кажется, что xhtml был бы гораздо более полезен, чем XPS, как способ сохранить и загрузить FlowDocuments из RichTextBox. Я просмотрел несколько блогов о конвертации между ними. Большинство или весь богатый текст в Интернете - это (x) html. Помимо этого, я не думаю, что кто-то использует его только для публикации своих документов; PDF является предпочтительным. Похоже, что XPS - это всего лишь случайный формат, который MS сделал и решил нажать. Я вообще люблю МС, но у них есть привычка к подобным вещам. Не удалось ли MS сделать api вместо xhtml? Я бы подумал, что это было бы более полезно во многих ситуациях.
Итак, есть ли смысл использовать XPS, особенно по сравнению с одним из других форматов, о которых я упоминал (или у меня нет)? Вы когда-нибудь использовали XPS в своих программах или иначе?
Ответы
Ответ 1
Как уже указывалось U62, WPF поставляется с элементом управления DocumentViewer, который позволяет просматривать документы XPS. В DocumentViewer также есть некоторые полезные функции, такие как Print, Zoom, FitToPage и т.д. Поэтому вам не нужно реализовывать это или использовать сторонний инструмент.
То, что я только что закончил час назад с помощью XPS и DocumentViewer, было своего рода "предварительным просмотром печати этикеток". Позвольте пользователю выбрать некоторые контакты из списка контактов, нажмите "Предварительный просмотр". Это открывает новое окно XAML, которое содержит элемент управления DocumentViewer и ListBox с выбором разных ярлыков (например, 1 лист с 12 метками [2 столбца, 6 строк], 1 лист с одной меткой, ширина и высота которой могут быть определены пользователем),
Основываясь на выборе пользователей, я создаю документ XPS в макете, выбранном пользователем с адресами выбранных контактов. Если, например, пользователь выбрал 4 контакта и хочет распечатать их на "SingleLabelSheet", я создаю 1 документ XPS с 4 страницами, каждая страница содержит 1 адрес. Затем я показываю XPS в DocumentViewer, и пользователь может печатать ярлыки на нашем принтере этикеток.
Как только я понял, как работает XPS API (по крайней мере, основы), для его запуска нужно всего 2 часа.
Итак, в основном, я вижу XPS как простой в использовании API для отображения FixedDocuments, которые должны создаваться "на лету". Но я лично не собирался сохранять их на свой жесткий диск или каким-то образом изменять их или что бы вы вообще делали с документами.
Ответ 2
Единственное реальное преимущество, о котором я могу думать, это то, что у вас есть контроль для просмотра документов XPS в приложениях WPF. Другие упоминаемые вами форматы означают, что вам придется принести сторонний рендерер (или написать его самостоятельно, если у вас есть год, который нужно сэкономить).
кстати. Я не очень разбираюсь в ePub, но XPS напрямую не сопоставим с XHTML, это больше похоже на PDF, поскольку он предназначен для фиксированной компоновки.
Ответ 3
XPS для WPF похож на WMF на Win32/WinForms, это постоянный формат, позволяющий хранить и печатать собственную графику WPF.
XPS используется для печати из WPF (даже если вы печатаете непосредственно из приложения без сохранения, внутренняя система печати построена на XPS), что бы делать MS:
- Создайте новый формат файла, который точно соответствует тем, что они пытаются сделать
- Создайте 100% совершенный переводчик из WPF в формат, который они не контролируют, как PDF (и надеюсь, что Adobe не сломает все приложения WPF там со следующей версией Acrobat Reader).
Что бы вы сделали?
Сохранение XPS файлов - просто приятный бонус.
Ответ 4
Посмотрите, я могу быть пессимистом на XPS в качестве решения для создания отчетов, но я дал ему понять, что исходная документация трудно понять, с меньшим количеством реальных образцов мира, чем то, что мне бы понравилось. Когда я помещал его в приложение для реального мира, я нашел его разочаровывающим, особенно в LOB-приложениях, которым требуются таблицы, которые охватывают несколько страниц.
С тех пор ситуация может измениться, но как только я начал смотреть на таблицы, которые охватывали несколько страниц, и я хотел, чтобы заголовки столбцов были в верхней части и т.д. Я обнаружил, что API требовал от меня делать то, что я бы назвал чрезмерным обходные пути с ненужной сложностью.
Итак, все изменилось с тех пор (около 8 месяцев назад), но я перешел от XPS к использованию ITextSharp, и это было намного менее болезненно.
Итак, единственное преимущество, которое я бы сказал, как и все остальные, - это встроенный просмотрщик в WPF, - но помимо этого я считаю, что API, возможно, придется "зреть" немного больше, прежде чем я попытаюсь что-то повторить в нем.
Ответ 5
XPS (код с именем "metro" ) был явно разработан как альтернатива Microsoft для PDF и PostScript в Windows Vista. См. Эту старую статью здесь: Microsoft готовит новую спецификацию печати документов
Ответ 6
На самом деле я нашел действительно хорошую причину использования XPS. Я хотел распечатать из нескольких источников, объединить документы и указать дуплекс и сшивание. Наконец, он должен быть напечатан как один документ с дуплексным и сшитым. Мне было трудно это сделать, но обнаружил, что, печатая на XPS (сохраненный на диск), я мог бы выполнить свою задачу с минимальной суетой. Я не нашел другого способа, который был бы таким простым и понятным.
Dim PrintServer As New SysPrint.PrintServer("\\" & My.Computer.Name)
Dim PrintQ As New SysPrint.PrintQueue(PrintServer, "Ricoh Main")
Dim Jobs As SysPrint.PrintJobInfoCollection = PrintQ.GetPrintJobInfoCollection
Dim able As SysPrint.PrintCapabilities = PrintQ.GetPrintCapabilities()
Dim CurrentTicket As SysPrint.PrintTicket = PrintQ.CurrentJobSettings.CurrentPrintTicket
If able.StaplingCapability IsNot Nothing AndAlso able.StaplingCapability.Count > 0 Then
If able.StaplingCapability.Contains(Printing.Stapling.StapleTopLeft) Then
CurrentTicket.Stapling = Printing.Stapling.StapleTopLeft
End If
Else
Debug.Print("no stapling capability")
End If
CurrentTicket.Duplexing = Printing.Duplexing.TwoSidedLongEdge
Dim fiName As String = "S:\Temp\PS\XPS\Test.xps"
Dim TestJob As SysPrint.PrintSystemJobInfo _
= PrintQ.AddJob("Test job", fiName, False)