Condividi tramite


Panoramica della stampa di documenti (WPF .NET)

Con Microsoft .NET, gli sviluppatori di applicazioni che utilizzano Windows Presentation Foundation (WPF) dispongono di un ampio set di API per la gestione del sistema di stampa e delle operazioni di 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 stampa; e un linguaggio 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 XPS Documents.

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 nativamente un file di spool XPS e richiede un driver di stampante XPS. Il percorso di stampa XPS è basato sul modello di driver della stampante XPS (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 con l'estendibilità in mente, quindi funzioni e capacità possono essere aggiunti a XPS in modo modulare. Le funzionalità di estendibilità 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 estensibile.
  • 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 metodi Write e WriteAsync della classe XpsDocumentWriter 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 che mostra il sistema di stampa XPS.

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 controllo System.Windows.Controls.PrintDialog fornisce un singolo punto di accesso per l'interfaccia utente, la configurazione e l'invio di processi XPS. 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, PrintQueuee XpsDocumentWriter. Per un elenco completo delle API del percorso di stampa XPS, consultare lo spazio dei nomi System.Windows.Xps e System.Printing.

PrintTicket e PrintCapabilities

Le classi PrintTicket 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 la stampa fronte-retro, la raccolta e la pinzatura. Un PrintTicket istruisce una stampante su come elaborare un compito di stampa. La classe PrintCapabilities definisce le funzionalità di una stampante. Eseguendo una query sulle funzionalità di una stampante, è possibile creare un PrintTicket che sfrutta appieno le funzionalità supportate di una stampante. Analogamente, è possibile evitare funzionalità non supportate.

L'esempio seguente esegue una query sul PrintCapabilities di una stampante e crea un PrintTicket usando il 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 classe PrintServer rappresenta un server di stampa di rete e la classe PrintQueue 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. Un PrintServer, o una delle relative classi derivate, viene usato per gestire un PrintQueue.

Nell'esempio seguente viene creato un LocalPrintServer e si accede al PrintQueueCollection del 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 numerosi metodi Write e WriteAsync, viene usato per aggiungere documenti XPS a un PrintQueue. Ad esempio, il metodo Write(FixedDocumentSequence, PrintTicket) viene usato per aggiungere in modo sincrono un documento XPS con un ticket di stampa a una coda. Il metodo WriteAsync(FixedDocumentSequence, PrintTicket) 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 e vengono aggiunti documenti XPS, sia in modo sincrono che asincrono, a un PrintQueue usando il codice.

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

Sebbene le applicazioni WPF supportino in modo nativo il percorso di stampa XPS, possono anche restituire il percorso di stampa GDI chiamando uno dei metodi Write o WriteAsync della classe XpsDocumentWriter 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 ulteriori informazioni sul percorso di stampa GDI e sulle varie opzioni di conversione XPS, vedere convertitore di documenti Microsoft XPS (MXDC) e driver di stampante XPSDrv.

Modello di driver XPSDrv

Il percorso di stampa XPS migliora l'efficienza dello spooler usando XPS come formato di spool nativo durante la stampa su una stampante o un driver compatibile con 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 inviati a un driver di stampante basato su XPS, non richiedono un'ulteriore interpretazione perché i driver operano direttamente sui dati in questo 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. Grazie a dimensioni ridotte dei 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 dei file spool XPS sono generalmente ridotte quando si usa il percorso di stampa XPS. La riduzione delle dimensioni del file di spooling viene effettuata 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 le primitive di trasparenza e sfumature per evitare la rasterizzazione del contenuto XPS.
  • Identificazione delle 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, che viene usata in tutti i file XPS.

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

Suggerimento

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

Vedere anche