使用 XPS 點陣化服務
重要
新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。
如需詳細資訊,請參閱 新式列印平臺 和 列印支援應用程式設計指南。
XPS 點陣化服務會實作 XPS 轉譯器物件,將 XPS 檔中的固定頁面轉換成位圖。 此服務可簡化 XPSDrv 篩選的設計,將 XPS 檔轉譯為一系列的點圖影像。 篩選可以告訴 XPS 轉譯器物件,在固定頁面中建立軸對齊矩形區域的位圖影像。
例如,印表機的 XPSDrv 篩選可能需要將固定頁面傳送至印表機,做為一系列的水準或垂直帶。 在此情況下,篩選會告知 XPS 轉譯器物件將每個帶點陣化為個別點陣圖。 或者,如果印表機有足夠的記憶體,篩選可能會告訴轉譯器建立整個頁面的點陣圖影像。
XPS 點陣化服務會在系統檔案中實作Xpsrasterservice.dll。 不過,XPSDrv 篩選不會直接存取此 DLL 中的進入點。 相反地,篩選會透過 篩選從列印篩選管線管理員接收的列印管線屬性包 ,存取 XPS 點陣化服務的介面。
若要供 XPSDrv 篩選條件使用,必須在描述列印篩選管線中篩選篩選條件的篩選管線組態檔中指定 XPS 點陣化服務。 具體來說,組態檔必須包含 FilterServiceProvider 元素,並將 dll 屬性設定為服務 DLL 名稱,如下列 XML 範例所示:
<FilterServiceProvider dll = "XpsRasterService.dll" />
FilterServiceProvider 元素是 Filters 元素的子系,可列出管線中的篩選條件。 在管線初始化期間,列印篩選管線管理員會載入 XPS 點陣化服務,並讓篩選可透過屬性包存取服務。 如需載入 XPS 點陣化服務的篩選管線組態檔範例,請參閱 WDK 中的 XpsRasFilter 範例。 此範例位於 WDK 安裝的 Src\Print\Xpsrasfilter 資料夾中。
取得 XPS 點陣化處理站
將 XPS 檔點陣化之前,XPSDrv 篩選必須從列印管線屬性包擷取點陣化處理站對象的參考。 之後,篩選會針對它需要轉譯的每個固定頁面,從處理站取得新的 XPS 轉譯器物件。
若要初始化 XPSDrv 篩選條件,列印篩選管線管理員會呼叫篩選條件的 IPrintPipelineFilter::InitializeFilter 方法,並將屬性包的 IPrintPipelinePropertyBag 介面傳遞至方法做為輸入參數。
若要取得 XPS 點陣化處理站物件的指標,XPSDrv 篩選條件會呼叫 IPrintPipelinePropertyBag::GetProperty 方法。 屬性名稱 「MS_IXpsRasterizationFactory」 會識別點陣化處理站物件。 針對這個屬性,從 GetProperty 取得的值是點陣化處理站物件的 IUnknown 介面參考。 取得這個介面之後,篩選條件必須呼叫 IUnknown::QueryInterface 方法,以取得物件的 IXpsRasterizationFactory 介面參考。 接著,篩選條件可以呼叫 IXpsRasterizationFactory::CreateRasterizer 方法來建立 XPS 轉譯器物件。
不再需要 Factory 物件時,篩選條件應該在物件的 IXpsRasterizationFactory 介面上呼叫 Release 方法來釋放物件。
下列程式代碼範例示範如何從 IPrintPipelinePropertyBag 介面實例取得 IXpsRasterizationFactory 介面實例:
//
// 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;
}
建立固定頁面的 XPS 物件模型
建立 XPS 點陣化處理站之後,XPSDrv 篩選條件可以使用 Factory 來建立 XPS 轉譯器物件。 XPS 轉譯器物件具有 IXpsRasterizer 介面。 每個 XPS 轉譯器物件都專用於 XPS 檔的特定固定頁面。 若要建立 XPS 轉譯器對象,處理站需要固定頁面的 XPS 物件模型 (OM)。 XPS OM (固定頁面) 包含在具有 IXpsOMPage 介面的物件中。 XPS 轉譯器物件會使用此介面來存取固定頁面的內容。 如需IXpsOMPage介面的詳細資訊,請參閱 Windows SDK 檔。
XPSDrv 篩選條件會遵循下列步驟來建立 XPS 轉譯器物件:
篩選會從輸入數據流讀取具有 IFixedPage 介面的固定頁面物件。
篩選條件會建立具有 IXpsOMPage 介面的 XPS OM 物件,以保存固定頁面的內容。 XPS 轉譯器稍後會使用此介面來存取固定頁面的內容。
若要建立 XPS 轉譯器對象,篩選會將 XPS OM 物件的 IXpsOMPage 介面傳遞至 XPS 點陣化處理站的 IXpsRasterizationFactory::CreateRasterizer 方法。
不再需要 XPS 轉譯器物件時,篩選應該在物件的 IXpsRasterizer 介面上呼叫 Release 方法來釋放物件。 如需使用 XPS 點陣化服務的 XPSDrv 篩選實作範例,請參閱 WDK 中的 XpsRasFilter 範例驅動程式。
為了與 XPS 點陣化服務搭配使用,固定頁面內的畫布和視覺筆刷可以巢狀到 64 個層級的限制。 如需畫布和視覺筆刷的詳細資訊,請下載 XML 紙張規格。
點陣圖解析度和像素格式
固定頁面的 XPS 轉譯器對象必須知道要轉譯頁面的解析度。 XPSDrv 篩選條件會以每英吋點為單位指定此解析度,做為IXpsRasterizationFactory::CreateRasterizer 呼叫中建立 XPS 轉譯器對象的輸入參數。 例如,如果顯示裝置的解析度為 600 DPI,而固定頁面描述標準字母大小頁面,則整個頁面的點陣圖影像具有下列維度:
width = (8.5 英吋)x(600 DPI) = 5100 點
height = (11 英吋)x(600 DPI) = 6600 點
若要建立固定頁面矩形區域的點圖影像,XPSDrv 篩選條件會呼叫 XPS 轉譯器物件的 IXpsRasterizer::RasterizeRect 方法。 這個方法一律會產生圖元大小為32位的點陣圖。 像素格式是由 GUID 值GUID_WICPixelFormat32bppPBGRA所指定,此值定義於頭檔 Wincodec.h 中。 格式包含8位紅色、綠色和藍色元件,並使用標準 (sRGB) 色彩空間。 此外,格式包含 8 位 Alpha 元件。 每個像素值中的色彩元件都會由 Alpha 元件預乘。 如需此格式的詳細資訊,請參閱 原生圖元格式概觀。
某些 XPSDrv 篩選條件可能會執行 XPS 轉譯器物件所產生的點陣圖額外處理。 例如,色彩印表機的篩選可能會先將點陣圖轉換成CMYK像素格式,然後再將點陣圖包裝在印表機的頁面描述語言中,然後將它傳送至列印機。
如需 XPS 點陣化服務用來與 XPSDrv 篩選條件通訊之介面的詳細資訊,請參閱 xpsrassvc.h 標頭 DDI 參考。
XPSRas 和高精確度像素格式
在 Windows 8 中,XPS 點陣化服務會公開新的介面 IXpsRasterizationFactory1,這是新版本的 IXpsRasterizationFactory。 IXpsRasterizationFactory1 會公開新的方法 IXpsRasterizationFactory1::CreateRasterizer,這與 Windows 7 版本(IXpsRasterizationFactory::CreateRasterizer)相同,不同之處在於它會接受輸出圖元格式的新參數。
這項功能會公開新的列舉XPSRAS_PIXEL_FORMAT,允許呼叫者選取 IWICBitmap 介面所使用之圖元格式,而 IXpsRasterizer::RasterizeRect 方法所傳回。
XPSRas 和 GPU
如果您有使用 WDDM 1.2 顯示驅動程式執行 Windows 8 的電腦,且符合 XPSRas GPU 使用判定樹中顯示的所有條件,則一律會使用 GPU 硬體加速。 這表示身為開發人員,您不需要執行任何步驟,即可受益於 GPU 所提供的效能增強功能。 不過,若要進一步優化系統的圖形效能,您應該考慮執行下列動作:
使用一致的矩形維度呼叫 RasterizeRect 方法。 如果無法這樣做,最好在第一次叫用時提供 RasterizeRect 所需的最大矩形大小,並在後續呼叫時要求較小的矩形大小。
只有在絕對必要時才使用消除鋸齒功能。 當提供給IXpsRasterizationFactory::CreateRasterizer 方法的 DPI 值相當高時,別名文字和向量看起來與其反別名對應專案相同。 例如,大於 200DPI 的 DPI 值會被視為高。 測試應該完成,以確保使用別名文字和向量以及高 DPI 時,指定裝置上的輸出品質就已足夠。
如果在將IXpsOMPage點陣化之前可以操作檔,則子設定字型和使用數個頁面上重複元素的資源字典可改善 XPSRas 效能。