Panoramica della stampa di documenti (WPF .NET)

Con Microsoft .NET, gli sviluppatori di applicazioni che usano Windows Presentation Foundation (WPF) dispongono di un set completo di API di gestione del sistema di stampa e stampa. Il nucleo di questa funzionalità è il formato di file XPS (XML Paper Specification) e il percorso di stampa XPS.

Informazioni su XPS

XPS è un formato di documento elettronico, un formato di file di spooling e una lingua di descrizione della pagina. Si tratta di un formato di documento aperto che usa XML, Open Packaging Conventions e altri standard di settore per creare documenti multipiattaforma. XPS semplifica il processo con cui vengono creati, condivisi, stampati, visualizzati e archiviati documenti digitali. Per altre informazioni su XPS, vedere Documenti XPS.

Percorso di stampa XPS

Il percorso di stampa XPS è una funzionalità di Windows che ridefinisce la modalità di gestione della stampa nelle applicazioni Windows. Il percorso di stampa XPS può sostituire:

  • Linguaggi di presentazione dei documenti, ad esempio Formato RTF o Formato documento portatile.
  • Stampare formati di spooler, ad esempio Metafile Windows o Metafile avanzato (EMF).
  • Linguaggi di descrizione della pagina, ad esempio Printer Command Language o PostScript.

Di conseguenza, il percorso di stampa XPS mantiene il formato XPS dalla pubblicazione dell'applicazione fino all'elaborazione finale nel driver della stampante o nel dispositivo.

Lo spooler di stampa per i documenti XPS supporta sia il percorso di stampa XPS che il percorso di stampa GDI. Il percorso di stampa XPS utilizza in modo nativo un file di spooling XPS e richiede un driver di stampante XPS. Il percorso di stampa XPS è basato sul modello XPS Printer Driver (XPSDrv).

I vantaggi del percorso di stampa XPS includono:

  • Supporto di stampa WYSIWYG.
  • Supporto nativo di profili di colore avanzati, ad esempio 32 bit per canale, modello di colore CMYK, colori denominati, n-ink e trasparenze e sfumature.
  • Prestazioni di stampa migliorate: le funzionalità XPS e i miglioramenti sono disponibili solo per le applicazioni destinate al percorso di stampa XPS.
  • Formato XPS standard del settore.

Per gli scenari di stampa di base, un'API semplice e intuitiva è disponibile con un'interfaccia utente standard per la configurazione di stampa e l'invio di processi. Per scenari avanzati, l'API supporta la personalizzazione dell'interfaccia utente o nessuna interfaccia utente, la stampa sincrona o asincrona e le funzionalità di stampa batch. Entrambe le opzioni semplici e avanzate offrono supporto per la stampa in modalità di attendibilità completa o parziale.

XPS è stato progettato tenendo presente l'estendibilità, quindi le funzionalità e le funzionalità possono essere aggiunte a XPS in modo modulare. Le funzionalità di estensibilità includono:

  • Schema di stampa che supporta l'estensione rapida delle funzionalità del dispositivo. La parte pubblica dello schema viene aggiornata regolarmente per aggiungere le funzionalità del dispositivo desiderate. Per altre informazioni, vedere Architettura estendibile.
  • Pipeline di filtro estendibile usata dai driver XPSDrv per supportare la stampa diretta e scalabile di documenti XPS. Per altre informazioni, vedere Driver della stampante XPSDrv.

Le applicazioni WPF supportano in modo nativo il percorso di stampa XPS e possono usare le API di stampa XPS per stampare direttamente nel driver XPSDrv. Se la coda di stampa di destinazione dell'operazione di scrittura non dispone di un driver XPSDrv, i Write metodi e WriteAsync della XpsDocumentWriter classe convertiranno automaticamente il contenuto da XPS a formato GDI per il percorso di stampa GDI.

La figura seguente mostra il sottosistema di stampa e definisce le parti fornite da Microsoft e dai fornitori di software e hardware indipendenti.

Screenshot showing the XPS print system.

Stampa XPS di base

WPF dispone di un'API di stampa che supporta funzionalità di stampa di base e avanzate. Per le applicazioni che non richiedono un'ampia personalizzazione della stampa o l'accesso al set di funzionalità XPS completo, il supporto di stampa di base potrebbe essere sufficiente. Il supporto di stampa di base viene fornito tramite un controllo PrintDialog che richiede una configurazione minima, ha un'interfaccia utente familiare e supporta molte funzionalità XPS.

PrintDialog

Il System.Windows.Controls.PrintDialog controllo fornisce un singolo punto di ingresso per l'invio di processi XPS, configurazione e interfaccia utente. Per informazioni su come creare un'istanza e usare il controllo, vedere Come visualizzare una finestra di dialogo di stampa.

Stampa XPS avanzata

Per accedere al set completo di funzionalità XPS, usare l'API di stampa avanzata. In questa sezione sono descritte diverse API rilevanti, tra cui PrintTicket, PrintCapabilities, PrintServer, PrintQueue e XpsDocumentWriter. Per un elenco completo delle API del percorso di stampa XPS, vedere gli System.Windows.Xps spazi dei nomi e System.Printing .

