Megosztás a következőn keresztül:


Dokumentumok nyomtatása – áttekintés

A Microsoft .NET-tel a Windows Presentation Foundation (WPF) alkalmazást használó alkalmazásfejlesztők számos nyomtatási és nyomtatási rendszerfelügyeleti API-val rendelkeznek. Ennek a funkciónak a lényege az XML Paper Specification (XPS) fájlformátum és az XPS nyomtatási útvonal.

Tudnivalók az XPS-ről

Az XPS egy elektronikus dokumentumformátum, egy spool fájlformátum és egy oldalleírási nyelv. Ez egy nyílt dokumentumformátum, amely XML, Open Packaging-konvenciók és egyéb iparági szabványok használatával hoz létre platformfüggetlen dokumentumokat. Az XPS leegyszerűsíti a digitális dokumentumok létrehozásának, megosztásának, nyomtatásának, megtekintésének és archiválásának folyamatát. További információ az XPS-ről: XPS-dokumentumok.

XPS nyomtatási útvonal

A XPS nyomtatási útvonal egy Windows-funkció, amely újradefiniálja a nyomtatás kezelését a Windows-alkalmazásokban. Az XPS nyomtatási útvonala lecserélhető:

  • Dokumentumbemutatási nyelvek, például Rich Text Formátum vagy Hordozható dokumentumformátum.
  • Nyomtatásisor-formátumok, például Windows Metafile vagy Enhanced Metafile (EMF).
  • Oldalleíró nyelvek, például nyomtatóparancsnyelv vagy PostScript.

Ennek eredményeképpen az XPS nyomtatási útvonal megtartja az XPS formátumot az alkalmazás kiadványától egészen a nyomtatóillesztő vagy -eszköz végső feldolgozásáig.

Az XPS-dokumentumok nyomtatási sor kezelője támogatja mind az XPS nyomtatási útvonalat, mind a GDI nyomtatási útvonalat. Az XPS nyomtatási útvonal natív módon fogad be egy XPS nyomtatási sorfájlt, és XPS-nyomtatóillesztőt igényel. Az XPS nyomtatási útvonal a XPS nyomtatóillesztő (XPSDrv) modellre épül.

Az XPS nyomtatási útvonal előnyei a következők:

  • WYSIWYG nyomtatás támogatása.
  • A speciális színprofilok natív támogatása, például csatornánként 32 bit, a CMYK színmodell, elnevezett színek, n-tinták, valamint átlátszóságok és színátmenetek.
  • Továbbfejlesztett nyomtatási teljesítmény – Az XPS funkciói és fejlesztései csak az XPS nyomtatási útvonalat megcélzott alkalmazások számára érhetők el.
  • Iparági szabvány XPS formátum.

Az alapszintű nyomtatási forgatókönyvek esetében egy egyszerű és intuitív API érhető el egy szabványos felhasználói felülettel a nyomtatás konfigurálásához és a feladatok beküldéshez. Speciális forgatókönyvek esetén az API támogatja a felhasználói felület testreszabását, vagy egyáltalán nem támogatja a felhasználói felületet, a szinkron vagy aszinkron nyomtatást, valamint a kötegelt nyomtatási képességeket. Az egyszerű és a speciális lehetőségek egyaránt teljes vagy részleges megbízhatósági módban nyújtanak nyomtatási támogatást.

Az XPS-t a bővíthetőség szem előtt tartásával tervezték, így a funkciók és képességek modulárisan bővíthetők az XPS-hez. A bővíthetőségi funkciók a következők:

  • Olyan nyomtatási séma, amely támogatja az eszköz képességeinek gyors kiterjesztését. A séma nyilvános része rendszeresen frissül a kívánt eszközképességek hozzáadásához. További információ: Bővíthető architektúra.
  • Egy bővíthető szűrőfolyamat, amelyet az XPSDrv-illesztőprogramok az XPS-dokumentumok közvetlen és méretezhető nyomtatásának támogatására használnak. A további információkért lásd: XPSDrv nyomtatóillesztők.

