Delen via


Overzicht van het afdrukken van documenten

Met Microsoft .NET hebben toepassingsontwikkelaars die Windows Presentation Foundation (WPF) gebruiken, een uitgebreide set API's voor afdrukken en printbeheersystemen. De kern van deze functionaliteit is de XPS-bestandsindeling (XML Paper Specification) en het XPS-afdrukpad.

Over XPS

XPS is een elektronische documentindeling, een spool-bestandsindeling en een taal voor paginabeschrijving. Het is een open documentindeling die gebruikmaakt van XML-, Open Packaging Conventions en andere industriestandaarden om platformoverschrijdende documenten te maken. XPS vereenvoudigt het proces waarbij digitale documenten worden gemaakt, gedeeld, afgedrukt, bekeken en gearchiveerd. Zie XPS-documentenvoor meer informatie over XPS.

XPS-afdrukpad

Het XPS-afdrukpad is een Windows-functie die opnieuw definieert hoe afdrukken wordt verwerkt in Windows-toepassingen. XPS-afdrukpad kan het volgende vervangen:

  • Talen voor documentpresentaties, zoals Rich Text Format of Portable Document Format.
  • Afdrukspooler-indelingen, zoals Windows Metafile of Enhanced Metafile (EMF).
  • Talen voor paginabeschrijvingen, zoals printeropdrachttaal of PostScript.

Als gevolg hiervan behoudt het XPS-afdrukpad de XPS-indeling van de toepassingspublicatie tot de definitieve verwerking in het printerstuurprogramma of apparaat.

De afdrukspooler voor XPS-documenten ondersteunt zowel het XPS-afdrukpad als het GDI-afdrukpad. Het XPS-afdrukpad verbruikt systeemeigen een XPS-spoolbestand en vereist een XPS-printerstuurprogramma. Het XPS-afdrukpad is gebaseerd op het XPS-printerstuurprogramma (XPSDrv) model.

De voordelen van het XPS-afdrukpad zijn onder andere:

  • WYSIWYG-afdrukondersteuning.
  • Systeemeigen ondersteuning voor geavanceerde kleurprofielen, zoals 32 bits per kanaal, het CMYK-kleurenmodel, benoemde kleuren, n-inkten en transparencies en kleurovergangen.
  • Verbeterde afdrukprestaties: XPS-functies en -verbeteringen zijn alleen beschikbaar voor toepassingen die gericht zijn op het XPS-afdrukpad.
  • Industriestandaard XPS-indeling.

Voor eenvoudige afdrukscenario's is een eenvoudige en intuïtieve API beschikbaar met een standaardgebruikersinterface voor afdrukconfiguratie en taakinzending. Voor geavanceerde scenario's biedt de API ondersteuning voor aanpassing van de gebruikersinterface of helemaal geen gebruikersinterface, synchrone of asynchrone afdrukmogelijkheden en mogelijkheden voor batchafdrukken. Zowel eenvoudige als geavanceerde opties bieden ondersteuning voor afdrukken in volledige of gedeeltelijke vertrouwensmodi.

XPS is ontworpen met uitbreidbaarheid in gedachten, zodat functies en mogelijkheden op modulaire wijze aan XPS kunnen worden toegevoegd. Uitbreidbaarheidsfuncties zijn onder andere:

  • Een afdrukschema dat ondersteuning biedt voor snelle uitbreiding van apparaatmogelijkheden. Het openbare gedeelte van het schema wordt regelmatig bijgewerkt om de gewenste apparaatmogelijkheden toe te voegen. Zie Uitbreidbare architectuurvoor meer informatie.
  • Een uitbreidbare filterpijplijn die XPSDrv-stuurprogramma's gebruiken om direct en schaalbaar afdrukken van XPS-documenten te ondersteunen. Zie XPSDrv-printerstuurprogramma'svoor meer informatie.

