Condividi tramite


Cenni preliminari sulla stampa

Con Microsoft .NET Framework, gli sviluppatori di applicazioni che utilizzano Windows Presentation Foundation (WPF) dispongono di molteplici nuove APIs di stampa e di gestione del sistema di stampa. Con Windows Vista, alcuni dei miglioramenti apportati al sistema di stampa sono anche disponibili agli sviluppatori che creano applicazioni Windows Forms e a quelli che utilizzano codice non gestito. Questa nuova funzionalità è basata sul nuovo formato di file XML Paper Specification (XPS) e sul percorso di stampa XPS.

Di seguito sono elencate le diverse sezioni di questo argomento.

  • Informazioni su XPS

  • Percorso di stampa XPS

  • Percorso di stampa GDI

  • Modello di driver XPSDrv

  • Argomenti correlati

Informazioni su XPS

XPS è un formato di documento elettronico, un formato del file di spooling e un linguaggio di descrizione della pagina. Si tratta di un formato di documento aperto basato sull'utilizzo di XML, Open Packaging Conventions (OPC) e di altri standard del settore per creare documenti per più piattaforme. XPS semplifica il processo di creazione, condivisione, stampa, visualizzazione e archiviazione di documenti digitali. Per ulteriori informazioni su XPS, visitare il sito Web XPS.

In Procedura: stampa di file XPS a livello di codice vengono illustrate varie tecniche di stampa di contenuto basato su XPS tramite WPF. Può essere utile fare riferimento a tali esempi durante la lettura di questo argomento. Gli sviluppatori di codice non gestito dovrebbero fare riferimento alla guida relativa alla funzione di escape della stampante per il processo di conversione documenti XPS Microsoft. Gli sviluppatori di Windows Forms devono utilizzare l'API nello spazio dei nomi System.Drawing.Printing, che non supporta il percorso di stampa XPS completo, ma un percorso di stampa GDI-XPS ibrido. Vedere di seguito Architettura del percorso di stampa.

Percorso di stampa XPS

Il percorso di stampa XML Paper Specification (XPS) è una nuova funzionalità di Windows che ridefinisce la gestione della stampa nelle applicazioni Windows. Poiché XPS può sostituire un linguaggio di presentazione del documento, ad esempio RTF, un formato di spooler di stampa, ad esempio WMF, e un linguaggio di descrizione della pagina, ad esempio PCL o Postscript, il nuovo percorso di stampa mantiene il formato XPS dalla pubblicazione dell'applicazione all'elaborazione finale nel dispositivo o nel driver di stampa.

Il percorso di stampa XPS è basato sul modello del driver della stampante XPS (XPSDrv) e offre agli sviluppatori numerosi vantaggi quali stampa "what you see is what you get" (WYSIWYG), supporto del colore migliorato e prestazioni di stampa più elevate. Per ulteriori informazioni su XPSDrv, vedere Windows Driver Development Kit (informazioni in lingua inglese).

Il funzionamento dello spooler di stampa per i documenti XPS è essenzialmente lo stesso delle versioni precedenti di Windows. Tuttavia, è ora previsto il supporto del percorso di stampa XPS oltre al percorso di stampa GDI esistente. Il nuovo percorso di stampa utilizza a livello nativo un file di spooling XPS. Anche se i driver della stampante in modalità utente scritti per le versioni precedenti di Windows continueranno a funzionare, è necessario disporre di un driver della stampante XPS (XPSDrv) per utilizzare il percorso di stampa XPS.

I vantaggi derivanti dall'utilizzo del percorso di stampa XPS sono significativi e includono:

  • Supporto di stampa WYSIWYG

  • Supporto nativo di profili colori avanzati che includono 32 bit per canale (bpc), CMYK, colori con nome, molteplici inchiostri e supporto nativo di trasparenza e sfumature.

  • Prestazioni di stampa migliorate per applicazioni .NET Framework e Win32.

  • Formato XPS standard del settore.

Per scenari di stampa di base, è disponibile un'API semplice e di utilizzo intuitivo con un solo punto di ingresso per interfaccia utente, configurazione e invio di processi. Per scenari avanzati, è disponibile un supporto aggiuntivo per la personalizzazione dell'UI (o nessuna user interface (UI)), la stampa sincrona o asincrona e le funzionalità di stampa in modalità batch. Entrambe le opzioni forniscono supporto di stampa in modalità di attendibilità completa o parziale.

