Sdílet prostřednictvím


Přehled tisku dokumentů (WPF .NET)

S microsoft .NET mají vývojáři aplikací využívající windows Presentation Foundation (WPF) bohatou sadu rozhraní API pro správu tiskového a tiskového systému. Jádrem této funkce je formát souboru XPS (XML Paper Specification) a cesta k tisku XPS.

O systému XPS

XPS je formát elektronického dokumentu, formát souboru fronty tisku a jazyk popisu stránky. Jedná se o formát otevřeného dokumentu, který k vytváření multiplatformních dokumentů používá xml, konvence open packaging a další oborové standardy. Systém XPS zjednodušuje proces vytváření, sdílení, tisku, zobrazení a archivace digitálních dokumentů. Další informace o XPS viz XPS Documents.

Cesta tisku XPS

Cesta tisku XPS je funkce systému Windows, která předefinuje způsob zpracování tisku v aplikacích systému Windows. Cesta tisku ve formátu XPS může nahradit:

  • Jazyky prezentace dokumentů, jako je formát RTF nebo Portable Document Format.
  • Formáty tiskového spooleru, jako je Windows Metafile nebo Enhanced Metafile (EMF).
  • Jazyky popisu stránky, jako je například jazyk příkazů tiskárny nebo jazyk PostScript.

V důsledku toho cesta tisku XPS udržuje formát XPS z publikace aplikace až do konečného zpracování v ovladači tiskárny nebo zařízení.

Zásobník tisku pro dokumenty XPS podporuje jak cestu tisku XPS, tak cestu tisku GDI. Cesta tisku XPS nativně využívá XPS zásobník souborů a vyžaduje ovladač tiskárny XPS. Cesta tisku XPS je postavena na modelu ovladače tiskárny XPS (XPSDrv).

Mezi výhody tiskové cesty XPS patří:

  • Podpora tisku WYSIWYG
  • Nativní podpora pokročilých profilů barev, jako jsou například 32 bitů na kanál, barevný model CMYK, pojmenované barvy, n-inky a průsvitné a přechody.
  • Vylepšený výkon tisku – funkce a vylepšení XPS jsou k dispozici pouze pro aplikace, které cílí na cestu tisku XPS.
  • Průmyslový standardní formát XPS.

Pro základní scénáře tisku je k dispozici jednoduché a intuitivní rozhraní API se standardním uživatelským rozhraním pro konfiguraci tisku a odesílání úloh. V případě pokročilých scénářů rozhraní API podporuje přizpůsobení uživatelského rozhraní nebo vůbec žádné uživatelské rozhraní, synchronní nebo asynchronní tisk a možnosti dávkového tisku. Jednoduché i pokročilé možnosti poskytují podporu tisku v režimu plné nebo částečné důvěry.

SYSTÉM XPS byl navržen s ohledem na rozšiřitelnost, takže funkce a možnosti lze do XPS přidat modulárním způsobem. Mezi funkce rozšiřitelnosti patří:

  • Schéma tisku, které podporuje rychlé rozšíření možností zařízení. Veřejná část schématu se pravidelně aktualizuje, aby se přidaly požadované možnosti zařízení. Další informace naleznete v tématu Rozšiřitelná architektura.
  • Rozšiřitelný filtrovací kanál, který ovladače XPSDrv používají k podpoře přímého i škálovatelného tisku dokumentů XPS. Další informace naleznete v tématu ovladače tiskárny XPSDrv.

Aplikace WPF nativně podporují cestu tisku XPS a mohou použít rozhraní API pro tisk XPS k tisku přímo do ovladače XPSDrv. Pokud cílová tisková fronta operace zápisu nemá ovladač XPSDrv, pak Write a WriteAsync metody třídy XpsDocumentWriter automaticky převedou obsah ze formátu XPS na GDI pro cestu k tisku GDI.

Následující obrázek znázorňuje subsystém tisku a definuje části poskytované společností Microsoft a nezávislými dodavateli softwaru a hardwaru.

Snímek obrazovky zobrazující tiskový systém XPS

Základní tisk ve formátu XPS

WPF má rozhraní API pro tisk, které podporuje základní i pokročilé funkce tisku. Pro aplikace, které nevyžadují rozsáhlé přizpůsobení tisku nebo přístup k kompletní sadě funkcí XPS, může stačit základní podpora tisku. Základní podpora tisku je poskytována prostřednictvím ovládacího prvku PrintDialog, který vyžaduje minimální konfiguraci, má známé uživatelské rozhraní a podporuje mnoho funkcí XPS.

PrintDialog

Ovládací prvek System.Windows.Controls.PrintDialog poskytuje jeden vstupní bod pro uživatelské rozhraní, konfiguraci a odesílání úloh XPS. Informace o vytvoření instance a použití ovládacího prvku najdete v tématu Jak zobrazit dialogové okno tisku.

Rozšířený tisk ve formátu XPS

