2010-02-03 4 views
15

Когда я читал книги о WPF, я видел, как авторы упоминают XPS, как будто это было что-то важное. Windows также включает в себя средство просмотра XPS, и я видел, что это указано как «функция» Windows.Какой смысл XPS?

Но почему? В чем смысл? Кто это использует? Я понимаю, что XPS, в основном, как PDF, xhtml или ePub (это просто xhtml) ... или даже формат слова Docx. Многие из этих функций одинаковы среди этих форматов.

Он не имеет каких-либо существенных преимуществ по сравнению с любым из этих других форматов. Мне кажется, что xhtml был бы гораздо более полезен, чем XPS, как способ сохранить и загрузить FlowDocuments из RichTextBox. Я просмотрел несколько блогов о конвертации между ними. Большинство или весь богатый текст в Интернете - это (x) html. Помимо этого, я не думаю, что кто-то использует его только для публикации своих документов; PDF является предпочтительным. Похоже, что XPS - это всего лишь случайный формат, который MS сделал и решил нажать. Я вообще люблю МС, но у них есть привычка к подобным вещам. Не удалось ли MS сделать api вместо xhtml? Я бы подумал, что это было бы более полезно во многих ситуациях.

Итак, есть ли смысл использовать XPS, в частности, по сравнению с одним из других форматов, о которых я упоминал (или у меня нет)? Вы когда-нибудь использовали XPS в своих программах или иначе?

ответ

8

Как уже говорилось в 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, которые должны генерироваться «на лету». Но я лично не собирался сохранять их на жесткий диск или каким-то образом изменять их или что бы вы вообще делали с документами.

3

Единственное фактическое преимущество, о котором я могу думать, это то, что у вас есть контроль для просмотра документов XPS в приложениях WPF. Другие упоминаемые вами форматы означают, что вам придется принести сторонний рендерер (или написать его самостоятельно, если у вас есть год, который нужно сэкономить).

кстати. Я не очень разбираюсь в ePub, но XPS напрямую не сопоставим с XHTML, это больше похоже на PDF, поскольку он предназначен для фиксированной компоновки.

3

XPS to WPF похож на WMF на Win32/WinForms, это постоянный формат, позволяющий хранить и печатать собственную графику WPF.

XPS используется для печати с WPF (даже при печати непосредственно из приложения без сохранения внутренней системы печати построена на XPS), так что должно MS сделать:

  1. Создать новый формат файла, точно вписываются в то, что они пытаются сделать
  2. Создайте 100% -ный совершенный переводчик из WPF в формат, который они не контролируют, как PDF (и, надеюсь, Adobe не разбивает все приложения WPF там со следующей версией Acrobat Reader).

Что вы должны сделать?

Сохранение файлов XPS - просто приятный бонус.

+0

Я бы попытался заставить его работать с существующими вещами, которые люди фактически используют. –

+0

Следует, наверное, упомянуть, что XPS не ограничивается только WPF, но может также косвенно использоваться с Win32 или WinForms. Windows XP и более поздние версии устанавливают по умолчанию XPS-принтер, который можно использовать для создания документов XPS. – stakx

3

Посмотрите, я могу быть пессимистом на XPS в качестве решения для создания отчетов, но я дал ему понять, что исходную документацию трудно понять, с меньшим количеством реальных образцов мира, чем то, что мне бы хотелось. Когда я помещал его в приложение для реального мира, я нашел его разочаровывающим, особенно в LOB-приложениях, которым требуются таблицы, которые охватывают несколько страниц.

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

Итак, все изменилось с тех пор (около 8 месяцев назад), но я перешел от XPS к использованию ITextSharp, и это было намного менее болезненно.

Таким образом, единственное преимущество, которое я бы сказал, как и все остальные, - это встроенный просмотрщик в WPF, - но помимо этого я считаю, что API, возможно, придется «зреть» немного больше, прежде чем я попытаюсь что-то повторить в нем.

1

На самом деле я нашел по-настоящему прекрасную причину использования XPS. Я хотел распечатать из нескольких источников, merge documents и указать дуплекс и сшивание. Наконец, он должен быть напечатан как один документ с дуплексным и сшитым. Мне было трудно это сделать, но обнаружил, что, печатая на 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) 
Смежные вопросы