XPS è stato progettato tenendo presente l'estensibilità. Utilizzando il framework di estensibilità, è possibile aggiungere funzionalità a XPS in modo modulare. Le funzionalità Extensibility includono:

  • Schema di stampa. Lo schema pubblico viene aggiornato regolarmente e consente la rapida estensione delle funzionalità del dispositivo. (Vedere di seguito PrintTicket e PrintCapabilities.)

  • Pipeline del filtro estensibile. La pipeline del filtro del driver della stampante XPS (XPSDrv) è progettata per consentire la stampa diretta e scalabile di documenti XPS. Cercare "XPSDrv" in Windows Driver Development Kit (informazioni in lingua inglese).

Architettura del percorso di stampa

Se entrambe le applicazioni Win32 e XPSsupportano.NET Framework, le applicazioni Win32 e Windows Forms utilizzano la conversione GDI - XPS per creare contenuto formattato XPS per il driver della stampante XPS (XPSDrv). Non è necessario che queste applicazioni utilizzino il percorso di stampa XPS. Esse possono continuare a utilizzare la stampa basata su Enhanced Metafile (EMF). Tuttavia, la maggior parte delle funzionalità e dei miglioramenti offerti da XPS è disponibile unicamente per le applicazioni che utilizzano il percorso di stampa XPS.

Per consentire l'utilizzo di stampanti basate su XPSDrv da parte di applicazioni Windows Forms e Win32, il driver della stampante XPS (XPSDrv) supporta la conversione del formato GDI in XPS. Il modello XPSDrv dispone inoltre di un convertitore per il formato XPS - GDI, per consentire alle applicazioni Win32 di stampare documenti XPS. Per le applicazioni WPF, la conversione del formato XPS in GDI viene eseguita automaticamente tramite i metodi Write e WriteAsync della classe XpsDocumentWriter ogni volta che la coda di stampa di destinazione dell'operazione di scrittura non dispone di un driver XPSDrv. Non è possibile stampare documenti XPS da applicazioni Windows Forms.

Di seguito viene illustrato il sottosistema di stampa e vengono definite le parti fornite da Microsoft e quelle definite da fornitori di software e hardware.

Sistema di stampa XPS

Stampa XPS di base

In WPF è definita un'API di base e un'API avanzata. Per le applicazioni che non richiedono una personalizzazione di stampa capillare o l'accesso a tutte le funzionalità XPS, è disponibile un supporto di stampa di base. Il supporto di stampa di base viene esposto tramite un controllo finestra di dialogo di stampa che richiede una configurazione minima e offre un'UI già familiare all'utente. Molte funzionalità XPS sono disponibili tramite questo modello di stampa semplificato.

PrintDialog

Il controllo System.Windows.Controls.PrintDialog rappresenta un singolo punto di ingresso per l'UI, la configurazione e l'invio di processi XPS. Per informazioni su come creare un'istanza del controllo e come utilizzarlo, vedere Procedura: richiamare una finestra di dialogo di stampa.

Stampa XPS avanzata

Per accedere all'insieme completo delle funzionalità XPS, è necessario utilizzare l'API di stampa avanzata. Di seguito vengono descritte in dettaglio diverse API. Per un elenco completo di APIs del percorso di stampa XPS, vedere i riferimenti agli spazi dei nomi System.Windows.Xps e System.Printing.

PrintTicket e PrintCapabilities

Le classi PrintTicket e PrintCapabilities sono alla base delle funzionalità XPS avanzate. Entrambi i tipi di oggetti sono strutture in formato XML di funzionalità orientate alla stampa quali regole di confronto, stampa fronte-retro, graffatura e così via. Queste strutture sono definite dallo schema di stampa. 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 utilizzare in modo completo tutte le funzionalità supportate di una stampante. Analogamente, è possibile evitare le funzionalità non supportate.

Nell'esempio riportato di seguito viene illustrato come eseguire una query della classe PrintCapabilities di una stampante e creare un oggetto PrintTicket tramite il codice.

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

La classe PrintServer rappresenta un server di stampa di rete, mentre la classe PrintQueue rappresenta una stampante e la coda del processo di output a essa associata. Insieme, queste APIs consentono una gestione avanzata dei processi di stampa di un server. La classe PrintServer, o una delle relative classi derivate, consente di gestire la classe PrintQueue. Il metodo AddJob consente di inserire un nuovo processo di stampa nella coda.

Nell'esempio di codice riportato di seguito viene illustrato come creare un oggetto LocalPrintServer e come accedere al relativo oggetto PrintQueue predefinito tramite il codice.

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