PrintTicket e PrintCapabilities

Le PrintTicket classi e PrintCapabilities sono la base delle funzionalità XPS avanzate. Entrambi gli oggetti contengono strutture in formato XML di funzionalità orientate alla stampa definite dallo schema di stampa. Le funzionalità includono il duplex, le regole di confronto, la stampa a due lati e l'associazione. Un oggetto PrintTicket indica a una stampante come elaborare un processo di stampa. La classe PrintCapabilities consente di definire le funzionalità di una stampante. Eseguendo una query delle funzionalità di una stampante, è possibile creare un oggetto PrintTicket per usare in modo completo tutte le funzionalità supportate di una stampante. Analogamente, è possibile evitare le funzionalità non supportate.

L'esempio seguente esegue una query sull'oggetto PrintCapabilities di una stampante e crea un oggetto utilizzando il PrintTicket codice .

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

La PrintServer classe rappresenta un server di stampa di rete e la PrintQueue classe rappresenta una stampante e la coda di processi di output associata. Insieme, queste API supportano la gestione avanzata dei processi di stampa per un server. La classe PrintServer, o una delle relative classi derivate, consente di gestire la classe PrintQueue.

Nell'esempio seguente viene creato un LocalPrintServer oggetto e viene eseguito l'accesso al PrintQueueCollection computer locale usando il codice .

/// <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, con i Write numerosi metodi e WriteAsync , viene usato per aggiungere documenti XPS a un oggetto PrintQueue. Ad esempio, il Write(FixedDocumentSequence, PrintTicket) metodo viene usato per aggiungere in modo sincrono un documento XPS con un ticket di stampa a una coda. Il WriteAsync(FixedDocumentSequence, PrintTicket) metodo viene utilizzato per aggiungere in modo asincrono un documento XPS con un ticket di stampa a una coda.

Nell'esempio seguente viene creato un XpsDocumentWriter oggetto e vengono aggiunti documenti XPS, sia in modo sincrono che asincrono, a un PrintQueue oggetto using.

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

Percorso di stampa GDI

Anche se le applicazioni WPF supportano in modo nativo il percorso di stampa XPS, possono anche restituire il percorso di stampa GDI chiamando uno dei Write metodi o WriteAsync della XpsDocumentWriter classe e selezionando la coda di stampa per una stampante non XpsDrv.

Per le applicazioni che non richiedono funzionalità XPS o supporto, il percorso di stampa GDI corrente rimane invariato. Per altre informazioni sul percorso di stampa GDI e sulle varie opzioni di conversione XPS, vedere Driver della stampante XPS e XPSDrv (Microsoft XPS Document Converter) e XPSDrv.

Modello di driver XPSDrv

Il percorso di stampa XPS migliora l'efficienza dello spooler usando XPS come formato di spooling di stampa nativo durante la stampa su una stampante o un driver abilitato per XPS. A differenza di EMF, che rappresenta l'output dell'applicazione come una serie di chiamate in GDI per i servizi di rendering, il formato dello spool XPS rappresenta il documento. Pertanto, quando i file di spooling XPS vengono restituiti a un driver di stampante basato su XPS, non richiedono un'ulteriore interpretazione perché i driver operano direttamente sui dati in tale formato. Questa funzionalità elimina le conversioni di spazio dei dati e colori necessarie per i file EMF e i driver di stampa basati su GDI.

Il processo di spooling semplificato elimina la necessità di generare un file di spooling intermedio, ad esempio un file di dati EMF, prima dello spooling del documento. Con dimensioni ridotte del file di spooling, il percorso di stampa XPS può ridurre il traffico di rete e migliorare le prestazioni di stampa. Rispetto ai relativi equivalenti EMF, le dimensioni del file di spooling XPS vengono in genere ridotte quando si usa il percorso di stampa XPS. La riduzione delle dimensioni del file di spooling viene eseguita tramite diversi meccanismi:

  • Impostazione secondaria del tipo di carattere, che archivia solo i caratteri utilizzati all'interno di un documento nel file XPS.
  • Supporto grafico avanzato, che supporta in modo nativo primitive di trasparenza e sfumature per evitare la rasterizzazione del contenuto XPS.
  • Identificazione di risorse comuni, ad esempio un'immagine di un logo aziendale usato più volte in un documento. Le risorse comuni vengono considerate come risorse condivise e vengono caricate una sola volta.
  • Compressione ZIP, usata in tutti i documenti XPS.

Le dimensioni del file di spooling XPS potrebbero non essere ridotte se un elemento grafico vettoriale è estremamente complesso, multi-layer o scritto in modo inefficiente. A differenza dei file di spooling GDI, i file XPS incorporano tipi di carattere del dispositivo e tipi di carattere basati su computer a scopo di visualizzazione dello schermo, anche se entrambi i tipi di carattere sono subsettati e i driver della stampante possono rimuovere i tipi di carattere del dispositivo prima di trasmettere il file alla stampante.

Suggerimento

È anche possibile stampare file XPS utilizzando PrintQueue.AddJob metodi. Per altre informazioni, vedere Come stampare i file XPS.

Vedi anche