Condividi tramite


Panoramica della 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 Windows Form e sviluppatori 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 contiene le sezioni seguenti.

Informazioni su XPS

XPS è un formato di documento elettronico, un formato di file di spooling e un linguaggio 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 contenuto basato su XPS tramite WPF sono illustrate in Stampare file XPS programmaticamente. Può risultare utile fare riferimento a questi esempi durante la revisione del contenuto contenuto in questo argomento. Gli sviluppatori di codice non gestito dovrebbero vedere la documentazione per la funzione MXDC_ESCAPE. Gli sviluppatori Windows Forms devono usare l'API nello spazio dei nomi System.Drawing.Printing che non supporta il percorso di stampa XPS completo, ma supporta un percorso di stampa ibrido da GDI a XPS. Vedere l'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 la 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 processo di stampa utilizza nativamente un file spool 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 di colore avanzati, che includono 32 bit per canale (bpc), CMYK, colori denominati, n-ink 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 offrono supporto per la stampa in modalità di attendibilità completa o parziale.

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

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

  • Pipeline di filtro estendibile. 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, le applicazioni Win32 e Windows Forms usano una conversione da GDI a 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 applicazioni Win32 e 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 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. 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 mostra il sistema di stampa XPS.

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 è fornito tramite un controllo della finestra di dialogo di stampa che richiede una configurazione minima e offre un'interfaccia utente intuitiva e familiare. Molte funzionalità XPS sono disponibili usando questo modello di stampa semplificato.

PrintDialog

Il controllo System.Windows.Controls.PrintDialog fornisce un unico punto di ingresso per l'interfaccia utente, la configurazione e la presentazione dei lavori XPS. Per informazioni su come istanziare e usare il controllo, 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, consulta i riferimenti ai namespace System.Windows.Xps e System.Printing.

PrintTicket e PrintCapabilities

Le classi PrintTicket 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 PrintTicket istruisce una stampante su come elaborare un lavoro 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.

Nell'esempio seguente viene illustrato come eseguire una query sul PrintCapabilities di una stampante e creare un PrintTicket usando 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 e la classe PrintQueue rappresenta una stampante e la coda di processi di output associata. Insieme, queste API consentono la gestione avanzata dei processi di stampa di un server. Un PrintServer, o una delle relative classi derivate, viene usato per gestire un PrintQueue. Il metodo AddJob viene utilizzato per inserire un nuovo processo di stampa nella coda.

Nell'esempio seguente viene illustrato come creare un LocalPrintServer e accedere alle PrintQueue predefinite usando 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 (Scrittore di Documenti XPS)

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

Nell'esempio seguente viene illustrato come creare un XpsDocumentWriter usando 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 forniscono anche modi per stampare. Consulta stampare file XPS in modo programmato. 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 inviare al percorso di stampa GDI chiamando uno dei metodi Write o WriteAsync della classe XpsDocumentWriter 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.

Modello di driver XPSDrv

Il percorso di stampa XPS migliora l'efficienza dello spooler usando XPS come formato di spool di stampa nativo durante la stampa su una stampante o un driver XPS -enabled. 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 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 viene inviato a un driver di stampa basato su XPS (XPSDrv). I driver possono operare direttamente sui dati nel formato specifico. 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, multi-strato o scritta in modo inefficiente può essere più grande di una versione bitmap della stessa grafica.

  • Ai fini della visualizzazione dello schermo, i file XPS incorporano tipi di carattere del dispositivo e tipi di carattere basati su computer; mentre i file di spooling GDI non incorporano i tipi di carattere del dispositivo. Ma entrambi i tipi di carattere sono subsettati (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 dello Spool viene eseguita tramite diversi meccanismi:

  • impostazione secondaria del tipo 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 dei gradienti evita la rasterizzazione del contenuto nell'XPS Document.

  • Identificazione delle risorse comuni. Le risorse usate più volte ,ad esempio un'immagine che rappresenta un logo aziendale, vengono considerate come risorse condivise e caricate una sola volta.

  • compressione ZIP. Tutti i documenti XPS usano la compressione ZIP.

Vedere anche