Общие сведения о печати

С 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

Базовая печать 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 остается неизменным.

Драйверная модель 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-сжатие.

См. также

Ссылки

PrintDialog

XpsDocumentWriter

XpsDocument

PrintTicket

PrintCapabilities

PrintServer

PrintQueue

Escape-функция вызова преобразователя документов XPS (Майкрософт)

Основные понятия

Документы в WPF

Сериализация и хранение документов

Другие ресурсы

Разделы руководства по печати

XPS