Przegląd Drukowanie

W programie Microsoft .NET Framework deweloperzy aplikacji korzystający z programu Windows Presentation Foundation (WPF) mają bogaty nowy zestaw interfejsów API zarządzania systemami drukowania i drukowania. W systemie Windows Vista niektóre z tych ulepszeń systemu drukowania są również dostępne dla deweloperów tworzących aplikacje Windows Forms i deweloperów przy użyciu niezarządzanego kodu. Podstawą tej nowej funkcji jest nowy format pliku SPECYFIKACJI PAPIERU XML (XPS) i ścieżka wydruku XPS.

Ten temat zawiera poniższe sekcje.

Informacje o systemie XPS

XPS to elektroniczny format dokumentu, format buforu i język opisu strony. Jest to otwarty format dokumentu, który używa formatów XML, Open Packaging Conventions (OPC) i innych standardów branżowych do tworzenia dokumentów międzyplatformowych. XpS upraszcza proces tworzenia, udostępniania, drukowania, wyświetlania i archiwizowania dokumentów cyfrowych. Aby uzyskać dodatkowe informacje na temat xps, zobacz XPS Documents (Dokumenty XPS).

Kilka technik drukowania zawartości opartej na systemie XPS przy użyciu WPF przedstawiono w programowe drukowanie plików XPS. Przydatne może być odwołanie się do tych przykładów podczas przeglądania zawartości zawartej w tym temacie. (Niezarządzani deweloperzy kodu powinni zapoznać się z dokumentacją MXDC_ESCAPE funkcja. Deweloperzy windows Forms muszą używać interfejsu API w System.Drawing.Printing przestrzeni nazw, która nie obsługuje pełnej ścieżki drukowania XPS, ale obsługuje hybrydową ścieżkę drukowania GDI-to-XPS. Zobacz Architektura ścieżki wydruku poniżej.

Ścieżka wydruku XPS

Ścieżka drukowania specyfikacji papieru XML (XPS) to nowa funkcja systemu Windows, która ponownie definiuje sposób obsługi drukowania w aplikacjach systemu Windows. Ponieważ XPS może zastąpić język prezentacji dokumentów (np. RTF), format buforu wydruku (np. WMF) i język opisu strony (taki jak PCL lub Postscript); nowa ścieżka drukowania utrzymuje format XPS z publikacji aplikacji do końcowego przetwarzania w sterowniku wydruku lub urządzeniu.

Ścieżka drukowania XPS jest oparta na modelu sterownika drukarki XPS (XPSDrv), który zapewnia kilka korzyści dla deweloperów, takich jak "to, co widzisz" (WYSIWYG) drukowania, ulepszona obsługa kolorów i znacznie większa wydajność drukowania. (Aby uzyskać więcej informacji na temat xpSDrv, zobacz Dokumentacja zestawu Sterowników systemu Windows).

Operacja buforu wydruku dla dokumentów XPS jest zasadniczo taka sama jak w poprzednich wersjach systemu Windows. Dodano jednak obsługę ścieżki drukowania XPS oprócz istniejącej ścieżki drukowania GDI. Nowa ścieżka drukowania natywnie używa pliku buforu XPS. Chociaż sterowniki drukarek w trybie użytkownika napisane dla poprzednich wersji systemu Windows będą nadal działać, sterownik drukarki XPS (XPSDrv) jest wymagany w celu korzystania ze ścieżki drukowania XPS.

Zalety ścieżki drukowania XPS są znaczące i obejmują:

  • Obsługa drukowania WYSIWYG

  • Natywna obsługa zaawansowanych profilów kolorów, które obejmują 32 bity na kanał (bpc), CMYK, nazwane kolory, n-inks i natywną obsługę przezroczystości i gradientów.

  • Zwiększona wydajność drukowania zarówno dla aplikacji opartych na platformie .NET Framework, jak i Win32.

  • Format XPS standardu branżowego.

W przypadku podstawowych scenariuszy drukowania prosty i intuicyjny interfejs API jest dostępny z pojedynczym punktem wejścia dla interfejsu użytkownika, konfiguracji i przesyłania zadań. W przypadku zaawansowanych scenariuszy dodawana jest dodatkowa obsługa interfejsu użytkownika), synchroniczne lub asynchroniczne drukowanie oraz możliwości drukowania wsadowego. Obie opcje zapewniają obsługę drukowania w trybie pełnego lub częściowego zaufania.