WPF-toepassingen bieden systeemeigen ondersteuning voor het XPS-afdrukpad en kunnen XPS-afdruk-API's gebruiken om rechtstreeks naar het XPSDrv-stuurprogramma af te drukken. Als de doelafdrukwachtrij van de schrijfbewerking geen XPSDrv-stuurprogramma bevat, zullen de methoden Write en WriteAsync van de XpsDocumentWriter-klasse automatisch inhoud van de XPS- naar de GDI-indeling converteren voor het GDI-afdrukpad.

De volgende illustratie toont het afdruksubsysteem en definieert de gedeeltes die door Microsoft en onafhankelijke software- en hardwareleveranciers worden geleverd.

Schermopname van het XPS-afdruksysteem.

Eenvoudige XPS-afdruk

WPF heeft een afdruk-API die zowel eenvoudige als geavanceerde afdrukfuncties ondersteunt. Voor toepassingen waarvoor geen uitgebreide afdrukaanpassing of toegang tot de volledige XPS-functieset is vereist, is basisondersteuning voor afdrukken mogelijk voldoende. Basisondersteuning voor afdrukken wordt geboden via een PrintDialog--besturingselement waarvoor minimale configuratie is vereist, een vertrouwde gebruikersinterface heeft en ondersteuning biedt voor veel XPS-functies.

PrintDialog

Het besturingselement System.Windows.Controls.PrintDialog biedt één toegangspunt voor gebruikersinterfaces, configuratie en de inzending van XPS-taken. Zie Hoe een afdrukdialoogvenster weer te gevenvoor informatie over het instantiëren en gebruiken van de controle.

Geavanceerd XPS-afdrukken

Gebruik de geavanceerde afdruk-API om toegang te krijgen tot de volledige set XPS-functies. In deze sectie worden verschillende relevante API's beschreven, waaronder PrintTicket, PrintCapabilities, PrintServer, PrintQueueen XpsDocumentWriter. Zie de System.Windows.Xps en System.Printing naamruimten voor een volledige lijst met API's voor XPS-afdrukpaden.

PrintTicket en PrintCapabilities

De PrintTicket- en PrintCapabilities klassen vormen de basis van geavanceerde XPS-functies. Beide objecten bevatten xml-opgemaakte structuren van afdrukgeoriënteerde functies die zijn gedefinieerd door het afdrukschema. De functies omvatten duplexen, sorteren, dubbelzijdig afdrukken en nieten. Een PrintTicket geeft een printer instructies voor het verwerken van een afdruktaak. De PrintCapabilities-klasse definieert de mogelijkheden van een printer. Door query's uit te voeren op de mogelijkheden van een printer, kunt u een PrintTicket maken die volledig gebruikmaakt van de ondersteunde functies van een printer. Op dezelfde manier kunnen niet-ondersteunde functies worden vermeden.

In het volgende voorbeeld wordt de PrintCapabilities van een printer opgevraagd en wordt een PrintTicket gemaakt met behulp van code.

/// <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 en PrintQueue

De PrintServer-klasse vertegenwoordigt een netwerkafdrukserver en de klasse PrintQueue vertegenwoordigt een printer en de uitvoertaakwachtrij die eraan is gekoppeld. Deze API's ondersteunen samen geavanceerd beheer van de afdruktaken voor een server. Een PrintServer, of een van de afgeleide klassen, wordt gebruikt om een PrintQueuete beheren.

In het volgende voorbeeld wordt een LocalPrintServer gemaakt en wordt de PrintQueueCollection van de lokale computer geopend met behulp van code.

/// <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, met de vele Write en WriteAsync methoden, wordt gebruikt om XPS-documenten toe te voegen aan een PrintQueue. De methode Write(FixedDocumentSequence, PrintTicket) wordt bijvoorbeeld gebruikt om synchroon een XPS-document met een afdrukticket aan een wachtrij toe te voegen. De methode WriteAsync(FixedDocumentSequence, PrintTicket) wordt gebruikt om asynchroon een XPS-document met een afdrukticket toe te voegen aan een wachtrij.

