Přehled tisku

S rozhraním Microsoft .NET Framework mají vývojáři aplikací využívající windows Presentation Foundation (WPF) bohatou novou sadu rozhraní API pro správu tisku a tisku. V systému Windows Vista jsou některá z těchto vylepšení tiskového systému k dispozici také vývojářům, kteří vytvářejí model Windows Forms aplikace a vývojáře pomocí nespravovaného kódu. Jádrem této nové funkce je nový formát souboru XPS (XML Paper Specification) a cesta k tisku XPS.

Toto téma obsahuje tyto části:

O systému XPS

XPS je formát elektronického dokumentu, formát souboru zařazování a jazyk popisu stránky. Jedná se o formát otevřeného dokumentu, který k vytváření multiplatformních dokumentů používá XML, Open Packaging Conventions (OPC) 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 systému XPS naleznete v tématu Dokumenty XPS.

Několik technik pro tisk obsahu založeného na XPS pomocí WPF je demonstrováno v programu tisk souborů XPS. Při kontrole obsahu obsaženého v tomto tématu může být užitečné na tyto ukázky odkazovat. (Nespravované vývojáři kódu by měli vidět dokumentaci pro MXDC_ESCAPE funkce. model Windows Forms vývojáři musí použít rozhraní API v System.Drawing.Printing oboru názvů, který nepodporuje úplnou cestu tisku XPS, ale podporuje hybridní cestu tisku GDI-to-XPS. Viz architektura cesty tisku níže.)

Cesta tisku ve formátu XPS

Cesta k tisku ve formátu XPS (XML Paper Specification) je nová funkce systému Windows, která předefinuje způsob zpracování tisku v aplikacích systému Windows. Vzhledem k tomu, že XPS může nahradit jazyk prezentace dokumentu (například RTF), formát zařazování tisku (například WMF) a jazyk popisu stránky (například PCL nebo Postscript); nová cesta tisku udržuje formát XPS z publikace aplikace do konečného zpracování v ovladači tisku nebo zařízení.

Cesta tisku XPS je postavena na modelu ovladače tiskárny XPS (XPSDrv), který poskytuje několik výhod pro vývojáře, jako je například "to, co vidíte" (WYSIWYG), tisk, vylepšená podpora barev a výrazně lepší výkon tisku. (Další informace o XPSDrv najdete v tématu Dokumentace k sadě Windows Driver Kit.)

Operace zařazování tisku pro dokumenty XPS je v podstatě stejná jako v předchozích verzích systému Windows. Byla však vylepšena tak, aby podporovala cestu tisku XPS kromě existující cesty tisku GDI. Nová cesta k tisku nativně využívá soubor fondu XPS. Zatímco ovladače tiskárny v uživatelském režimu napsané pro předchozí verze systému Windows budou nadále fungovat, je k použití cesty tisku XPS vyžadován ovladač tiskárny XPS (XPSDrv).

Výhody tiskové cesty XPS jsou významné a zahrnují:

  • Podpora tisku WYSIWYG

  • Nativní podpora pokročilých barevných profilů, mezi které patří 32 bitů na kanál (bpc), CMYK, pojmenované barvy, n-inky a nativní podpora průhlednosti a přechodů.

  • Vylepšený výkon tisku pro aplikace založené na rozhraní .NET Framework a Win32

  • Standardní formát XPS.

Pro základní scénáře tisku je jednoduché a intuitivní rozhraní API k dispozici s jedním vstupním bodem pro uživatelské rozhraní, konfiguraci a odeslání úlohy. Pro pokročilé scénáře se přidá další podpora uživatelského rozhraní, synchronní nebo asynchronní tisk a možnosti dávkového tisku. Obě možnosti poskytují podporu tisku v režimu plného nebo částečného vztahu důvěryhodnosti.

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

  • Vytisknout schéma. Veřejné schéma se pravidelně aktualizuje a umožňuje rychlé rozšíření funkcí zařízení. (Viz PrintTicket a PrintCapabilities níže.)

  • Kanál rozšiřitelného filtru Kanál filtru tiskárny XPS (XPSDrv) byl navržen tak, aby umožňoval přímý i škálovatelný tisk dokumentů XPS. Další informace naleznete v tématu XPSDrv Ovladače tiskárny.

I když aplikace Win32 i .NET Framework podporují XPS, Win32 a model Windows Forms aplikace používají převod GDI na XPS k vytvoření obsahu ve formátu XPS pro ovladač tiskárny XPS (XPSDrv). Tyto aplikace nejsou nutné k použití cesty tisku XPS a mohou pokračovat v používání tisku založeného na EMF (Enhanced Metafile). Většina funkcí a vylepšení XPS je však k dispozici pouze pro aplikace, které cílí na cestu tisku ve formátu XPS.

Aby bylo možné používat tiskárny založené na xpSDrv aplikacích Win32 a model Windows Forms, ovladač tiskárny XPS (XPSDrv) podporuje převod GDI na formát XPS. Model XPSDrv také poskytuje převaděč pro FORMÁT XPS na GDI, aby aplikace Win32 mohly tisknout XPS Documents. U aplikací WPF se převod XPS na formát GDI provádí automaticky pomocí Write metod třídy WriteAsyncXpsDocumentWriter , kdykoli cílová tisková fronta operace zápisu nemá ovladač XPSDrv. (model Windows Forms aplikace nemohou tisknout dokumenty XPS.)

Následující obrázek znázorňuje subsystém tisku a definuje části poskytované Společností Microsoft a části definované dodavateli softwaru a hardwaru:

Screenshot shows the XPS print system.

Základní tisk ve formátu XPS