XpS został zaprojektowany z myślą o rozszerzalności. Korzystając ze struktury rozszerzalności, funkcje i możliwości można dodać do systemu XPS w sposób modułowy. Funkcje rozszerzalności obejmują:

  • Drukuj schemat. Schemat publiczny jest regularnie aktualizowany i umożliwia szybkie rozszerzanie możliwości urządzeń. (Zobacz PrintTicket i PrintCapabilities poniżej.

  • Rozszerzalny potok filtru. Potok filtru sterownika drukarki XPS (XPSDrv) został zaprojektowany w celu umożliwienia zarówno bezpośredniego, jak i skalowalnego drukowania dokumentów XPS. Aby uzyskać więcej informacji, zobacz XPSDrv Printer Drivers (Sterowniki drukarek XPSDrv).

Aplikacje Win32 i .NET Framework obsługują systemy XPS, natomiast aplikacje Win32 i Windows Forms używają konwersji GDI do XPS w celu utworzenia zawartości sformatowanej w formacie XPS dla sterownika drukarki XPS (XPSDrv). Te aplikacje nie są wymagane do korzystania ze ścieżki drukowania XPS i mogą nadal korzystać z drukowania opartego na rozszerzonym metapliku (EMF). Jednak większość funkcji i ulepszeń XPS jest dostępna tylko dla aplikacji przeznaczonych dla ścieżki wydruku XPS.

Aby umożliwić korzystanie z drukarek opartych na xpSDrv przez aplikacje Win32 i Windows Forms, sterownik drukarki XPS (XPSDrv) obsługuje konwersję GDI na format XPS. Model XPSDrv udostępnia również konwerter plików XPS do formatu GDI, dzięki czemu aplikacje Win32 mogą drukować dokumenty XPS. W przypadku aplikacji WPF konwersja formatu XPS na GDI jest wykonywana automatycznie przez Write metody XpsDocumentWriter i WriteAsync klasy, gdy docelowa kolejka wydruku operacji zapisu nie ma sterownika XPSDrv. (Aplikacje Windows Forms nie mogą drukować dokumentów XPS).

Poniższa ilustracja przedstawia podsystem wydruku i definiuje części dostarczane przez firmę Microsoft oraz części zdefiniowane przez dostawców oprogramowania i sprzętu:

Screenshot shows the XPS print system.

Podstawowe drukowanie XPS

WPF definiuje zarówno podstawowy, jak i zaawansowany interfejs API. W przypadku tych aplikacji, które nie wymagają rozbudowanego dostosowywania wydruku lub dostępu do kompletnego zestawu funkcji XPS, dostępna jest podstawowa obsługa drukowania. Obsługa drukowania podstawowego jest uwidaczniona za pomocą kontrolki okna dialogowego drukowania, która wymaga minimalnej konfiguracji i funkcji znanego interfejsu użytkownika. Wiele funkcji XPS jest dostępnych przy użyciu tego uproszczonego modelu drukowania.

PrintDialog

Kontrolka System.Windows.Controls.PrintDialog zapewnia pojedynczy punkt wejścia dla interfejsu użytkownika, konfiguracji i przesyłania zadań XPS. Aby uzyskać informacje na temat tworzenia wystąpień i używania kontrolki, zobacz Wywoływanie okna dialogowego drukowania.

Zaawansowane drukowanie XPS

Aby uzyskać dostęp do pełnego zestawu funkcji XPS, należy użyć zaawansowanego interfejsu API drukowania. Poniżej opisano kilka odpowiednich interfejsów API. Aby uzyskać pełną listę interfejsów API ścieżki wydruku XPS, zobacz System.Windows.Xps odwołania do przestrzeni nazw i System.Printing .

PrintTicket i PrintCapabilities

Klasy PrintTicket i PrintCapabilities są podstawą zaawansowanych funkcji XPS. Oba typy obiektów to struktury sformatowane w formacie XML cech zorientowanych na drukowanie, takie jak sortowanie, drukowanie dwustronne, zszycie itp. Te struktury są definiowane przez schemat wydruku. A PrintTicket instruuje drukarkę, jak przetwarzać zadanie drukowania. Klasa PrintCapabilities definiuje możliwości drukarki. Wykonując zapytanie dotyczące możliwości drukarki, można utworzyć element, PrintTicket który w pełni korzysta z obsługiwanych funkcji drukarki. Podobnie można uniknąć nieobsługiwanych funkcji.

W poniższym przykładzie pokazano, jak wysłać zapytanie do PrintCapabilities drukarki i utworzyć PrintTicket przy użyciu kodu.

// ---------------------- 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()
// ---------------------- 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>
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()

PrintServer i PrintQueue

Klasa PrintServer reprezentuje serwer wydruku sieciowego, a PrintQueue klasa reprezentuje drukarkę i kolejkę zadań wyjściowych skojarzonych z nim. Te interfejsy API umożliwiają zaawansowane zarządzanie zadaniami drukowania serwera. Klasa PrintServerlub jedna z jej klas pochodnych służy do zarządzania klasą PrintQueue. Metoda AddJob służy do wstawiania nowego zadania drukowania do kolejki.

W poniższym przykładzie pokazano, jak utworzyć element LocalPrintServer i uzyskać domyślnie PrintQueue dostęp przy użyciu kodu.

// -------------------- 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()
' -------------------- 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()

XpsDocumentWriter

Element XpsDocumentWriter, z wieloma Write metodami i WriteAsync , służy do zapisywania dokumentów XPS w obiekcie PrintQueue. Na przykład Write(FixedPage, PrintTicket) metoda służy do wyprowadzania dokumentu XPS i PrintTicket synchronicznego. Metoda WriteAsync(FixedDocument, PrintTicket) służy do wyprowadzania dokumentu XPS i PrintTicket asynchronicznego.

W poniższym przykładzie pokazano, jak utworzyć XpsDocumentWriter kod przy użyciu kodu.

// -------------------- 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()
' -------------------- 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()

Metody AddJob udostępniają również sposoby drukowania. Zobacz Programowe drukowanie plików XPS. aby uzyskać szczegółowe informacje.

Ścieżka wydruku GDI

Chociaż aplikacje WPF natywnie obsługują ścieżkę drukowania XPS, aplikacje Win32 i Windows Forms mogą również korzystać z niektórych funkcji XPS. Sterownik drukarki XPS (XPSDrv) może konwertować dane wyjściowe oparte na GDI na format XPS. W przypadku zaawansowanych scenariuszy niestandardowa konwersja zawartości jest obsługiwana przy użyciu konwertera dokumentów MICROSOFT XPS (MXDC). Podobnie aplikacje WPF mogą również wysyłać dane wyjściowe do ścieżki wydruku GDI przez wywołanie jednej z Write metod XpsDocumentWriter lub WriteAsync klasy i wyznaczenie drukarki innej niż XpsDrv jako docelową kolejkę wydruku.

W przypadku aplikacji, które nie wymagają funkcji lub obsługi systemu XPS, bieżąca ścieżka drukowania GDI pozostaje niezmieniona.

Model sterownika XPSDrv

Ścieżka drukowania XPS zwiększa wydajność buforowania przy użyciu xpS jako natywnego formatu buforu wydruku podczas drukowania na drukarkę lub sterownik z włączoną obsługą systemu XPS. Uproszczony proces buforowania eliminuje konieczność wygenerowania pośredniego pliku buforu, takiego jak plik danych EMF, przed buforowaniem dokumentu. Dzięki mniejszym rozmiarom plików buforu ścieżka drukowania XPS może zmniejszyć ruch sieciowy i zwiększyć wydajność drukowania.

EMF to zamknięty format, który reprezentuje dane wyjściowe aplikacji jako serię wywołań do interfejsu GDI na potrzeby renderowania usług. W przeciwieństwie do pakietu EMF format buforu XPS reprezentuje rzeczywisty dokument bez konieczności dalszej interpretacji w przypadku danych wyjściowych sterownika drukarki opartego na systemie XPS (XPSDrv). Sterowniki mogą działać bezpośrednio na danych w formacie . Ta funkcja eliminuje konwersje przestrzeni kolorów i danych wymagane podczas korzystania z plików EMF i sterowników wydruku opartych na GDI.

Rozmiary plików buforu są zwykle mniejsze w przypadku korzystania z dokumentów XPS przeznaczonych dla sterownika drukarki XPS (XPSDrv) w porównaniu z ich odpowiednikami EMF; istnieją jednak wyjątki:

  • Grafika wektorowa, która jest bardzo złożona, wielowarstwowa lub nieefektywnie napisana, może być większa niż mapa bitowa tej samej grafiki.

  • W celach wyświetlania ekranu pliki XPS osadzają czcionki urządzenia, a także czcionki oparte na komputerach; podczas gdy pliki buforowania GDI nie osadzają czcionek urządzenia. Jednak oba rodzaje czcionek są podzbiorem (patrz poniżej), a sterowniki drukarek mogą usunąć czcionki urządzenia przed przesłaniem pliku do drukarki.

Zmniejszenie rozmiaru puli odbywa się za pomocą kilku mechanizmów:

  • Podsetting czcionki. W pliku XPS są przechowywane tylko znaki używane w rzeczywistym dokumencie.

  • Zaawansowana obsługa grafiki. Natywna obsługa przezroczystości i pierwotnych gradientów pozwala uniknąć rasteryzacji zawartości w dokumencie XPS.

  • Identyfikacja typowych zasobów. Zasoby używane wiele razy (takie jak obraz reprezentujący logo firmowe) są traktowane jako zasoby udostępnione i są ładowane tylko raz.

  • Kompresja ZIP. Wszystkie dokumenty XPS używają kompresji ZIP.

Zobacz też