In het volgende voorbeeld wordt een XpsDocumentWriter gemaakt en XPS-documenten, zowel synchroon als asynchroon, toegevoegd aan een PrintQueue met behulp van code.

/// <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-afdrukpad

Hoewel WPF-toepassingen systeemeigen ondersteuning bieden voor het XPS-afdrukpad, kunnen ze ook worden uitgevoerd naar het GDI-afdrukpad door een van de Write- of WriteAsync methoden van de XpsDocumentWriter-klasse aan te roepen en de afdrukwachtrij voor een niet-XpsDrv-printer te selecteren.

Voor toepassingen waarvoor geen XPS-functionaliteit of -ondersteuning is vereist, blijft het huidige GDI-afdrukpad ongewijzigd. Zie voor meer informatie over het GDI-afdrukpad en de verschillende XPS-conversieopties Microsoft XPS-documentconversieprogramma (MXDC) en XPSDrv-printerstuurprogramma's.

XPSDrv-stuurprogrammamodel

Het XPS-afdrukpad verbetert de efficiëntie van de spooler door XPS te gebruiken als het oorspronkelijke afdrukspoolformaat bij het afdrukken naar een XPS-compatibele printer of stuurprogramma. In tegenstelling tot EMF, dat toepassingsuitvoer vertegenwoordigt als een reeks aanroepen naar GDI voor renderingservices, vertegenwoordigt XPS-spoolindeling het document. Dus wanneer XPS-spoolbestanden worden uitgevoerd naar een XPS-printerstuurprogramma, vereisen ze geen verdere interpretatie omdat de stuurprogramma's rechtstreeks op gegevens in die indeling werken. Deze mogelijkheid elimineert de gegevens- en kleurruimteconversies die vereist zijn voor EMF-bestanden en op GDI gebaseerde afdrukstuurprogramma's.

Het vereenvoudigde spoolingproces elimineert de noodzaak om een tussenliggend spoolbestand, zoals een EMF-gegevensbestand, te genereren voordat het document wordt gepoold. Met kleinere spoolbestandsgrootten kan het XPS-afdrukpad netwerkverkeer verminderen en de afdrukprestaties verbeteren. Vergeleken met hun EMF-equivalenten worden XPS-spoolbestandsgroottes meestal verminderd bij gebruik van het XPS-afdrukpad. Het verkleinen van de grootte van het spoolbestand wordt uitgevoerd via verschillende mechanismen:

  • lettertypesubsetting, waarin alleen de tekens worden opgeslagen die in een document in het XPS-bestand worden gebruikt.
  • Geavanceerde afbeeldingen ondersteunen, die systeemeigen ondersteuning biedt voor transparantie en kleurovergangsprimitief om rasterisering van XPS-inhoud te voorkomen.
  • Identificatie van algemene bronnen, zoals een afbeelding van een bedrijfslogo die meerdere keren in een document wordt gebruikt. Algemene resources worden behandeld als gedeelde resources en worden slechts eenmaal geladen.
  • ZIP-compressie, die wordt gebruikt voor alle XPS-documenten.

De bestandsgrootte van het XPS-spoolbestand wordt mogelijk niet verkleind als een vectorafbeelding zeer complex, met meerdere lagen of inefficiënt geschreven is. In tegenstelling tot GDI-spoolbestanden kunnen XPS-bestanden apparaatlettertypen en computerlettertypen insluiten voor schermweergavedoeleinden, hoewel beide soorten lettertypen zijn gesubseteerd en printerstuurprogramma's apparaatlettertypen kunnen verwijderen voordat het bestand naar de printer wordt verzonden.

Aanbeveling

U kunt OOK XPS-bestanden afdrukken met behulp van PrintQueue.AddJob methoden. Zie XPS-bestanden afdrukkenvoor meer informatie.

Zie ook