Utskriftsöversikt
Med Microsoft .NET Framework har programutvecklare som använder Windows Presentation Foundation (WPF) en omfattande ny uppsättning API:er för hantering av utskrifts- och utskriftssystem. Med Windows Vista är vissa av dessa förbättringar av utskriftssystemet också tillgängliga för utvecklare som skapar Windows Forms-program och utvecklare med ohanterad kod. Kärnan i den här nya funktionen är det nya filformatet för XML-pappersspecifikation (XPS) och den nya XPS-utskriftssökvägen.
Det här avsnittet innehåller följande avsnitt.
Om XPS
XPS är ett elektroniskt dokumentformat, ett spoolfilformat och ett sidbeskrivningsspråk. Det är ett öppet dokumentformat som använder XML, Open Packaging Conventions (OPC) och andra branschstandarder för att skapa plattformsoberoende dokument. XPS förenklar processen med vilken digitala dokument skapas, delas, skrivs ut, visas och arkiveras. Mer information om XPS finns i XPS-dokument.
Flera tekniker för att skriva ut XPS-baserat innehåll med WPF visas i Programmatically Print XPS Files. Det kan vara bra att referera till de här exemplen under granskningen av innehållet i det här avsnittet. (Ohanterade kodutvecklare bör se dokumentationen för funktionen MXDC_ESCAPE. Windows Forms-utvecklare måste använda API:et i System.Drawing.Printing namnrymd som inte stöder den fullständiga XPS-utskriftssökvägen, men som stöder en hybrid-GDI-till-XPS-utskriftssökväg. Se arkitektur för utskriftssökväg nedan.)
XPS-utskriftsväg
Utskriftssökvägen för XML Paper Specification (XPS) är en ny Windows-funktion som omdefinierar hur utskrifter hanteras i Windows-program. Eftersom XPS kan ersätta ett dokumentpresentationsspråk (till exempel RTF), ett utskriftspoolformat (till exempel WMF) och ett sidbeskrivningsspråk (till exempel PCL eller Postscript). den nya utskriftssökvägen behåller XPS-formatet från programpublikationen till den slutliga bearbetningen i utskriftsdrivrutinen eller enheten.
XPS-utskriftssökvägen bygger på XPS-skrivardrivrutinsmodellen (XPSDrv), som ger flera fördelar för utvecklare, till exempel "vad du ser är vad du får" (WYSIWYG) utskrift, förbättrat färgstöd och avsevärt förbättrad utskriftsprestanda. (Mer information om XPSDrv finns i dokumentationen Windows Driver Kit.)
Utskriftshanterarens funktion för XPS-dokument är i stort sett densamma som i tidigare versioner av Windows. Det har dock förbättrats för att stödja XPS-utskriftssökvägen utöver den befintliga GDI-utskriftssökvägen. Den nya utskriftssökvägen hanterar nativt en XPS-spoolfil. Även om skrivardrivrutiner i användarläge som skrivits för tidigare versioner av Windows fortsätter att fungera, krävs en XPS-skrivardrivrutin (XPSDrv) för att kunna använda XPS-utskriftssökvägen.
Fördelarna med XPS-tryckvägen är betydande och omfattar:
WYSIWYG-utskriftsstöd
Internt stöd för avancerade färgprofiler, som omfattar 32 bitar per kanal (bpc), CMYK, namngivna färger, n-bläck och inbyggt stöd för transparens och toningar.
Förbättrad utskriftsprestanda för både .NET Framework- och Win32-baserade program.
XPS-format av branschstandard.
För grundläggande utskriftsscenarier är ett enkelt och intuitivt API tillgängligt med en enda startpunkt för användargränssnitt, konfiguration och jobböverföring. För avancerade scenarier läggs ytterligare stöd till för användargränssnittet alls, synkrona eller asynkrona utskrifter och batchutskriftsfunktioner. Båda alternativen ger utskriftsstöd i fullständigt eller partiellt förtroendeläge.
XPS har utformats med utökningsbarhet i åtanke. Med hjälp av utökningsramverket kan funktioner och funktioner läggas till i XPS på ett modulärt sätt. Utökningsbarhetsfunktioner inkluderar:
Skriv ut schema. Det offentliga schemat uppdateras regelbundet och möjliggör snabb förlängning av enhetsfunktioner. (Se PrintTicket och PrintCapabilities nedan.)
Utökningsbar filterpipeline. XPS-skrivardrivrutinens filterpipeline (XPSDrv) har utformats för att möjliggöra både direkt och skalbar utskrift av XPS-dokument. Mer information finns i XPSDrv-skrivardrivrutiner.
Arkitektur för utskrivningsväg
Även om både Win32- och .NET Framework-program stöder XPS använder Win32- och Windows Forms-program en GDI-till XPS-konvertering för att skapa XPS-formaterat innehåll för XPS-skrivardrivrutinen (XPSDrv). Dessa program behöver inte använda XPS-utskriftssökväg och kan fortsätta att använda EMF-baserad utskrift (Enhanced Metafile). De flesta XPS-funktioner och förbättringar är dock endast tillgängliga för program som riktar sig till XPS-utskriftssökvägen.
XpS-skrivardrivrutinen (XPSDrv) stöder konvertering av GDI till XPS-format för att aktivera användning av XPSDrv-baserade skrivare från Win32- och Windows Forms-program. XPSDrv-modellen innehåller också en konverterare för XPS till GDI-format så att Win32-program kan skriva ut XPS-dokument. För WPF-program sker konverteringen av XPS till GDI-format automatiskt av Write- och WriteAsync-metoderna i klassen XpsDocumentWriter när målutskriftskön för skrivåtgärden inte har någon XPSDrv-drivrutin. (Windows Forms-program kan inte skriva ut XPS-dokument.)
Följande bild visar undersystemet för utskrift och definierar de delar som tillhandahålls av Microsoft och de delar som definieras av programvaru- och maskinvaruleverantörer:
Grundläggande XPS-utskrift
WPF definierar både ett grundläggande och avancerat API. För de program som inte kräver omfattande utskriftsanpassning eller åtkomst till den fullständiga XPS-funktionsuppsättningen är grundläggande utskriftsstöd tillgängligt. Grundläggande utskriftsstöd exponeras via en utskriftsdialogruta som kräver minimal konfiguration och har ett välbekant användargränssnitt. Många XPS-funktioner är tillgängliga med den här förenklade utskriftsmodellen.
PrintDialog
Kontrollen System.Windows.Controls.PrintDialog tillhandahåller en enda startpunkt för UI, konfiguration och XPS-jobböverföring. Information om hur du instansierar och använder kontrollen finns i Anropa en utskriftsdialogruta.
Avancerad XPS-utskrift
För att få åtkomst till den fullständiga uppsättningen XPS-funktioner måste det avancerade utskrifts-API:et användas. Flera relevanta API beskrivs mer detaljerat nedan. En fullständig lista över API:er för XPS-utskriftssökvägen finns i namnområdesreferenserna System.Windows.Xps och System.Printing.
PrintTicket och PrintCapabilities
Klasserna PrintTicket och PrintCapabilities utgör grunden för de avancerade XPS-funktionerna. Båda typerna av objekt är XML-formaterade strukturer med utskriftsorienterade funktioner som sortering, dubbelsidig utskrift, häftning osv. Dessa strukturer definieras av utskriftsschemat. En PrintTicket instruerar en skrivare hur du bearbetar ett utskriftsjobb. Klassen PrintCapabilities definierar funktionerna i en skrivare. Genom att fråga efter funktionerna i en skrivare kan du skapa en PrintTicket som drar full nytta av en skrivares funktioner som stöds. På samma sätt kan funktioner som inte stöds undvikas.
I följande exempel visas hur du frågar efter PrintCapabilities för en skrivare och skapar en PrintTicket med hjälp av kod.
// ---------------------- 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 och PrintQueue
Klassen PrintServer representerar en nätverksutskriftsserver och klassen PrintQueue representerar en skrivare och den utdatajobbkö som är associerad med den. Tillsammans tillåter dessa API:er avancerad hantering av en servers utskriftsjobb. En PrintServer, eller en av dess härledda klasser, används för att hantera en PrintQueue. Metoden AddJob används för att infoga ett nytt utskriftsjobb i kön.
I följande exempel visas hur du skapar en LocalPrintServer och får åtkomst till dess standard PrintQueue med hjälp av kod.
// -------------------- 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
En XpsDocumentWriter, med dess många Write och WriteAsync metoder, används för att skriva XPS-dokument till en PrintQueue. Metoden Write(FixedPage, PrintTicket) används till exempel för att mata ut ett XPS-dokument och PrintTicket synkront. Metoden WriteAsync(FixedDocument, PrintTicket) används för att mata ut ett XPS-dokument och PrintTicket asynkront.
I följande exempel visas hur du skapar en XpsDocumentWriter med hjälp av kod.
// -------------------- 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()
De AddJob metoderna ger också sätt att skriva ut. Se programmatiskt skriva ut XPS-filer. för mer information.
GDI-utskriftssökväg
WPF-program har inbyggt stöd för XPS-utskriftssökvägen, men Win32- och Windows Forms-program kan också dra nytta av vissa XPS-funktioner. XPS-skrivardrivrutinen (XPSDrv) kan konvertera GDI-baserade utdata till XPS-format. För avancerade scenarier stöds anpassad konvertering av innehåll med hjälp av Microsoft XPS Document Converter (MXDC). På samma sätt kan WPF-program också mata ut till GDI-utskriftssökvägen genom att anropa någon av metoderna Write eller WriteAsync i klassen XpsDocumentWriter och ange en skrivare som inte är XpsDrv som målutskriftskö.
För program som inte kräver XPS-funktioner eller stöd förblir den aktuella GDI-utskriftssökvägen oförändrad.
- Mer referensmaterial om GDI-utskriftssökvägen och de olika alternativen för XPS-konvertering finns i Microsoft XPS Document Converter (MXDC) och XPSDrv-skrivardrivrutiner.
XPSDrv-drivrutinsmodell
XPS-utskriftssökvägen förbättrar utskriftshanterarens effektivitet genom att använda XPS som inbyggt utskriftspoolformat när du skriver ut till en XPS--enabled skrivare eller drivrutin. Den förenklade buffringsprocessen eliminerar behovet av att generera en mellanliggande spoolfil, till exempel en EMF-datafil, innan dokumentet buffrats. Genom mindre spool-filstorlekar kan XPS-utskriftssökvägen minska nätverkstrafiken och förbättra utskriftsprestandan.
EMF är ett stängt format som representerar programutdata som en serie anrop till GDI för renderingstjänster. Till skillnad från EMF representerar XPS-spoolformatet det faktiska dokumentet utan att kräva ytterligare tolkning när du matar ut till en XPS-baserad skrivardrivrutin (XPSDrv). Drivrutinerna kan arbeta direkt på data i det aktuella formatet. Den här funktionen eliminerar de data- och färgrymdskonverteringar som krävs när du använder EMF-filer och GDI-baserade utskriftsdrivrutiner.
Storlekarna på Spool-filer minskas vanligtvis när du använder XPS-dokument som är inriktade på en XPS-skrivardrivrutin (XPSDrv) jämfört med deras EMF-motsvarigheter. Det finns dock undantag:
En vektorgrafik som är mycket komplex, flerskiktad eller ineffektivt skriven kan vara större än en bitmappad version av samma bild.
I skärmvisningssyfte bäddar XPS-filer in enhetsteckensnitt samt datorbaserade teckensnitt. Medan GDI-spoolfiler inte bäddar in enhetsteckensnitt. Men båda typerna av teckensnitt är deluppsättningar (se nedan) och skrivardrivrutiner kan ta bort enhetsteckensnitten innan filen överförs till skrivaren.
Minskning av spolstorleken utförs genom flera mekanismer:
Teckensnittsdelmängd. Endast tecken som används i det faktiska dokumentet lagras i XPS-filen.
Avancerat Grafisstöd. Internt stöd för transparens och toningsprimitatorer undviker rastrering av innehåll i XPS-dokumentet.
Identifiering av vanliga resurser. Resurser som används flera gånger (till exempel en bild som representerar en företagslogotyp) behandlas som delade resurser och läses bara in en gång.
ZIP-komprimering. Alla XPS-dokument använder ZIP-komprimering.
Se även
.NET Desktop feedback