Cenni preliminari sulla stampa

Con Microsoft .NET Framework, gli sviluppatori di applicazioni che usano Windows Presentation Foundation (WPF) hanno un nuovo set completo di API di gestione del sistema di stampa e stampa. Con Windows Vista, alcuni di questi miglioramenti del sistema di stampa sono disponibili anche per gli sviluppatori che creano applicazioni e sviluppatori Windows Form usando codice non gestito. Al centro di questa nuova funzionalità è il nuovo formato di file XPS (XML Paper Specification) e il percorso di stampa XPS.

Questo argomento include le sezioni seguenti.

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 (OPC) 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.

Diverse tecniche per la stampa di contenuti basati su XPS tramite WPF sono illustrate in Stampa file XPS a livello di codice. Può essere utile fare riferimento a tali esempi durante la lettura di questo argomento. (Gli sviluppatori di codice non gestito dovrebbero vedere la documentazione perMXDC_ESCAPE funzione. Windows Form gli sviluppatori devono usare l'API nello spazio dei System.Drawing.Printing nomi che non supporta il percorso di stampa XPS completo, ma supporta un percorso di stampa da GDI a XPS ibrido. Vedere Architettura del percorso di stampa di seguito.

Percorso di stampa XPS

Il percorso di stampa XPS (XML Paper Specification) è una nuova funzionalità di Windows che ridefinisce la modalità di 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 driver di stampa o nel dispositivo.

Il percorso di stampa XPS è basato sul modello di driver della stampante XPS (XPSDrv), che offre diversi vantaggi per gli sviluppatori, ad esempio "quello che vedi è quello che ottieni" (WYSIWYG), la stampa, il supporto dei colori migliorato e prestazioni di stampa notevolmente migliorate. Per altre informazioni su XPSDrv, vedere Documentazione di Windows Driver Kit.

Il funzionamento dello spooler di stampa per i documenti XPS è essenzialmente uguale a quello delle versioni precedenti di Windows. Tuttavia, è stato migliorato per supportare il percorso di stampa XPS oltre al percorso di stampa GDI esistente. Il nuovo percorso di stampa utilizza in modo nativo un file di spooling XPS. Mentre i driver della stampante in modalità utente scritti per le versioni precedenti di Windows continueranno a funzionare, è necessario un driver di stampante XPS (XPSDrv) per usare il percorso di stampa XPS.

I vantaggi 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 le applicazioni basate su .NET Framework e Win32.

  • Formato XPS standard del settore.

Per gli scenari di stampa di base, un'API semplice e intuitiva è disponibile con un unico punto di ingresso per l'interfaccia utente, la configurazione e l'invio di processi. Per scenari avanzati, viene aggiunto un supporto aggiuntivo per l'interfaccia utente, la stampa sincrona o asincrona e le funzionalità di stampa batch. Entrambe le opzioni forniscono supporto di stampa in modalità di attendibilità completa o parziale.

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

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

  • Pipeline del filtro estensibile. La pipeline di filtro XPS Printer Driver (XPSDrv) è stata progettata per consentire la stampa diretta e scalabile di documenti XPS. Per altre informazioni, vedere Driver della stampante XPSDrv.

Sebbene entrambe le applicazioni Win32 e .NET Framework supportino XPS, Win32 e Windows Form applicazioni usano una conversione GDI per XPS per creare contenuto formattato XPS per il driver della stampante XPS (XPSDrv). Queste applicazioni non sono necessarie per utilizzare il percorso di stampa XPS e possono continuare a utilizzare la stampa basata su EMF (Enhanced Metafile). Tuttavia, la maggior parte delle funzionalità XPS e dei miglioramenti è disponibile solo per le applicazioni destinate al percorso di stampa XPS.

Per abilitare l'uso di stampanti basate su XPSDrv da Win32 e applicazioni Windows Form, il driver della stampante XPS (XPSDrv) supporta la conversione di GDI in formato XPS. Il modello XPSDrv fornisce anche un convertitore per il formato XPS a GDI in modo che le applicazioni Win32 possano stampare documenti XPS. Per le applicazioni WPF, la conversione di XPS in formato GDI viene eseguita automaticamente dai Write metodi e WriteAsync della XpsDocumentWriter classe ogni volta che la coda di stampa di destinazione dell'operazione di scrittura non dispone di un driver XPSDrv. Le applicazioni Windows Form non possono stampare documenti XPS.

La figura seguente illustra il sottosistema di stampa e definisce le parti fornite da Microsoft e le parti definite dai fornitori di software e hardware:

Screenshot shows the XPS print system.

Stampa XPS di base

WPF definisce un'API di base e avanzata. Per le applicazioni che non richiedono una personalizzazione completa della stampa o l'accesso al set di funzionalità XPS completo, è disponibile il supporto per la stampa di base. Il supporto di stampa di base viene esposto tramite un controllo della finestra di dialogo di stampa che richiede una configurazione minima e funzionalità di un'interfaccia utente familiare. Molte funzionalità XPS sono disponibili usando questo modello di stampa semplificato.

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 del controllo e come usarlo, vedere Richiamare una finestra di dialogo di stampa.

Stampa XPS avanzata

Per accedere al set completo di funzionalità XPS, è necessario usare l'API di stampa avanzata. Di seguito sono descritte più dettagliatamente diverse API pertinenti. Per un elenco completo delle API del percorso di stampa XPS, vedere i riferimenti allo System.Windows.Xps spazio dei nomi e System.Printing .

PrintTicket e PrintCapabilities

Le PrintTicket classi e PrintCapabilities sono la base delle funzionalità XPS avanzate. Entrambi i tipi di oggetti sono strutture in formato XML di funzionalità orientate alla stampa, ad esempio regole di confronto, stampa a due lati, associazione 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 usare in modo completo tutte le funzionalità supportate di una stampante. Analogamente, è possibile evitare le funzionalità non supportate.

L'esempio riportato di seguito illustra 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>
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 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 API consentono la 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.

L'esempio di codice riportato di seguito illustra 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 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

Un XpsDocumentWriteroggetto , con i Write numerosi metodi e WriteAsync , viene usato per scrivere documenti XPS in un oggetto PrintQueue. Ad esempio, il Write(FixedPage, PrintTicket) metodo viene usato per restituire un documento XPS e PrintTicket in modo sincrono. Il WriteAsync(FixedDocument, PrintTicket) metodo viene usato per restituire un documento XPS e PrintTicket in modo asincrono.

L'esempio riportato di seguito illustra 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 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()

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

Percorso di stampa GDI

Anche se le applicazioni WPF supportano in modo nativo il percorso di stampa XPS, le applicazioni Win32 e Windows Form possono sfruttare anche alcune funzionalità XPS. Il driver della stampante XPS (XPSDrv) può convertire l'output basato su GDI in formato XPS. Per scenari avanzati, la conversione personalizzata del contenuto è supportata tramite Microsoft XPS Document Converter (MXDC). Analogamente, le applicazioni WPF possono anche restituire il percorso di stampa GDI chiamando uno dei Write metodi o WriteAsync della XpsDocumentWriter classe e designando una stampante non XpsDrv come coda di stampa di destinazione.

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

  • Per materiale di riferimento aggiuntivo sul percorso di stampa GDI e sulle varie opzioni di conversione XPS, vedere Microsoft XPS Document Converter (MXDC) e XPSDrv Printer Drivers.For additional reference material on the GDI print path and the various XPS conversion options, see Microsoft XPS Document Converter (MXDC) and XPSDrv Printer Drivers.

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 in una stampante o un driver abilitato per XPS. 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. Tramite dimensioni ridotte del file di spooling, il percorso di stampa XPS può ridurre il traffico di rete e migliorare le prestazioni di stampa.

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

Le dimensioni dei file di spooling vengono in genere ridotte quando si usano documenti XPS destinati a un driver di stampante XPS (XPSDrv) rispetto ai relativi equivalenti EMF; Tuttavia, esistono 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:

  • Incorporamento di sottoinsiemi di tipi di carattere. Solo i caratteri utilizzati all'interno del documento effettivo vengono archiviati nel file XPS.

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

  • Identificazione di risorse comuni. Le risorse usate 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 usano la compressione ZIP.

Vedi anche