WPF definuje základní i pokročilé rozhraní API. Pro aplikace, které nevyžadují rozsáhlé přizpůsobení tisku nebo přístup k kompletní sadě funkcí XPS, je k dispozici základní podpora tisku. Podpora základního tisku je přístupná prostřednictvím ovládacího prvku dialogového okna tisku, který vyžaduje minimální konfiguraci a funkce známého uživatelského rozhraní. Mnoho funkcí XPS je k dispozici pomocí tohoto zjednodušeného tiskového modelu.

PrintDialog

Ovládací System.Windows.Controls.PrintDialog prvek poskytuje jeden vstupní bod pro odeslání úlohy uživatelského rozhraní, konfigurace a XPS. Informace o vytvoření instance a použití ovládacího prvku naleznete v tématu Vyvolání dialogového okna tisk.

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

Pokud chcete získat přístup k celé sadě funkcí XPS, musíte použít pokročilé rozhraní API pro tisk. Níže je popsáno několik relevantních rozhraní API. Úplný seznam rozhraní API cest tisku ve formátu XPS najdete v odkazech na obor názvů a System.Printing odkazy na System.Windows.Xps obor názvů.

PrintTicket a PrintCapabilities

PrintCapabilities Třídy PrintTicket jsou základem pokročilých funkcí XPS. Oba typy objektů jsou struktury ve formátu XML tiskových funkcí, jako je kolace, oboustranný tisk, sešívání atd. Tyto struktury jsou definovány schématem tisku. A 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 ukazuje, jak dotazovat PrintCapabilities tiskárnu a vytvořit PrintTicket pomocí kódu.

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

Třída PrintServer představuje síťový tiskový server a PrintQueue třída představuje tiskárnu a frontu výstupní úlohy, která je k ní přidružena. Společně tato rozhraní API umožňují pokročilou správu tiskových úloh serveru. A PrintServer, nebo jedna z jeho odvozených tříd, slouží ke správě PrintQueue. Metoda AddJob se používá k vložení nové tiskové úlohy do fronty.

Následující příklad ukazuje, jak vytvořit LocalPrintServer a přistupovat k jeho výchozí PrintQueue pomocí kódu.

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

, XpsDocumentWriters mnoha a WriteAsync metodami, se používá k zápisu Write XPS dokumentů do PrintQueue. Metoda se například Write(FixedPage, PrintTicket) používá k výstupu dokumentu XPS a PrintTicket synchronně. Metoda WriteAsync(FixedDocument, PrintTicket) se používá k výstupu dokumentu XPS a PrintTicket asynchronně.

Následující příklad ukazuje, jak vytvořit XpsDocumentWriter pomocí kódu.

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

Metody AddJob také poskytují způsoby tisku. Viz programový tisk souborů XPS. podrobnosti.

Cesta k tisku GDI

Zatímco aplikace WPF nativně podporují cestu tisku XPS, Win32 a model Windows Forms aplikace mohou také využívat některé funkce XPS. Ovladač tiskárny XPS (XPSDrv) může převést výstup založený na GDI na formát XPS. U pokročilých scénářů se vlastní převod obsahu podporuje pomocí převaděče dokumentů MXDC (Microsoft XPS Document Converter). Podobně aplikace WPF mohou také výstup do cesty tisku GDI voláním jedné z Write metod WriteAsyncXpsDocumentWriter třídy a určení tiskárny bez xpsDrv jako cílové tiskové fronty.

U aplikací, které nevyžadují funkci XPS nebo podporu, zůstane aktuální cesta k tisku GDI beze změny.

Model ovladače XPSDrv

Cesta tisku XPS zlepšuje efektivitu zařazování pomocí XPS jako nativního formátu tiskového fondu při tisku na tiskárnu nebo ovladač s podporou XPS. Zjednodušený proces zařazování eliminuje potřebu vygenerovat zprostředkující soubor fondu, například datový soubor EMF, před zařazováním dokumentu. Prostřednictvím menších velikostí souborů zařazování může cesta tisku XPS snížit síťový provoz a zlepšit výkon tisku.

EMF je uzavřený formát, který představuje výstup aplikace jako řadu volání do GDI pro vykreslovací služby. Na rozdíl od EMF formát zařazování XPS představuje skutečný dokument bez nutnosti další interpretace při výstupu do ovladače tiskárny založeného na XPS (XPSDrv). Ovladače můžou pracovat přímo s daty ve formátu. Tato funkce eliminuje převody dat a barevného prostoru potřebné při použití souborů EMF a ovladačů tisku založených na GDI.

Velikosti souborů zařazování se obvykle snižují při použití xpS Documents, které cílí na ovladač tiskárny XPS (XPSDrv) ve srovnání s jejich ekvivalenty EMF; existují však výjimky:

  • Vektorová grafika, která je velmi složitá, vícevrstvé nebo neefektivní napsaná, může být větší než rastrová verze stejného obrázku.

  • Pro účely zobrazení obrazovky soubory XPS vkládají písma zařízení i písma založená na počítači; zatímco soubory zařazování GDI nevkládají písma zařízení. Oba typy písem jsou ale podeettedy (viz níže) a ovladače tiskárny mohou před přenosem souboru do tiskárny odebrat písma zařízení.

Zmenšení velikosti fondu se provádí prostřednictvím několika mechanismů:

  • Podnastavení písma V souboru XPS jsou uloženy pouze znaky použité ve skutečném dokumentu.

  • Rozšířená podpora grafiky. Nativní podpora průhlednosti a primitiv přechodu zabraňuje rasterizaci obsahu v dokumentu XPS.

  • Identifikace běžných prostředků. Prostředky, které se používají vícekrát (například obrázek představující firemní logo), se považují za sdílené prostředky a načtou se jenom jednou.

  • Komprese ZIP. Všechny dokumenty XPS používají kompresi ZIP.

Viz také