A WPF-alkalmazások natív módon támogatják az XPS nyomtatási útvonalat, és az XPS nyomtatási API-kkal közvetlenül az XPSDrv illesztőprogramba nyomtathatnak. Ha az írási művelet célnyomtatási üzenetsora nem rendelkezik XPSDrv illesztőprogrammal, akkor a Write osztály WriteAsync és XpsDocumentWriter metódusai automatikusan XPS-ről GDI formátumra konvertálják a tartalmat a GDI nyomtatási útvonalához.

Az alábbi ábra a nyomtatási alrendszert mutatja be, és meghatározza a Microsoft és a független szoftver- és hardvergyártók által biztosított részeket.

Képernyőkép az XPS nyomtatórendszerről.

Alapszintű XPS-nyomtatás

A WPF rendelkezik egy nyomtatási API-val, amely támogatja az alapszintű és a speciális nyomtatási funkciókat is. Azoknál az alkalmazásoknál, amelyek nem igényelnek részletes nyomtatási testreszabást vagy hozzáférést a teljes XPS-funkciókészlethez, elegendő lehet az alapszintű nyomtatás támogatása. Az alapszintű nyomtatási támogatás egy PrintDialog vezérlőn keresztül érhető el, amely minimális konfigurációt igényel, jól ismert felhasználói felülettel rendelkezik, és számos XPS-funkciót támogat.

Nyomtatási párbeszédablak

A System.Windows.Controls.PrintDialog vezérlő egyetlen belépési pontot biztosít a felhasználói felület, a konfiguráció és az XPS-feladatok beküldéshez. A vezérlő példányosításáról és használatáról a Nyomtatási párbeszédpanel megjelenítésecímű témakörben olvashat.

Speciális XPS-nyomtatás

Az XPS-funkciók teljes készletének eléréséhez használja a speciális nyomtatási API-t. Ebben a szakaszban számos releváns API-t ismertetünk, többek között PrintTicket, PrintCapabilities, PrintServer, PrintQueueés XpsDocumentWriter. Az XPS nyomtatási útvonal API-k teljes listáját a System.Windows.Xps és a System.Printing névterekben találja.

Nyomtatási Jegy és Nyomtatási Képességek

A PrintTicket és PrintCapabilities osztályok a fejlett XPS-funkciók alapjai. Mindkét objektum a nyomtatási séma által meghatározott, nyomtatásorientált funkciók XML-formátumú struktúráit tartalmazza. A funkciók közé tartozik a kétoldalas nyomtatás, a rendezés, a kétoldalas nyomtatás és a stapling. A PrintTicket arra utasítja a nyomtatót, hogyan dolgozza fel a nyomtatási feladatokat. A PrintCapabilities osztály határozza meg a nyomtató képességeit. A nyomtató képességeinek lekérdezésével létrehozhat egy PrintTicket, amely teljes mértékben kihasználja a nyomtató támogatott funkcióit. Hasonlóképpen, a nem támogatott funkciók is elkerülhetők.

Az alábbi példa lekérdezi a nyomtató PrintCapabilities-ját, és kóddal létrehoz egy PrintTicket-et.

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

PrintServer és PrintQueue

A PrintServer osztály egy hálózati nyomtatókiszolgálót, a PrintQueue osztály pedig a nyomtatót és a hozzá társított kimeneti feladatsort jelöli. Ezek az API-k együttesen támogatják a kiszolgáló nyomtatási feladatainak speciális kezelését. A PrintServervagy annak egyik származtatott osztálya egy PrintQueuekezelésére szolgál.

Az alábbi példa létrehoz egy LocalPrintServer, és kóddal éri el a helyi számítógép 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 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 (XPS dokumentumíró)

XpsDocumentWriter-t számos Write és WriteAsync metódussal XPS-dokumentumok hozzáadására használnak egy PrintQueue-hoz. A Write(FixedDocumentSequence, PrintTicket) metódussal például szinkronizálva adhat hozzá egy XPS-dokumentumot nyomtatási jegyekkel az üzenetsorhoz. A WriteAsync(FixedDocumentSequence, PrintTicket) metódussal aszinkron módon adhat hozzá egy nyomtatási jegyet tartalmazó XPS-dokumentumot az üzenetsorhoz.

