Verwendung des XPS-Rasterungsdienstes
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.
Der XPS-Rasterungsdienst implementiert XPS-Rasterobjekte, die feste Seiten in XPS-Dokumenten in Bitmaps umwandeln. Dieser Dienst vereinfacht das Design eines XPSDrv-Filters, der ein XPS-Dokument als eine Reihe von Bitmap-Bildern rendert. Der Filter kann ein XPS-Rasterobjekt anweisen, ein Bitmap-Bild eines achsenausgerichteten, rechteckigen Bereichs auf einer festen Seite zu erstellen.
Ein XPSDrv-Filter für einen Drucker könnte zum Beispiel voraussetzen, dass eine feste Seite als eine Reihe von horizontalen oder vertikalen Streifen an den Drucker gesendet wird. In diesem Fall weist der Filter das XPS- Rasterobjekt an, jede Reihe als eine separate Bitmap zu rastern. Wenn der Drucker über genügend Speicher verfügt, kann der Filter den Rasterizer auch anweisen, ein Bitmap-Bild der gesamten Seite zu erstellen.
Der XPS-Rasterungsdienst ist in der Systemdatei Xpsrasterservice.dll implementiert. Allerdings greifen die XPSDrv-Filter nicht direkt auf die Einstiegspunkte in dieser DLL zu. Stattdessen greift ein Filter auf die Schnittstellen des XPS-Rasterungsdienstes über die Druckpipeline-Eigenschaftstasche zu, die der Filter vom Druckfilter-Pipeline-Manager erhält.
Um für die Verwendung durch einen XPSDrv-Filter verfügbar zu sein, muss der XPS-Rasterungsdienst in der Konfigurationsdatei der Filterpipeline angegeben werden, die die Filter in der Druckfilterpipeline beschreibt. Genauer gesagt muss die Konfigurationsdatei ein FilterServiceProvider-Element enthalten, dessen dll-Attribut auf den dll-Namen des Dienstes gesetzt ist, wie im folgenden XML-Beispiel gezeigt:
<FilterServiceProvider dll = "XpsRasterService.dll" />
Das Element FilterServiceProvider ist ein untergeordnetes Element des Elements Filter, das die Filter in der Pipeline auflistet. Während der Initialisierung der Pipeline lädt der Druckfilter-Pipeline-Manager den XPS-Rasterungsdienst und macht den Dienst für den Filter über die Eigenschaft bag zugänglich. Ein Beispiel für eine Filter-Pipeline-Konfigurationsdatei, die den XPS Rasterungsdienst lädt, finden Sie im Beispiel XpsRasFilter im WDK. Dieses Beispiel befindet sich im Ordner Src\Print\Xpsrasfilter in Ihrer WDK-Installation.
Erhalten einer XPS-Raster-Factory
Bevor ein XPS-Dokument gerastert wird, muss ein XPSDrv-Filter einen Verweis auf das Factory-Objekt für die Rasterung aus der Eigenschaftstasche der Druckpipeline abrufen. Danach holt sich der Filter für jede feste Seite, die er rendern muss, ein neues XPS- Rasterobjekt aus der Factory.
Um einen XPSDrv-Filter zu initialisieren, fragt der Druckfilter-Pipeline-Manager die Methode IPrintPipelineFilter::InitializeFilter des Filters an und übergibt der Methode die Schnittstelle IPrintPipelinePropertyBag der Eigenschaftentasche als Eingabeparameter.
Um einen Pointer auf das Objekt der XPS- Raster-Factory zu erhalten, fragt der XPSDrv-Filter die Methode IPrintPipelinePropertyBag::GetProperty an. Der Eigenschaftsname "MS_IXpsRasterizationFactory" identifiziert das Objekt der Raster-Factory. Für diese Eigenschaft ist der von GetProperty erhaltene Wert ein Verweis auf die IUnknown-Schnittstelle des Raster-Factory-Objekts. Nachdem er diese Schnittstelle erhalten hat, muss der Filter die Methode IUnknown::QueryInterface anfragen, um einen Verweis auf die Schnittstelle IXpsRasterizationFactory des Objekts zu erhalten. Anschließend kann der Filter die Methode IXpsRasterizationFactory::CreateRasterizer anfragen, um XPS-Rasterisierungsobjekte zu erstellen.
Wenn das Factory-Objekt nicht mehr benötigt wird, sollte der Filter das Objekt freigeben, indem er die Release-Methode der IXpsRasterizationFactory-Schnittstelle des Objekts anfragt.
Das folgende Codebeispiel zeigt, wie Sie eine Instanz der Schnittstelle IXpsRasterizationFactory von einer Instanz der Schnittstelle IPrintPipelinePropertyBag erhalten:
//
// Retrieve a reference to the XPS rasterization factory
// from the print pipeline property bag.
//
HRESULT CreateRasterizationFactory(
IPrintPipelinePropertyBag *pPropertyBag,
IXpsRasterizationFactory **ppXPSRasFactory)
{
if (ppXPSRasFactory != NULL)
{
*ppXPSRasFactory = NULL;
}
if (pPropertyBag == NULL || ppXPSRasFactory == NULL)
{
return E_POINTER;
}
HRESULT hr;
VARIANT var;
IXpsRasterizationFactory *pXPSRasFactory;
//
// Retrieve the factory object from the property bag.
//
VariantInit(&var);
hr = pPropertyBag->GetProperty(L"MS_IXpsRasterizationFactory",
&var);
if (SUCCEEDED(hr))
{
assert(var.vt == VT_UNKNOWN && var.punkVal != NULL);
//
// Get the factory object's IXpsRasterizationFactory interface.
//
IUnknown *pUnknown = var.punkVal;
hr = pUnknown->QueryInterface(__uuidof(IXpsRasterizationFactory),
reinterpret_cast<void**>(&pXPSRasFactory));
}
if (SUCCEEDED(hr))
{
//
// Give the caller our reference to the IXpsRasterizationFactory interface.
//
*ppXPSRasFactory = pXPSRasFactory;
}
VariantClear(&var);
return hr;
}
Erstellen eines XPS-Objektmodells für eine feste Seite
Nachdem Sie eine XPS-Raster-Factory erstellt haben, kann ein XPSDrv-Filter die Factory verwenden, um XPS- Rasterobjekte zu erstellen. Ein XPS-Rasterobjekt hat eine IXpsRasterizer-Schnittstelle. Jedes XPS-Rasterobjekt ist für eine bestimmte feste Seite eines XPS-Dokuments bestimmt. Um ein XPS-Rasterobjekt zu erstellen, benötigt eine Factory ein XPS-Objektmodell (OM) der festen Seite. Die XPS OM (der festen Seite) ist in einem Objekt enthalten, das eine IXpsOMPage-Schnittstelle hat. Das XPS-Rasterobjekt verwendet diese Schnittstelle, um auf den Inhalt der festen Seite zuzugreifen. Weitere Informationen über die IXpsOMPage-Schnittstelle finden Sie in der Windows SDK-Dokumentation.
Der XPSDrv-Filter folgt diesen Schritten, um ein XPS-Rasterobjekt zu erstellen:
Der Filter liest ein festes Seitenobjekt mit einer IFixedPage-Schnittstelle aus dem Eingangsdatenstrom.
Der Filter erstellt ein XPS OM-Objekt mit einer IXpsOMPage-Schnittstelle, um den Inhalt der festen Seite zu speichern. Der XPS-Raster wird später diese Schnittstelle verwenden, um auf den Inhalt der festen Seite zuzugreifen.
Um das XPS-Rasterobjekt zu erstellen, übergibt der Filter die Schnittstelle IXpsOMPage des XPS OM-Objekts an die Methode IXpsRasterizationFactory::CreateRasterizer der XPS-Raster-Factory.
Wenn das XPS-Rasterobjekt nicht mehr benötigt wird, sollte der Filter das Objekt freigeben, indem er die Release-Methode der IXpsRasterizer-Schnittstelle des Objekts anfragt. Eine Beispielimplementierung eines XPSDrv-Filters, der den XPS-Rasterungsdienst verwendet, finden Sie im Beispieltreiber XpsRasFilter im WDK.
Bei Verwendung des XPS Rasterungsdienstes können Leinwände und Visual Pinsel innerhalb einer festen Seite bis zu einem Grenzwert von 64 Ebenen verschachtelt werden. Weitere herunterladbare Informationen zu Leinwänden und visuellen Pinseln finden Sie in der XML-Papierspezifikation.
Bitmap-Auflösung und Pixelformat
Das XPS-Rasterobjekt für eine feste Seite muss die Auflösung kennen, mit der die Seite gerendert wird. Der XPSDrv-Filter gibt diese Auflösung in Dots per Inch (DPI) als Eingabeparameter in der Anfrage an IXpsRasterizationFactory::CreateRasterizer an, die das XPS-Rasterobjekt erstellt. Wenn zum Beispiel ein Anzeigegerät eine Auflösung von 600 DPI hat und eine feste Seite eine Standardseite im Letter-Format beschreibt, hat ein Bitmap-Bild der gesamten Seite die folgenden Abmessungen:
Breite = (8,5 Zoll) x (600 DPI) = 5.100 Punkte
Höhe = (11 Zoll) x (600 DPI) = 6.600 Punkte
Um ein Bitmap-Bild eines rechteckigen Bereichs einer festen Seite zu erstellen, fragt ein XPSDrv-Filter die Methode IXpsRasterizer::RasterizeRect des XPS-Rasterobjekts an. Diese Methode erzeugt immer eine Bitmap mit einer Pixelgröße von 32 Bit. Das Pixelformat wird durch den GUID-Wert GUID_WICPixelFormat32bppPBGRA festgelegt, der in der Header-Datei Wincodec.h definiert ist. Das Format enthält 8-Bit-Rot-, Grün- und Blaukomponenten und verwendet den Standardfarbraum (sRGB). Darüber hinaus enthält das Format eine 8-Bit-Alphakomponente. Die Farbkomponenten in jedem Pixelwert werden mit der Alphakomponente vormultipliziert. Weitere Informationen über dieses Format finden Sie unter Native Pixelformate Übersicht.
Einige XPSDrv-Filter können eine zusätzliche Verarbeitung einer Bitmap durchführen, die von einem XPS-Rasterobjekt erzeugt wurde. Ein Filter für einen Farbdrucker könnte beispielsweise die Bitmap in ein CMYK-Pixelformat konvertieren, bevor er die Bitmap in die Seitenbeschreibungssprache des Druckers umwandelt und sie an den Drucker sendet.
Weitere Informationen über die Schnittstellen, über die der XPS Rasterungsdienst mit den XPSDrv-Filtern kommuniziert, finden Sie in der DDI-Referenz des Headers xpsrassvc.h.
XPSRas und hochpräzise Pixelformate
In Windows 8 stellt der XPS Rasterungsdienst eine neue Schnittstelle zur Verfügung, IXpsRasterizationFactory1, die eine neue Version von IXpsRasterizationFactoryIntegrationsdienst ist. IXpsRasterizationFactory1 stellt eine neue Methode zur Verfügung, IXpsRasterizationFactory1::CreateRasterizer, die mit der Windows 7 Version (IXpsRasterizationFactory::CreateRasterizer) identisch ist, außer dass sie einen neuen Parameter für das Ausgabepixelformat akzeptiert.
Diese Funktion stellt eine neue Aufzählung, XPSRAS_PIXEL_FORMAT, zur Verfügung, mit der ein Aufrufer das von der IWICBitmap-Schnittstelle verwendete Pixelformat auswählen kann, das von der Methode IXpsRasterizer::RasterizeRect zurückgegeben wird.
XPSRas und der Grafikprozessor (GPU)
Wenn Sie einen Computer haben, auf dem Windows 8 mit einem WDDM 1.2-Anzeigetreiber läuft, und alle im Verzeichnis für die XPSRas-GPU-Nutzung aufgeführten Bedingungen erfüllt sind, wird die GPU-Hardwarebeschleunigung immer verwendet. Das bedeutet, dass Sie als Entwickler keine weiteren Schritte unternehmen müssen, um von den Leistungsverbesserungen der GPU zu profitieren. Um die Grafikleistung Ihres Systems weiter zu optimieren, sollten Sie jedoch Folgendes tun:
Rufen Sie die Methode RasterizeRect mit konsistenten Rechteckabmessungen auf. Wenn dies nicht möglich ist, ist es optimal, RasterizeRect beim ersten Aufruf mit der größten benötigten Rechteckgröße zu versehen und bei späteren Anfragen nach kleineren Rechteckgrößen zu fragen.
Verwenden Sie Anti-Aliasing nur, wenn es unbedingt erforderlich ist. Aliasing-Text und -Vektoren sehen genauso aus wie ihre Anti-Aliasing-Gegenstücke, wenn der DPI-Wert, der der Methode IXpsRasterizationFactory::CreateRasterizer übergeben wird, sehr hoch ist. Ein DPI-Wert von mehr als 200DPI wird beispielsweise als hoch angesehen. Um sicherzustellen, dass die Ausgabequalität auf einem bestimmten Gerät ausreichend ist, wenn Sie Aliasing-Text und Vektoren zusammen mit einem hohen DPI-Wert verwenden, sollten Sie Tests durchführen.
Wenn ein Dokument vor der Rasterung der IXpsOMPage bearbeitet werden kann, verbessern die Unterteilung von Schriftarten und die Verwendung von Ressourcen-Wörterbüchern für Elemente, die sich auf mehreren Seiten wiederholen, die Leistung von XPSRas.