Pokud chcete získat přístup k kompletní sadě funkcí XPS, použijte pokročilé rozhraní API pro tisk. V této části je popsáno několik relevantních rozhraní API, včetně PrintTicket, PrintCapabilities, PrintServer, PrintQueuea XpsDocumentWriter. Úplný seznam rozhraní API pro tiskovou cestu XPS najdete v oborech názvů System.Windows.Xps a System.Printing.

PrintTicket a PrintCapabilities

Třídy PrintTicket a PrintCapabilities jsou základem pokročilých funkcí XPS. Oba objekty obsahují struktury formátované jazykem XML funkcí orientovaných na tisk, které jsou definovány schématem tisku. Mezi tyto funkce patří oboustranný tisk, kolace, oboustranný tisk a sešívání. PrintTicket dává tiskárně pokyn, jak zpracovat tiskovou úlohu. Třída PrintCapabilities definuje možnosti tiskárny. Dotazováním možností tiskárny lze vytvořit PrintTicket, která plně využívá podporované funkce tiskárny. Podobně se můžete vyhnout nepodporovaným funkcím.

Následující příklad dotazuje PrintCapabilities tiskárny a vytvoří PrintTicket pomocí kódu.

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

Tiskový server a tisková fronta

Třída PrintServer představuje síťový tiskový server a třída PrintQueue představuje tiskárnu a frontu výstupní úlohy přidruženou k ní. Tato rozhraní API společně podporují pokročilou správu tiskových úloh pro server. PrintServer, nebo jedna z odvozených tříd, se používá ke správě PrintQueue.

Následující příklad vytvoří LocalPrintServer a přistupuje k PrintQueueCollection místního počítače pomocí kódu.

/// <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, s mnoha metodami Write a WriteAsync, se používá k přidání dokumentů XPS do PrintQueue. Například metoda Write(FixedDocumentSequence, PrintTicket) se používá k synchronnímu přidání dokumentu XPS s tiskovým lístkem do fronty. Metoda WriteAsync(FixedDocumentSequence, PrintTicket) slouží k asynchronnímu přidání dokumentu XPS s lístkem tisku do fronty.

Následující příklad vytvoří XpsDocumentWriter a přidá dokumenty XPS synchronně i asynchronně do PrintQueue pomocí kódu.

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

Tisková trasa GDI

Přestože aplikace WPF nativně podporují cestu tisku XPS, mohou také zajišťovat výstup do cesty tisku GDI tím, že zavolají jednu z metod Write nebo WriteAsync třídy XpsDocumentWriter a vyberou tiskovou frontu pro tiskárnu bez XpsDrv.

U aplikací, které nevyžadují funkci nebo podporu XPS, zůstane aktuální cesta k tisku GDI beze změny. Další informace o cestě k tisku GDI a různých možnostech převodu XPS naleznete v tématu Microsoft XPS Document Converter (MXDC) a ovladače tiskárny XPSDrv.

Model ovladače XPSDrv

Cesta tisku XPS zlepšuje efektivitu spouštění tím, že používá XPS jako nativní formát tiskového jazyků při tisku na tiskárnu nebo ovladač podporující XPS. Na rozdíl od EMF, který představuje aplikační výstup jako sekvenci volání do GDI pro vykreslovací účely, formát zařazování XPS představuje samotný dokument. Když jsou tedy soubory fondu XPS odeslány do ovladače tiskárny založeného na XPS, nevyžadují další interpretaci, protože ovladače s daty v tomto formátu pracují přímo. Tato funkce eliminuje převody dat a barevného prostoru vyžadovaných pro soubory EMF a ovladače tisku založené na GDI.

Zjednodušený proces spooling eliminuje potřebu vygenerovat zprostředkující soubor zásobníku, například datový soubor EMF, před spoolingem dokumentu. Při menší velikosti spoolingových souborů může XPS tisková cesta snížit síťovou zátěž a zlepšit výkon tisku. Ve srovnání s ekvivalenty formátu EMF se velikost fronty tisku XPS obvykle snižuje při použití cesty tisku XPS. Zmenšení velikosti spool souboru probíhá prostřednictvím několika mechanismů.

  • Podmnožina písma, která ukládá pouze znaky použité v dokumentu jako součást souboru XPS.
  • Pokročilá grafika podporuje, což nativně podporuje průhlednost a přechodové primitivy, aby se zabránilo rasterizaci obsahu XPS.
  • Identifikace běžných prostředků, například obrázek firemního loga, který se používá vícekrát v dokumentu. Společné prostředky jsou považovány za sdílené a jsou načteny pouze jednou.
  • komprese ZIP, která se používá pro všechny dokumenty XPS.

Velikost souboru spool ve formátu XPS nemusí být snížena, pokud je vektorová grafika vysoce složitá, vícevrstvá nebo neefektivně zapsaná. Na rozdíl od souborů zařazování GDI soubory XPS vkládají písma zařízení a písma počítače pro účely zobrazení obrazovky, i když oba typy písem jsou podsetě a ovladače tiskárny mohou před přenosem souboru do tiskárny odebrat písma zařízení.

Spropitné

Soubory XPS můžete vytisknout také pomocí PrintQueue.AddJob metod. Další informace naleznete v tématu Jak tisknout soubory XPS.

Viz také