Общие сведения о печати документов (WPF .NET)
В Microsoft .NET разработчики приложений, использующие Windows Presentation Foundation (WPF), имеют в своем распоряжении широкий набор API для печати и управления печатными системами. Основной частью этой функции является формат файла спецификации XML (XPS) и путь печати XPS.
Сведения о XPS
XPS — это электронный формат документа, формат файла спуля и язык описания страницы. Это открытый формат документа, использующий XML, Открытые соглашения об упаковке и другие отраслевые стандарты для создания кроссплатформенных документов. XPS упрощает процесс создания цифровых документов, общего доступа, печати, просмотра и архивирования. Дополнительную информацию о XPS см. в документах XPS .
Путь печати XPS
Путь печати
- Языки представления документов, такие как формат RTF (Rich Text Format) или формат PDF (Portable Document Format).
- Печать форматов spooler, таких как Метафайл Windows или расширенный метафайл (EMF).
- Языки описания страницы, такие как язык команд принтера или PostScript.
В результате путь печати XPS поддерживает формат XPS от публикации приложения до окончательной обработки в драйвере принтера или устройстве.
Диспетчер печати для документов XPS поддерживает как путь печати XPS, так и путь печати GDI. Путь печати XPS изначально использует спул-файл формата XPS и требует драйвера принтера XPS. Путь печати XPS основан на модели драйвера принтера XPS (XPSDrv).
Преимущества пути печати XPS:
- Поддержка печати WYSIWYG.
- Встроенная поддержка расширенных цветовых профилей, таких как 32 бита на канал, цветовая модель CMYK, именованные цвета, n-чернила, а также прозрачность и градиенты.
- Улучшенная производительность печати— функции и улучшения XPS доступны только для приложений, предназначенных для пути печати XPS.
- Стандартный формат XPS в отрасли.
Для основных сценариев печати простой и интуитивно понятный API доступен со стандартным пользовательским интерфейсом для настройки печати и отправки заданий. В расширенных сценариях API поддерживает настройку пользовательского интерфейса или нет пользовательского интерфейса вообще, синхронную или асинхронную печать, а также возможности пакетной печати. Простые и расширенные параметры обеспечивают поддержку печати в режимах полного или частичного доверия.
XPS разработан с учетом расширяемости, поэтому функции и возможности можно добавлять в XPS модульным способом. Функции расширяемости включают:
- Схема печати, поддерживающая быстрое расширение возможностей устройства. Общедоступная часть схемы регулярно обновляется, чтобы добавить необходимые возможности устройства. Дополнительные сведения см. в разделе Обзор архитектуры.
- Расширяемый конвейер фильтра, используемый драйверами XPSDrv для поддержки прямой и масштабируемой печати документов XPS. Дополнительную информацию см. в драйверах принтера XPSDrv .
Архитектура пути печати
Приложения WPF изначально поддерживают путь печати XPS и могут использовать API печати XPS для печати непосредственно в драйвер XPSDrv. Если в целевой очереди печати операции записи нет драйвера XPSDrv, то методы Write и WriteAsync класса XpsDocumentWriter автоматически преобразуют содержимое из XPS в формат GDI для пути печати GDI.
На следующем рисунке показана подсистема печати и определяются части, предоставляемые корпорацией Майкрософт и независимыми поставщиками программного обеспечения и оборудования.
Базовая печать XPS
WPF имеет API печати, поддерживающий как основные, так и расширенные функции печати. Для тех приложений, которые не требуют обширной настройки печати или доступа к полному набору функций XPS, может быть достаточно базовой поддержки печати. Базовая поддержка печати предоставляется с помощью элемента управления PrintDialog, требующего минимальной конфигурации, знакомого пользовательского интерфейса и поддержки многих функций XPS.
PrintDialog
Элемент управления System.Windows.Controls.PrintDialog предоставляет единый вход для пользовательского интерфейса, конфигурации и отправки заданий на обработку XPS. Чтобы узнать, как создать экземпляр и использовать элемент управления, см. «Как отобразить диалоговое окно печати».
Расширенная печать XPS
Чтобы получить доступ к полному набору функций XPS, используйте расширенный API печати. В этом разделе описаны несколько соответствующих API, включая PrintTicket, PrintCapabilities, PrintServer, PrintQueueи XpsDocumentWriter. Полный список API пути печати XPS см. в пространствах имен System.Windows.Xps и System.Printing.
PrintTicket и PrintCapabilities
Классы PrintTicket и PrintCapabilities являются основой расширенных функций XPS. Оба объекта содержат xml-форматированные структуры функций, ориентированных на печать, которые определяются схемой печати. К ним относятся дуплексная печать, сортировка, двухсторонняя печать и скрепление.
PrintTicket
указывает принтеру, как обработать задание печати. Класс PrintCapabilities
определяет возможности принтера. Запросив возможности принтера, можно создать PrintTicket
, который максимально использует все поддерживаемые функции принтера. Аналогичным образом можно избежать неподдерживаемых функций.
В следующем примере осуществляется запрос на PrintCapabilities
принтера и создается PrintTicket
с использованием кода.
/// <summary>
/// Returns a print ticket, which is a set of instructions telling a printer how
/// to set its various features, such as duplexing, collating, and stapling.
/// </summary>
/// <param name="printQueue">The print queue to print to.</param>
/// <returns>A print ticket.</returns>
public static PrintTicket GetPrintTicket(PrintQueue printQueue)
{
PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();
// Get a default print ticket from printer.
PrintTicket printTicket = printQueue.DefaultPrintTicket;
// Modify the print ticket.
if (printCapabilites.CollationCapability.Contains(Collation.Collated))
printTicket.Collation = Collation.Collated;
if (printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge))
printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
printTicket.Stapling = Stapling.StapleDualLeft;
// Returns a print ticket, which is a set of instructions telling a printer how
// to set its various features, such as duplexing, collating, and stapling.
return printTicket;
}
''' <summary>
''' Returns a print ticket, which is a set of instructions telling a printer how
''' to set its various features, such as duplexing, collating, and stapling.
''' </summary>
''' <param name="printQueue">The print queue to print to.</param>
''' <returns>A print ticket.</returns>
Public Shared Function GetPrintTicket(printQueue As PrintQueue) As PrintTicket
Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()
' Get a default print ticket from printer.
Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket
' Modify the print ticket.
If printCapabilites.CollationCapability.Contains(Collation.Collated) Then
printTicket.Collation = Collation.Collated
End If
If printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge) Then
printTicket.Duplexing = Duplexing.TwoSidedLongEdge
End If
If printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft) Then
printTicket.Stapling = Stapling.StapleDualLeft
End If
' Returns a print ticket, which is a set of instructions telling a printer how
' to set its various features, such as duplexing, collating, and stapling.
Return printTicket
End Function
PrintServer и PrintQueue
Класс PrintServer представляет сетевой сервер печати, а класс PrintQueue представляет принтер и очередь выходных заданий, связанную с ней. Вместе эти API поддерживают расширенное управление заданиями печати для сервера. Для управления PrintQueue
используется PrintServer
или один из производных классов.
В следующем примере создается LocalPrintServer и осуществляется доступ к PrintQueueCollection локального компьютера, используя код.
/// <summary>
/// Return a collection of print queues, which individually hold the features or states
/// of a printer as well as common properties for all print queues.
/// </summary>
/// <returns>A collection of print queues.</returns>
public static PrintQueueCollection GetPrintQueues()
{
// Create a LocalPrintServer instance, which represents
// the print server for the local computer.
LocalPrintServer localPrintServer = new();
// Get the default print queue on the local computer.
//PrintQueue printQueue = localPrintServer.DefaultPrintQueue;
// Get all print queues on the local computer.
PrintQueueCollection printQueueCollection = localPrintServer.GetPrintQueues();
// Return a collection of print queues, which individually hold the features or states
// of a printer as well as common properties for all print queues.
return printQueueCollection;
}
''' <summary>
''' Return a collection of print queues, which individually hold the features or states
''' of a printer as well as common properties for all print queues.
''' </summary>
''' <returns>A collection of print queues.</returns>
Public Shared Function GetPrintQueues() As PrintQueueCollection
' Create a LocalPrintServer instance, which represents
' the print server for the local computer.
Dim localPrintServer As LocalPrintServer = New LocalPrintServer()
' Get the default print queue on the local computer.
'Dim printQueue As PrintQueue = localPrintServer.DefaultPrintQueue
' Get all print queues on the local computer.
Dim printQueueCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()
' Return a collection of print queues, which individually hold the features or states
' of a printer as well as common properties for all print queues.
Return printQueueCollection
End Function
XpsDocumentWriter
XpsDocumentWriterс множеством методов Write и WriteAsync используется для добавления документов XPS в PrintQueue. Например, метод Write(FixedDocumentSequence, PrintTicket) используется для синхронного добавления в очередь документа XPS с печатным билетом. Метод WriteAsync(FixedDocumentSequence, PrintTicket) используется для асинхронного добавления документа XPS с билетом печати в очередь.
В следующем примере создается XpsDocumentWriter
, и документы XPS добавляются как синхронно, так и асинхронно в PrintQueue
с помощью кода.
/// <summary>
/// Asynchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocumentAsync(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
// Create an XpsDocumentWriter object for the print queue.
XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);
// Open the selected document.
XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);
// Get a fixed document sequence for the selected document.
FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
// Asynchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket);
}
/// <summary>
/// Synchronously, add the XPS document together with a print ticket to the print queue.
/// </summary>
/// <param name="xpsFilePath">Path to source XPS file.</param>
/// <param name="printQueue">The print queue to print to.</param>
/// <param name="printTicket">The print ticket for the selected print queue.</param>
public static void PrintXpsDocument(string xpsFilePath, PrintQueue printQueue, PrintTicket printTicket)
{
// Create an XpsDocumentWriter object for the print queue.
XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);
// Open the selected document.
XpsDocument xpsDocument = new(xpsFilePath, FileAccess.Read);
// Get a fixed document sequence for the selected document.
FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
// Synchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.Write(fixedDocSeq, printTicket);
}
''' <summary>
''' Asynchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocumentAsync(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)
' Create an XpsDocumentWriter object for the print queue.
Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)
' Open the selected document.
Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)
' Get a fixed document sequence for the selected document.
Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()
' Asynchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.WriteAsync(fixedDocSeq, printTicket)
End Sub
''' <summary>
''' Synchronously, add the XPS document together with a print ticket to the print queue.
''' </summary>
''' <param name="xpsFilePath">Path to source XPS file.</param>
''' <param name="printQueue">The print queue to print to.</param>
''' <param name="printTicket">The print ticket for the selected print queue.</param>
Public Shared Sub PrintXpsDocument(xpsFilePath As String, printQueue As PrintQueue, printTicket As PrintTicket)
' Create an XpsDocumentWriter object for the print queue.
Dim xpsDocumentWriter As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue)
' Open the selected document.
Dim xpsDocument As XpsDocument = New XpsDocument(xpsFilePath, FileAccess.Read)
' Get a fixed document sequence for the selected document.
Dim fixedDocSeq As FixedDocumentSequence = xpsDocument.GetFixedDocumentSequence()
' Synchronously, add the XPS document together with a print ticket to the print queue.
xpsDocumentWriter.Write(fixedDocSeq, printTicket)
End Sub
Путь печати GDI
Хотя приложения WPF изначально поддерживают путь печати XPS, они также могут выводить путь печати GDI, вызвав один из методов Write или WriteAsync класса XpsDocumentWriter и выбрав очередь печати для принтера, отличного от XpsDrv.
Для приложений, не требующих функций XPS или поддержки, текущий путь печати GDI остается неизменным. Дополнительные сведения о пути печати GDI и различных параметрах преобразования XPS см. в преобразователе документов Microsoft XPS (MXDC) и драйверах принтера XPSDrv.
Модель драйвера XPSDrv
Путь печати XPS улучшает эффективность spooler с помощью XPS в качестве собственного формата спула печати при печати на принтере или драйвере с поддержкой XPS. В отличие от EMF, который представляет выходные данные приложения в виде серии вызовов в GDI для служб отрисовки, формат временного хранилища XPS представляет документ. Таким образом, если файлы spool XPS передаются в драйвер принтера на основе XPS, они не требуют дальнейшей интерпретации, так как драйверы работают непосредственно с данными в этом формате. Эта возможность устраняет преобразования данных и цветового пространства, необходимые для файлов EMF и драйверов печати на основе GDI.
Упрощенный процесс спулинга устраняет необходимость создания промежуточного файла спулинга, такого как файл данных EMF, прежде чем документ будет отправлен в печать. При уменьшении размеров файлов спул в системе XPS можно снизить сетевой трафик и повысить производительность печати. По сравнению с эквивалентами EMF размер файлов XPS обычно уменьшается при использовании пути печати XPS. Уменьшение размера файла spool выполняется с помощью нескольких механизмов:
- подмножество шрифта, которое хранит только символы, используемые в документе в файле XPS.
- расширенная поддержка графики, которая изначально поддерживает прозрачность и градиентные примитивы, чтобы избежать растеризации содержимого XPS.
- идентификация общих ресурсов, например изображение корпоративного логотипа, используемого несколько раз в документе. Общие ресурсы обрабатываются как общие ресурсы и загружаются только один раз.
- сжатие ZIP, которое используется во всех документах XPS.
Размер файла спуль XPS может не уменьшаться, если векторный графический объект является очень сложным, многослойным или неэффективно записанным. В отличие от файлов spool GDI, XPS-файлы внедряют встроенные шрифты и компьютерные шрифты для отображения на экране, хотя оба типа шрифтов подают в виде подмножеств, а драйверы принтеров могут удалять встроенные шрифты перед передачей файла на печать.
Подсказка
Вы также можете распечатать файлы XPS с помощью методов PrintQueue.AddJob. Дополнительные сведения см. в разделе Печать файлов XPS.
См. также
.NET Desktop feedback