Az alábbi példa létrehoz egy XpsDocumentWriter-t, és XPS dokumentumokat szinkron és aszinkron módon ad hozzá egy PrintQueue-hez kód segítségével.

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

A GDI nyomtatási útvonala

Bár a WPF-alkalmazások natív módon támogatják az XPS nyomtatási útvonalát, a GDI nyomtatási útvonalára is képesek a Write osztály egyik WriteAsync vagy XpsDocumentWriter metódusának meghívásával, valamint a nem XpsDrv nyomtató nyomtatási üzenetsorának kiválasztásával.

Az XPS-funkciókat vagy támogatást nem igénylő alkalmazások esetében az aktuális GDI nyomtatási útvonal változatlan marad. A GDI nyomtatási útvonaláról és a különböző XPS-konverziós lehetőségekről további információ található a Microsoft XPS-dokumentumkonverter (MXDC) és XPSDrv nyomtató-illesztőprogramok.

XPSDrv illesztőprogram-modell

Az XPS nyomtatási útvonala javítja a spooler hatékonyságát azáltal, hogy az XPS-t használja natív nyomtatásisor-formátumként, amikor XPS-kompatibilis nyomtatóra vagy illesztőprogramra nyomtatunk. Az EMF-vel ellentétben, amely az alkalmazás kimenetét a GDI-be irányuló hívások sorozataként jeleníti meg a renderelési szolgáltatásokhoz, az XPS-várólisták formátuma a dokumentumot jelöli. Így ha az XPS-fájlokat XPS-alapú nyomtatóillesztőkre írják ki, nem igényelnek további értelmezést, mivel az illesztőprogramok közvetlenül az adott formátumú adatokon működnek. Ez a funkció kiküszöböli az EMF-fájlokhoz és a GDI-alapú nyomtatóillesztőkhöz szükséges adat- és színtérátalakításokat.

Az egyszerűsített várólistázási folyamat szükségtelenné teszi egy köztes várólistafájl( például EMF-adatfájl) létrehozásának szükségességét a dokumentum várólistára helyezése előtt. Kisebb nyomtatási méret esetén az XPS nyomtatási útvonala csökkentheti a hálózati forgalmat, és javíthatja a nyomtatási teljesítményt. Az EMF-ekvivalensekhez képest az XPS-fájlméretek általában csökkennek az XPS nyomtatási útvonalának használatakor. A Spool fájlméretének csökkentése több mechanizmussal történik:

  • Betűtípus-felosztási, amely csak a dokumentumban használt karaktereket tárolja az XPS-fájlban.
  • Speciális grafikai támogatás, amely natív módon támogatja az átlátszóságot és a színátmenetes primitíveket az XPS-tartalom raszterizálásának elkerülése érdekében.
  • Gyakori erőforrások azonosítása, például egy dokumentumon többször használt vállalati embléma képe. A közös erőforrások megosztott erőforrásokként vannak kezelve, és csak egyszer töltődnek be.
  • Az összes XPS-dokumentumhoz használtZIP-tömörítés.

Előfordulhat, hogy az XPS nyomtatási fájlmérete nem csökken, ha egy vektorgrafika rendkívül összetett, többrétegű vagy nem hatékonyan megírt. A GDI-fájlokkal ellentétben az XPS-fájlok eszköz- és számítógépes betűtípusokat ágyaznak be a képernyőmegjelenítési célokra, bár mindkét betűtípust részkészletként használják, és a nyomtatóillesztők eltávolíthatják az eszközbetűtípusokat, mielőtt elküldenék a fájlt a nyomtatónak.

Jótanács

XPS-fájlokat is nyomtathat PrintQueue.AddJob módszerekkel. További információ: XPS-fájlok nyomtatása.

Lásd még