Standard XPS-Filter
Wichtig
Die Modern Print-Plattform ist die von Windows bevorzugte Methode zur Kommunikation mit Druckern. Wir empfehlen die Verwendung des Microsoft IPP-Treibers für die Posteingangsklasse zusammen mit Print Support Apps (PSA), um das Druckverhalten in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.
Weitere Informationen finden Sie unter Modern Print-Plattform und der Anleitung zum Design der Print-Support-App.
Windows stellt zwei (Standard)-XPS-Filter bereit, um die integrierte Konvertierung von XPS in PCL6 und PostScript-Ebene 3 zu unterstützen.
Die von Windows bereitgestellten Filter sind sowohl für Druckklassentreiber als auch modellspezifische v4-Drucktreiber verfügbar. Diese XPS-Filter können nach Bedarf mit IHV-Featurefiltern sowie IHV-Nachbearbeitungsfiltern kombiniert werden, um die Kompatibilität mit vorhandenen Firmware-Implementierungen sicherzustellen.
Windows-bereitgestellte XPS-Filter sind nicht wiederverteilbar und für v3-Drucktreiber nicht verfügbar.
Die Manifestdatei
Um die von Windows bereitgestellten XPS-Filter zu verwenden, muss die v4-Treibermanifestdatei die RequiredFiles-Direktive im Abschnitt "DriverConfig " verwenden, um die Filter anzugeben. Dies sind die Namen der Filter:
MSxpsPCL6.dll. Stellt die Konvertierung von XPS in PCL6 bereit. MSxpsPS.dll. Stellt die Konvertierung von XPS in PostScript-Ebene 3 bereit. Es sind keine INF-Updates erforderlich, um einen dieser Filter zu verwenden, und die Umverteilung wird nicht unterstützt. Es wird empfohlen, dass Benutzer die Verwendung dieser XPS-Filter einstellen.
Print Filter Pipeline Configuration
Um die Druckfilterpipeline für die Verwendung dieser Filter zu konfigurieren, müssen Sie Konfigurationsdateien erstellen, wie in den folgenden Beispielen gezeigt.
Beispielkonfigurationsdatei, die die Konvertierung in PCL6 angibt.
<?xml version="1.0" encoding="utf-8"?>
<Filters>
<Filter dll="MSxpsPCL6.dll" clsid="{3821E518-33AF-4d17-92B3-28EB410D46B6}" name="Microsoft XPS to PCL6">
<Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
<Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
</Filter>
</Filters>
Beispielkonfigurationsdatei, die die Konvertierung in PostScript angibt.
<?xml version="1.0" encoding="utf-8"?>
<Filters>
<Filter dll="MSxpsPS.dll" clsid="{8636D90A-5E03-4d62-9269-E06493C57473}" name="Microsoft XPS to PS">
<Input guid="{4d47a67c-66cc-4430-850e-daf466fe5bc4}" comment="IID_IPrintReadStream" />
<Output guid="{65bb7f1b-371e-4571-8ac7-912f510c1a38}" comment="IID_IPrintWriteStream" />
</Filter>
</Filters>
Unterstützte Features
Die standardmäßigen XPS-Filter unterstützen viele gängige Features. Alle Featuredefinitionen verwenden die GPD- oder PPD-Datei für den Treiber. Der MSxpsPCL6.dll Filter erfordert die Verwendung einer GPD-Datei für die Konfiguration, und der MSxpsPS.dll-Filter erfordert die Verwendung einer PPD-Datei für die Konfiguration. Sofern nicht anders angegeben, wird ein benutzerdefinierter PDL-Befehl für ein Feature verwendet.
Wenn Einfügungszeichenfolgen unter einem bestimmten Abschnitt (angegeben mit dem Befehl "*Reihenfolge ") vorhanden sind, werden im Fall von GPD-Dateien vom Filter eine Reihe von Annahmen über den Inhalt dieser Zeichenfolgen angenommen, und das Senden von Standardbefehlen wird vermieden. Dies liegt daran, dass das Senden von Standardbefehlen in diesem Fall zu Befehlskonflikten führen kann. Daher muss der Ersteller einer GPD-Datei die folgenden Richtlinien befolgen:
JOB_SETUP.#
Ein PCL6 Binary Stream Header (z. B.: "<SP>HP-PCL XL;1;<CR><LF>") muss vorhanden sein.
Ein BeginSession-Operator muss vorhanden sein, einschließlich aller erforderlichen Attribute.
Ein OpenDataSource-Operator muss vorhanden sein, einschließlich aller erforderlichen Attribute.
PAGE_SETUP.#
- Ein BeginPage-Operator muss vorhanden sein, einschließlich aller erforderlichen Attribute.
PAGE_FINISH.#
- Ein EndPage-Operator muss vorhanden sein.
JOB_FINISH.#
Ein CloseDataSource-Operator muss vorhanden sein.
Ein EndSession-Operator muss vorhanden sein.
Ein EndPJLCommands-Operator muss vorhanden sein.
Die XPS-Standardfilter erzeugen geeignete PDL-Daten, um den Ursprung einer Seite basierend auf den Befehlen *PrintableArea, *PrintableOrigin oder *ImageableArea festzulegen. Um einen zusätzlichen Offset vom erwarteten Ursprung zu vermeiden, sollten GPD-Dateien keine =SetPageOrigin-Befehle in der *Cmd-Zeichenfolgendefinition für ihr Papierformat angeben.
Weitere Informationen zu den PrintTicket-Features, die von standardmäßigen XPS-Filtern unterstützt werden, finden Sie unter Unterstützte PrintTicket-Features.
Abrufen von PrintTicket in Nachbearbeitungsfiltern
Im v4-Treibermodell, das mit Windows 8 veröffentlicht wurde, mussten Sie beim Hinzufügen eines Nachbearbeitungsfilters nach einem der MSxps-Filter manchmal auch einen Vorabverarbeitungsfilter hinzufügen. Das Hinzufügen des Vorabverarbeitungsfilters war erforderlich, um das Druckticket auf Auftragsebene zu erfassen. Dieser Ansatz hat jedoch im Wesentlichen einen objektmodellbasierten Filter vor einem der streambasierten MSxps-Filter hinzugefügt, was zu einer Deserialisierung führt, und dann die Serialisierung der Druckdaten, um einfach ein PrintTicket zu extrahieren.
In Windows 8.1 wird das Standardmäßige PrintTicket des Benutzers mit dem PrintTicket auf Auftragsebene in den MSxps-Filtern zusammengeführt, und das zusammengeführte PrintTicket wird dann dem Eigenschaftenbehälter der Druckfilterpipeline hinzugefügt. Das zusammengeführte PrintTicket wird dem Eigenschaftenbehälter der Druckfilterpipeline auf die gleiche Weise wie das User PrintTicket hinzugefügt. Die Eigenschaft wird wie folgt benannt:
#define XPS_FP_JOB_LEVEL_PRINTTICKET "JobPrintTicket"
Während des InitializeFilters fügen die MTI-Filter eine Implementierung von IPrintReadStreamFactory in den Eigenschaftenbehälter hinzu. Die eine Methode dieser Schnittstelle, GetStream, blockiert, bis der PrintTicket-Datenstrom verfügbar ist. Dies ermöglicht die Synchronisierung des Zugriffs auf die Eigenschaft.
Wichtig : Wenn GetStream aus InitializeFilter aufgerufen wird, wird eine Deadlock verursacht.
Andere Funktionen
Im Falle von PrintTicket-Features, die von den standardmäßigen XPS-Filtern nicht unterstützt werden, überprüfen die Filter alle PrintTicket-Member, um festzustellen, ob auf sie in der GPD/PPD verwiesen wird, und geben Sie dann Befehle an, die ausgegeben werden sollen. Wenn ja, werden die angegebenen Befehle generiert.
GPD-Features werden in der folgenden Reihenfolge zugeordnet:
Ein PrintSchemaKeywordMap-Wert wird angegeben und entspricht dem PrintTicket-Featurenamen.
Das PrintSchemaPrivateNamespaceURI-Attribut wird angegeben, und der GPD-Featurename entspricht dem PrintTicket-Featurenamen. Das Abgleichen von Featurenamen ist nicht einfach und folgt einer Reihe von Regeln:
Wenn der Abschnitt *Reihenfolge der ersten Option PAGE_SETUP oder PAGE_FINISH ist und das GPD-Feature nicht mit "Seite" beginnt, wird "Page" dem GPD-Featurenamen vorangestellt, bevor versucht wird, eine Übereinstimmung zu versuchen.
Wenn der Abschnitt *Reihenfolge der ersten Option DOC_SETUP oder DOC_FINISH lautet und die GPD-Funktion nicht mit „Document“ beginnt, wird dem GPD-Funktionsnamen vor dem Abgleichversuch „Document“ vorangestellt.
Wenn der Abschnitt *Reihenfolge der ersten Option JOB_SETUP oder JOB_FINISH lautet und die GPD-Funktion nicht mit „Job“ beginnt, wird dem GPD-Funktionsnamen vor dem Abgleichversuch „Job“ vorangestellt.
Jedes Zeichen, das nicht [A-Z], [a-z], [0-9] oder '_' ist, wird durch ein '_'-Zeichen ersetzt, bevor versucht wird, eine Übereinstimmung zu erzielen. Wenn das Attribut *NoPunctuationCharSubstitute? jedoch auf TRUE gesetzt ist, ersetzt der Filter „.“ oder „-“ nicht durch das Zeichen „_“.
PPD-Features werden in der folgenden Reihenfolge zugeordnet:
Ein PrintSchemaKeywordMap-Wert wird angegeben und es entspricht dem PrintTicket-Featurenamen.
Das PrintSchemaPrivateNamespaceURI-Attribut wird angegeben, und der PPD-Featurename entspricht dem PrintTicket-Featurenamen. Das Abgleichen von Featurenamen ist nicht einfach und folgt einer Reihe von Regeln:
Wenn der Abschnitt "OrderDependency" "ExitServer", "Prolog" oder "JCLSetup" lautet und der PPD-Featurename nicht mit "Auftrag" beginnt, wird "Auftrag" dem PPD-Featurenamen vorangestellt, bevor versucht wird, eine Übereinstimmung zu erzielen.
Wenn der Abschnitt OrderDependency „DocumentSetup“ lautet und der PPD-Funktionsname nicht mit „Document“ beginnt, wird dem PPD-Funktionsnamen vor dem Abgleichversuch „Document“ vorangestellt.
Wenn der Abschnitt "OrderDependency " "AnySetup" lautet, führt der Filter zwei Übereinstimmungsprüfungen aus:
Wenn der PPD-Featurename nicht mit "Document" beginnt, wird "Document" dem PPD-Featurenamen vorangestellt, bevor versucht wird, eine Übereinstimmung zu erzielen.
Wenn keine Übereinstimmung gefunden wird oder der PPD-Featurename nicht mit "Auftrag" beginnt, wird "Auftrag" dem PPD-Featurenamen vorangestellt, bevor versucht wird, eine Übereinstimmung zu erstellen.
Wenn der Abschnitt OrderDependency „PageSetup“ lautet und der PPD-Funktionsname nicht mit „Page“ beginnt, wird dem PPD-Funktionsnamen vor dem Abgleich „Page“ vorangestellt.
Jedes Zeichen, das nicht [A-Z], [a-z], [0-9] oder '_' ist, wird durch ein '_'-Zeichen ersetzt, bevor versucht wird, eine Übereinstimmung zu erzielen. Wenn die *MSNoPunctuationCharSubstitute? Die Zeichenfolge ist auf TRUE festgelegt, der Filter ersetzt nicht '.' oder '-' durch ein '_'-Zeichen.
GPD- und PPD-Optionen werden in der folgenden Reihenfolge zugeordnet:
Ein PrintSchemaKeywordMap-Wert wird angegeben und es entspricht dem PrintTicket-Optionsnamen.
Das PrintSchemaPrivateNamespaceURI-Attribut wird angegeben, und der GPD/PPD-Optionsname entspricht dem PrintTicket-Optionsnamen. Das Abgleichen von Optionsnamen ist nicht einfach und folgt einer Reihe von Regeln:
Wenn der GPD/PPD-Optionsname mit [0-9] oder '_' beginnt, wird dem GPD/PPD-Optionsnamen ein '_' vorangestellt, bevor versucht wird, eine Übereinstimmung zu erstellen. Es gelten jedoch folgende zusätzliche Regeln:
Wenn dies eine GPD-Option ist und das Attribut *NoPunctuationCharSubstitute? auf TRUE gesetzt ist, stellt der Filter dem Zeichen '_' kein '_' voran.
Wenn dies eine PPD-Option ist und die Zeichenfolge *MSNoPunctuationCharSubstitute? auf TRUE gesetzt ist, stellt der Filter dem Zeichen '_' kein '_' voran.
Jedes Zeichen, das nicht [A-Z], [a-z], [0-9] oder '_' ist, wird durch ein '_'-Zeichen ersetzt, bevor versucht wird, eine Übereinstimmung zu erzielen. Es gelten jedoch folgende zusätzliche Regeln:
Wenn dies eine GPD-Option ist und das Attribut *NoPunctuationCharSubstitute? auf TRUE gesetzt ist, ersetzt der Filter „.“ oder „-“ nicht durch das Zeichen „_“.
Wenn dies eine PPD-Option ist und die Zeichenfolge *MSNoPunctuationCharSubstitute? auf TRUE gesetzt ist, ersetzt der Filter „.“ oder „-“ nicht durch das Zeichen „_“.
Formular-zu-Taskleistenzuordnung
Die XPS-zu-PCL6- und XPS-zu-PS-Filter unterstützen die Zuordnungstabelle von Formular zu Taskleiste. Wenn mehrere Trays die ausgewählte Mediengröße (z. B. Buchstaben) unterstützen, brechen die Filter die Bindung wie folgt:
Wenn die Standardleiste (wie in der GPD- oder PPD-Datei angegeben) für die Verwendung der angegebenen Mediengröße konfiguriert ist, wird die Standardleiste verwendet.
Andernfalls wählt der Filter die erste Taskleiste (oben nach unten, wie in der GPD/PPD-Datei angegeben), die mit der angegebenen Mediengröße konfiguriert ist.
Zusätzliche Hintergrundseitenunterdrückung
Standardmäßig verarbeiten die XPS zu PCL6- und XPS-zu-PS-Filter den Duplexdruck von Dokumenten, die gemischte Mediengrößen, Medientypen, Eingabe- oder Ausgabecontainer enthalten, indem sie eine leere Seite einfügen. Wenn die Filter diese leere Seite einfügen, wird das Gerät gezwungen, die nächste Seite vor einem neuen Medium zu drucken. Für Geräte, für die keine Backside-Seite ausgegeben werden muss, kann dieses Verhalten unterdrückt werden, indem der GPD- oder PPD-Datei des Treibers die folgenden Schlüsselwörter hinzugefügt werden.
Dateityp | Schlüsselwort für die Unterdrückung der Backside-Seite |
---|---|
GPD | *SuppressExtraBacksidePages?: TRUE |
PPD | *MSSuppressExtraBacksidePages: True |
Optimieren von SetPageDevice-Befehlen
Das Standardverhalten eines PostScript-Geräts, das einen Treiber mit MSxpsPS.dll verwendet, besteht darin, dass für jede Seite ein SetPageDevice-Befehl ausgegeben wird, und dieser Befehl gibt den vollständigen Satz von Optionen an, die für die Seite angegeben sind. Beachten Sie, dass einige Geräte mit dieser Technik möglicherweise nicht gut funktionieren.
Wenn Ihr Gerät jedoch MSxpsPS.dll verwendet und in der zugehörigen PPD-Datei *MSOptimizeSetPageDevice: True angegeben ist, verhält sich das PostScript-Gerät wie folgt: – Für jede Seite, bei der sich seit der vorherigen Seite ein beliebiger Teil des Befehls SetPageDevice geändert hat, wird ein neuer Befehl SetPageDevice ausgegeben, um die für die Seite angegebenen Optionen anzugeben. Wenn es jedoch seit der vorherigen Seite keine Änderung in einem Teil des Befehls "SetPageDevice" gegeben hat, wird kein SetPageDevice-Befehl für die Seite ausgegeben.