Un oggetto XpsDocumentWriter, con i relativi metodi Write e WriteAsync, consente di scrivere documenti XPS in un oggetto PrintQueue. Ad esempio, il metodo Write(FixedPage, PrintTicket) viene utilizzato per emettere un documento XPS e un oggetto PrintTicket in modo sincrono. Il metodo WriteAsync(FixedDocument, PrintTicket) viene invece utilizzato per emettere un documento XPS e un oggetto PrintTicket in modo asincrono.

Nell'esempio riportato di seguito viene illustrato come creare un oggetto XpsDocumentWriter tramite codice.

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

I metodi AddJob consentono anche di stampare in diversi modi. Vedere Procedura: stampa di file XPS a livello di codice. per informazioni dettagliate.

Percorso di stampa GDI

Le applicazioni WPF supportano a livello nativo il percorso di stampa XPS, mentre le applicazioni Win32 e Windows Forms possono usufruire anche di alcune funzionalità XPS. Il driver della stampante XPS (XPSDrv) può convertire l'output basato su GDI nel formato XPS. In scenari avanzati, la conversione personalizzata del contenuto è supportata tramite la funzione di escape della stampante per il processo di conversione documenti XPS Microsoft. Analogamente, le applicazioni WPF possono inviare l'output al percorso di stampa GDI chiamando uno dei metodi Write o WriteAsync della classe XpsDocumentWriter e impostando una stampante non XpsDrv come coda di stampa di destinazione.

Per le applicazioni che non richiedono il supporto o la funzionalità XPS, il percorso di stampa GDI corrente rimane invariato.

Modello di driver XPSDrv

Il percorso di stampa XPS migliora l'efficienza dello spooler utilizzando XPS come formato dello spooler di stampa nativo per la stampa su un driver o una stampante XPS. Il processo di spooling semplificato elimina la necessità di generare un file di spooling intermedio, ad esempio un file di dati EMF, prima che il documento venga inviato allo spooler. Grazie alle dimensioni ridotte del file di spooling, il percorso di stampa XPS può ridurre il traffico nella rete e migliorare le prestazioni di stampa.

EMF è un formato chiuso che rappresenta l'output dell'applicazione come una serie di chiamate a GDI per i servizi di rendering. A differenza di EMF, il formato di spooling XPS rappresenta il documento effettivo senza richiedere un'ulteriore interpretazione al momento dell'output su un driver della stampante XPS (XPSDrv). I driver possono agire direttamente sui dati nel formato. Questa funzionalità elimina le conversioni dei dati e dello spazio colori necessarie quando si utilizzano file EMF e driver della stampante basati su GDI.

Le dimensioni del file di spooling diminuiscono in genere quando si utilizzano documenti XPS indirizzati a un driver della stampante XPS (XPSDrv), rispetto agli equivalenti EMF. Esistono tuttavia delle eccezioni:

  • Una grafica vettoriale molto complessa, a più livelli o scritta in modo inappropriato può presentare dimensioni maggiori rispetto alla relativa versione bitmap.

  • Per scopi di visualizzazione, i file XPS incorporano tipi di carattere del dispositivo, nonché tipi di caratteri basati sul computer. Al contrario, i file di spooling GDI non incorporano alcun tipo di carattere del dispositivo. Tuttavia, entrambi i tipi di carattere presentano sottoinsiemi (vedere di seguito) e i driver della stampante possono rimuovere i tipi di carattere del dispositivo prima di trasmettere il file alla stampante.

La riduzione delle dimensioni di spooling viene eseguita tramite molteplici meccanismi:

  • Incorporazione di sottoinsiemi dei tipi di carattere. Solo i caratteri utilizzati nel documento effettivo vengono archiviati nel file XPS.

  • Supporto grafico avanzato. Il supporto nativo di primitive di sfumature e trasparenza evita la rasterizzazione del contenuto nel documento XPS.

  • Identificazione di risorse comuni. Le risorse utilizzate più volte (ad esempio un'immagine che rappresenta un logo aziendale) sono considerate risorse condivise e vengono caricate solo una volta.

  • Compressione ZIP. Tutti i documenti XPS utilizzano la compressione ZIP.

Vedere anche

Riferimenti

PrintDialog

XpsDocumentWriter

XpsDocument

PrintTicket

PrintCapabilities

PrintServer

PrintQueue

Escape della stampante per il processo di conversione documenti XPS Microsoft

Concetti

Documenti in WPF

Serializzazione e archiviazione di documenti

Altre risorse

Procedure relative alla stampa

XPS