Общие сведения о печати
С Microsoft .NET Framework разработчики приложений с помощью Windows Presentation Foundation (WPF) имеют новый богатый набор для печати и APIs системного управления печатью. С Windows Vista некоторые из этих системных возможностей печати также доступны для разработчиков, создающих приложения Windows Forms, и разработчиков, использующих неуправляемый код. Основой этих новых функциональных возможности является новый формат файла XML Paper Specification (XPS) и способ печати XPS.
В этом разделе содержатся следующие подразделы.
Об инструкции XPS
Путь печати XPS
Путь печати GDI
Драйверная модель XPSDrv
Связанные разделы
Об инструкции XPS
XPS является форматом электронного документа, форматом файла спулинга и языком описания страниц. Это формат открытого документа, в рамках которого для создания не зависящих от платформы документов используются отраслевые стандарты XML, Open Packaging Conventions (OPC) и т. д. XPS упрощает процедуру создания, совместного использования, печати, просмотра и архивирования цифровых документов. Дополнительные сведения о XPS содержатся на Веб-узле XPS.
Несколько методов печати содержимого на основе XPS с использованием WPF показаны в разделе Как печатать файлы XPS программным способом. Ссылки на данные примеры могут пригодиться во время просмотра содержимого этого раздела. (Разработчикам неуправляемого кода следует смотреть справку для escape-функции вызова преобразователя документов XPS (Майкрософт). Разработчикам Windows Forms необходимо использовать API в пространстве имен System.Drawing.Printing, которое не поддерживает полный путь печати XPS, но поддерживает гибридный путь печати из GDI в XPS. См. Архитектура способов печати ниже.)
Процесс печати с использованием XPS
Способ печати XML Paper Specification (XPS) является новым средством Windows, которое переопределяет, как печать обрабатывается в приложениях Windows. Поскольку XPS может заменить языка презентации документа (например RTF), диспетчером очереди печати (например WMF) и языком описания страницы (например PCL или PostScript); новый способ печати поддерживает формат XPS из публикации приложения для последней обработки в драйвере принтера или устройства.
Способ печати XPS построен с использованием модели драйвера принтера XPS (XPSDrv), которая предоставляет несколько преимуществ для разработчиков, например печать "what you see is what you get" (WYSIWYG), улучшенную поддержку цвета и значительно улучшенную производительность печати. (Дополнительные сведения о XPSDrv см. в статье Windows Driver Development Kit.)
Операция диспетчера очереди печати для документов XPS является, по существу, такой же, как и в предыдущих версиях Windows. Однако она была усовершенствована для поддержки способа печати XPS в дополнение к существующему способу печати GDI. Новый способ печати использует файл спуллинга XPS. Во то время как драйвер принтера пользовательского режима, написанный для предыдущих версий Windows, будет продолжать работать, драйвер принтера XPS (XPSDrv) необходим, чтобы использовать способ печати XPS.
Преимущества способа печати XPS являются существенными и включают:
Поддержка печати WYSIWYG
Встроенная поддержка дополнительных цветовых профилей, включая 32 битный канал (bpc), CMYK, именованные цвета, n-inks и собственную поддержку прозрачности и градиентов.
Улучшенная производительность печати для .NET Framework и приложений на базе Win32.
Отраслевой стандартный формат XPS.
Для основных скриптов печати доступен простой и понятный API с одной точкой входа для пользовательского интерфейса, конфигурацией и отправкой задания. Для расширенных скриптов добавлена дополнительная поддержка настройки user interface (UI) (или поддержка работы вообще без UI), синхронной или асинхронной печати и возможности печати пакетов. Оба параметра обеспечивают поддержку печати в режиме полного или частичного доверия.
Формат XPS был разработан с целью расширения. С помощью расширения среды .NET Framework, функции и возможности могут быть добавлены к XPS модульным способом. Функции расширения включают:
Схема печати. Общая схема обновляется регулярно и позволяет быстро расширять возможности устройства. (См. PrintTicket и PrintCapabilities ниже.)
Расширенный фильтр-конвейер. Фильтр-конвейер драйвера принтера XPS (XPSDrv) был разработан для печати исходных и масштабируемых документов XPS. (Просмотрите содержание "XPSDrv" в статье Windows Driver Development Kit.)
Архитектура способа печати
В то время как приложения Win32 и .NET Framework поддерживают XPS, приложения Win32 и Windows Forms используют GDI для преобразования XPS, чтобы создать форматированное содержимое XPS для драйвера принтера XPS (XPSDrv). Эти приложения не являются необходимыми для использования способа печати XPS и могут продолжать использовать печать на базе Enhanced Metafile (EMF). Однако большинство возможностей и улучшений XPS доступны только для приложений, которые используют способ печати XPS.
Чтобы включить использование принтеров на основе XPSDrv в приложениях Win32 и Windows Forms, драйвер принтера XPS (XPSDrv) поддерживает преобразование GDI в формат XPS. Модель XPSDrv также обеспечивает преобразование XPS в формат GDI, позволяющий приложениям Win32 печатать документы XPS. Для приложений WPF преобразование XPS в формат GDI выполняется автоматически методами Write и WriteAsync класса XpsDocumentWriter каждый раз, когда у целевой очереди печати операции записи отсутствует драйвер XPSDrv. (Приложения Windows Forms не могут печатать документы XPS.)
На следующем рисунке изображена подсистема печати и определены части, предоставляемые Microsoft, и части ,определенные поставщиками программного обеспечения и оборудования.
Базовая печать XPS
WPF определяет основные и дополнительные API. Для этих приложений, которые не требуют расширенной настройки печати или доступа к полному набору возможностей XPS, доступна базовая поддержка печати. Базовая поддержка печати предоставляется с помощью элемента управления диалогового окна печати, который требует минимальной конфигурации и возможностей UI. Многие возможности XPS доступны с помощью этой упрощенной модели печати.
PrintDialog
Элемент управления System.Windows.Controls.PrintDialog обеспечивает одну точку входа для UI, конфигурацию и отправку задания XPS. Сведения о том, как создать экземпляр и использовать элемент управления, см. в разделе Практическое руководство. Вызов диалогового окна печати.
Дополнительная печать XPS
Для доступа к полному набору возможностей XPS необходимо использовать дополнительную печать API. Несколько соответствующих API более подробно описаны ниже. Полный список XPS способов печати APIs, см. по ссылкам пространства имен System.Windows.Xps и System.Printing.
PrintTicket и PrintCapabilities
Классы PrintTicket и PrintCapabilities являются основой дополнительных возможностей XPS. Оба типа объектов представляют собой форматируемые XML структуры возможностей печати, например сортировки, двусторонней печати, сшивания и т. д. Эти структуры определяются схемой печати. PrintTicket инструктирует принтер о способе обработки задания печати. Класс PrintCapabilities определяет возможности принтера. Запрашивая возможности принтера, PrintTicket может быть создан, используя полное преимущества поддерживаемых возможностей принтера. Аналогичным образом можно избежать неподдерживаемых функций.
В следующем примере демонстрируется, как запросить объект PrintCapabilities принтера и создать объект PrintTicket с помощью кода.
' ---------------------- GetPrintTicketFromPrinter -----------------------
''' <summary>
''' Returns a PrintTicket based on the current default printer.</summary>
''' <returns>
''' A PrintTicket for the current local default printer.</returns>
Private Function GetPrintTicketFromPrinter() As PrintTicket
Dim printQueue As PrintQueue = Nothing
Dim localPrintServer As New LocalPrintServer()
' Retrieving collection of local printer on user machine
Dim localPrinterCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()
Dim localPrinterEnumerator As System.Collections.IEnumerator = localPrinterCollection.GetEnumerator()
If localPrinterEnumerator.MoveNext() Then
' Get PrintQueue from first available printer
printQueue = CType(localPrinterEnumerator.Current, PrintQueue)
Else
' No printer exist, return null PrintTicket
Return Nothing
End If
' Get default PrintTicket from printer
Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket
Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()
' Modify PrintTicket
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
Return printTicket
End Function ' end:GetPrintTicketFromPrinter()
// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
/// Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
/// A PrintTicket for the current local default printer.</returns>
private PrintTicket GetPrintTicketFromPrinter()
{
PrintQueue printQueue = null;
LocalPrintServer localPrintServer = new LocalPrintServer();
// Retrieving collection of local printer on user machine
PrintQueueCollection localPrinterCollection =
localPrintServer.GetPrintQueues();
System.Collections.IEnumerator localPrinterEnumerator =
localPrinterCollection.GetEnumerator();
if (localPrinterEnumerator.MoveNext())
{
// Get PrintQueue from first available printer
printQueue = (PrintQueue)localPrinterEnumerator.Current;
}
else
{
// No printer exist, return null PrintTicket
return null;
}
// Get default PrintTicket from printer
PrintTicket printTicket = printQueue.DefaultPrintTicket;
PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();
// Modify PrintTicket
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;
}
return printTicket;
}// end:GetPrintTicketFromPrinter()
// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
/// Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
/// A PrintTicket for the current local default printer.</returns>
PrintTicket^ GetPrintTicketFromPrinter ()
{
PrintQueue^ printQueue = nullptr;
LocalPrintServer^ localPrintServer = gcnew LocalPrintServer();
// Retrieving collection of local printer on user machine
PrintQueueCollection^ localPrinterCollection = localPrintServer->GetPrintQueues();
System::Collections::IEnumerator^ localPrinterEnumerator = localPrinterCollection->GetEnumerator();
if (localPrinterEnumerator->MoveNext())
{
// Get PrintQueue from first available printer
printQueue = ((PrintQueue^)localPrinterEnumerator->Current);
} else
{
return nullptr;
}
// Get default PrintTicket from printer
PrintTicket^ printTicket = printQueue->DefaultPrintTicket;
PrintCapabilities^ printCapabilites = printQueue->GetPrintCapabilities();
// Modify PrintTicket
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;
}
return printTicket;
};// end:GetPrintTicketFromPrinter()
PrintServer и PrintQueue
Класс PrintServer представляет сетевой сервер печати, а класс PrintQueue представляет принтер и связанную очередью задания вывода. Вместе эти APIs обеспечивают дополнительное управление заданиями печати сервера. Класс PrintServer или один из его производных классов используется для управления объектом PrintQueue. Метод AddJob используется для вставки нового задания печати в очередь.
В следующем примере демонстрируется, как создать объект LocalPrintServer и получить доступ к его объекту PrintQueue по умолчанию с помощью кода.
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
''' Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
''' An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
' Create a local print server
Dim ps As New LocalPrintServer()
' Get the default print queue
Dim pq As PrintQueue = ps.DefaultPrintQueue
' Get an XpsDocumentWriter for the default print queue
Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()
// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
/// Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
/// An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
// Create a local print server
LocalPrintServer ps = new LocalPrintServer();
// Get the default print queue
PrintQueue pq = ps.DefaultPrintQueue;
// Get an XpsDocumentWriter for the default print queue
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
return xpsdw;
}// end:GetPrintXpsDocumentWriter()
XpsDocumentWriter
Класс XpsDocumentWriter и множество его методов Write и WriteAsync используются для записи документов XPS в PrintQueue. Например, метод Write(FixedPage, PrintTicket) используется для вывода документа XPS и PrintTicket синхронно. Метод WriteAsync(FixedDocument, PrintTicket) используется для вывода документа XPS и PrintTicket асинхронно.
В следующем примере демонстрируется создание XpsDocumentWriter с помощью кода.
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
''' Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
''' An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
' Create a local print server
Dim ps As New LocalPrintServer()
' Get the default print queue
Dim pq As PrintQueue = ps.DefaultPrintQueue
' Get an XpsDocumentWriter for the default print queue
Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()
// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
/// Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
/// An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
// Create a local print server
LocalPrintServer ps = new LocalPrintServer();
// Get the default print queue
PrintQueue pq = ps.DefaultPrintQueue;
// Get an XpsDocumentWriter for the default print queue
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
return xpsdw;
}// end:GetPrintXpsDocumentWriter()
Методы AddJob также предоставляют способы печати. См. раздел Как печатать файлы XPS программным способом. (подробные сведения).
Печать с использованием GDI
Во то время как приложения WPF изначально поддерживают способ печати XPS, приложения Win32 и Windows Forms могут также воспользоваться преимуществами некоторых возможностей XPS. Драйвер принтера XPS (XPSDrv) может преобразовать базовый вывод GDI в формат XPS. Для более сложных сценариев поддерживается настраиваемое преобразование содержимого с помощью escape-функции вызова преобразователя документов XPS (Майкрософт). Подобным образом, приложения WPF могут также выполнить вывод способом печати GDI, путем вызова одного из методов Write или WriteAsync класса XpsDocumentWriter и назначения не XpsDrv принтера в качестве целевой очереди печати.
Для приложений, которые не требуют функциональных возможностей или поддержки XPS, текущий способ печати GDI остается неизменным.
- Дополнительные справочные материалы о пути печати GDI и различных параметрах преобразования XPS см. в разделах Escape-функция вызова преобразователя документов XPS (Майкрософт) и "XPSDrv" в статье Windows Driver Development Kit.
Драйверная модель XPSDrv
Способ печати XPS повышает эффективность диспетчера очереди печати с помощью XPS как собственного формата диспетчера очереди печати при печати с использованием принтера или драйвера с включенной поддержкой XPS. Упрощенная обработка очереди избавляет от необходимости создания промежуточных файлов очередей, таких как файл данных EMF, перед тем, как документ помещен в очередь. Благодаря меньшему размеру файла очереди, способ печати XPS может уменьшить сетевой трафик и повысить производительность печати.
EMF является закрытым форматом, представляющим вывод приложения как последовательность вызовов в GDI для служб отрисовки. В отличие от EMF, формат очереди XPS представляет фактический документ без требования дальнейшей интерпретации при выводе на драйвер принтера на основе XPS (XPSDrv). Драйверы могут работать непосредственно с данными в формате. Эта возможность исключает требования преобразования данных и цветового пространства, когда используются файлы EMF и драйверы принтера на основе GDI.
Размер файла очереди обычно уменьшается при использовании документов XPS, предназначенных для драйвера принтера XPS (XPSDrv) по сравнению с его эквивалентами EMF; однако бывают исключения:
Векторный рисунок, который является очень сложным, многослойным или неэффективно записанным, может быть больше точечного рисунка того же графика.
В целях экранного отображения XPS файлы внедряют шрифты устройства, также как компьютерные шрифты; тогда как файлы очереди GDI не внедряет шрифты устройства. Но оба типа шрифтов представлены (см. ниже), и драйверы принтера могут удалить шрифты устройства до передачи файла на принтер.
Уменьшение размера очереди выполняется посредством несколько механизмов:
Разбиение шрифта. Только символы, используемые в документе, хранятся в файле XPS.
Дополнительная поддержка графики. Встроенная поддержка прозрачности и градиента примитивов позволяет избежать растеризации содержимого в документе XPS.
Идентификация общих ресурсов. Ресурсы, которые используются несколько раз (например изображение, представляющее эмблему организации), рассматриваются как общие ресурсы и загружаются только один раз.
Сжатие ZIP. Все документы XPS используют ZIP-сжатие.
См. также
Ссылки
Escape-функция вызова преобразователя документов XPS (Майкрософт)
Основные понятия
Сериализация и хранение документов