標準 XPS 篩選器
重要
新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。
如需詳細資訊,請參閱 新式列印平臺 和 列印支援應用程式設計指南。
Windows 提供兩個 (標準) XPS 篩選器,以支援從 XPS 到 PCL6 和 PostScript 層級 3 的內建轉換。
Windows 提供的篩選器適用於列印類別驅動程式和模型特定的 v4 列印驅動程式。 您可以視需要將這些 XPS 篩選器與 IHV 功能篩選器和 IHV 後處理篩選器結合,以確保與現有的韌體實作相容。
Windows 提供的 XPS 篩選器無法重新散發,且不適用於 v3 列印驅動程式。
指令清單檔案
若要使用 Windows 提供的 XPS 篩選器,v4 驅動程式指令清單檔必須使用 DriverConfig 區段下的 RequiredFiles 指示詞來指定篩選條件。 這些是篩選的名稱:
MSxpsPCL6.dll。 提供從 XPS 轉換為 PCL6 的轉換。 MSxpsPS.dll。 提供從 XPS 轉換為 PostScript 層級 3 的轉換。 不需要 INF 更新才能利用其中一個篩選條件,而且不支持轉散發。 我們建議使用者停止使用這些 XPS 篩選器。
列印篩選管線設定
若要將列印篩選管線設定為使用這些篩選條件,您必須建立組態檔,如下列範例所示。
指定轉換成 PCL6 的範例組態檔。
<?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>
指定轉換至 PostScript 的範例組態檔。
<?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>
支援的功能
標準 XPS 篩選器支援許多常見的功能。 所有功能定義都會使用驅動程式的 GPD 或 PPD 檔案。 MSxpsPCL6.dll篩選條件需要使用 GPD 檔案進行設定,而MSxpsPS.dll篩選條件需要使用 PPD 檔案進行設定。 除非另有說明,否則如果為功能指定了自定義 PDL 命令,則會使用它。
如果插入字串存在於任何特定區段下(使用 *Order 命令指定),則在 GPD 檔案的情況下,篩選會針對這些字串的內容進行一些假設,並避免傳送預設命令。 這是因為在此案例中傳送預設命令可能會導致命令衝突。 因此,GPD 檔案的建立者必須遵循下列指導方針:
JOB_SETUP。#
PCL6 二進位數據流標頭(例如:“)<SP>HP-PCL XL;1;<CR><LF>“) 必須存在。
BeginSession 運算符必須存在,包括所有必要的屬性。
OpenDataSource 運算子必須存在,包括所有必要的屬性。
PAGE_SETUP。#
- BeginPage 運算符必須存在,包括所有必要的屬性。
PAGE_FINISH。#
- EndPage 運算子必須存在。
JOB_FINISH。#
CloseDataSource 運算子必須存在。
EndSession 運算符必須存在。
EndPJLCommands 運算符必須存在。
XPS 標準篩選會產生適當的 PDL 數據,以根據 *PrintableArea、*PrintableOrigin 或 *ImageableArea 命令來設定頁面的來源。 為了避免預期來源的額外位移,GPD 檔案不應在 *Cmd 字串定義中指定其紙張大小的任何 =SetPageOrigin 命令。
如需標準 XPS 篩選器所支援 PrintTicket 功能的詳細資訊,請參閱 支援的 PrintTicket 功能。
在處理后篩選中擷取 PrintTicket
在與 Windows 8 一起發行的 v4 驅動程式模型中,當您在其中一個 MSxps 篩選條件之後新增後處理篩選時,有時也必須新增前置處理篩選。 需要新增前置處理篩選條件,才能擷取作業層級的列印票證。 但這種方法基本上在數據流型 MSxps 篩選之前新增了以物件模型為基礎的篩選,導致還原串行化,然後串行化列印數據,以便只擷取 PrintTicket。
在Windows 8.1中,用戶預設 PrintTicket 會與 MSxps 篩選中的作業層級 PrintTicket 合併,然後合併的 PrintTicket 會新增至列印篩選管線的屬性包。 合併的 PrintTicket 會以與使用者 PrintTicket 相同的方式新增至列印篩選管線的屬性包。 屬性的名稱如下:
#define XPS_FP_JOB_LEVEL_PRINTTICKET "JobPrintTicket"
在 InitializeFilter 期間,MTI 篩選器會將 IPrintReadStreamFactory 的實作新增至屬性包。 此介面的其中一個方法 GetStream 將會封鎖,直到 PrintTicket 數據流可供使用為止。 這提供同步處理屬性存取的方法。
重要 :如果 從 InitializeFilter 呼叫 GetStream ,它將導致死結。
其他功能
如果是標準 XPS 篩選器不支援的 PrintTicket 功能,篩選會檢查所有 PrintTicket 成員,以查看是否在 GPD/PPD 中參考它們,然後指定要輸出的命令。 如果是,則會產生指定的命令。
GPD 功能會依下列順序對應:
指定 PrintSchemaKeywordMap 值,並符合 PrintTicket 功能名稱。
會指定 PrintSchemaPrivateNamespaceURI 屬性,而且 GPD 功能名稱符合 PrintTicket 功能名稱。 比對功能名稱並不簡單,並遵循一些規則:
如果第一個選項的 *Order 區段是PAGE_SETUP或PAGE_FINISH,而且 GPD 功能不會以 “Page” 開頭,則在嘗試比對之前,“Page” 會先加上 GPD 功能名稱。
如果第一個選項的 *Order 區段是DOC_SETUP或DOC_FINISH,而且 GPD 功能不會以 “Document” 開頭,則會在嘗試比對之前,先在 GPD 功能名稱前面加上 “Document”。
如果第一個選項的 *Order 區段是JOB_SETUP或JOB_FINISH,而且 GPD 功能不會以 “Job” 開頭,則在嘗試比對之前,會先在 GPD 功能名稱前面加上 “Job”。
嘗試比對之前,任何不是 [A-Z]、[a-z]、[0-9] 或 '_' 的字元會取代為 '_' 字元。 不過,如果 *NoPunctuationCharSubstitute?屬性設定為 TRUE,則篩選條件不會以 『_' 字元取代 '.' 或 '-'。
PPD 功能會依下列順序對應:
指定 PrintSchemaKeywordMap 值,且符合 PrintTicket 功能名稱。
會指定 PrintSchemaPrivateNamespaceURI 屬性,且 PPD 功能名稱符合 PrintTicket 功能名稱。 比對功能名稱並不簡單,並遵循一些規則:
如果 OrderDependency 區段為 ExitServer、Prolog 或 JCLSetup,且 PPD 功能名稱開頭為 “Job”,則在嘗試比對之前,會將 “Job” 前面加上 PPD 功能名稱。
如果 OrderDependency 區段是 DocumentSetup,且 PPD 功能名稱不是以 “Document” 開頭,則在嘗試比對之前,會將 “Document” 前面加上 PPD 功能名稱。
如果 OrderDependency 區段是 AnySetup,則篩選會執行兩個相符檢查:
如果 PPD 功能名稱不是以 「Document」 開頭,則在嘗試比對之前,會先在 PPD 功能名稱前面加上 「Document」。。
如果找不到相符專案,或者如果PPD功能名稱不是以 「Job」 開頭,則在嘗試比對之前,會先在PPD功能名稱前面加上「Job」。。
如果 OrderDependency 區段為 PageSetup,且 PPD 功能名稱開頭為 “Page”,則在嘗試比對之前,會將 “Page” 前面加上 PPD 功能名稱。
嘗試比對之前,任何不是 [A-Z]、[a-z]、[0-9] 或 '_' 的字元會取代為 '_' 字元。 不過,如果 *MSNoPunctuationCharSubstitute? 字串設定為 TRUE,篩選條件不會以 『_』 字元取代 『.』 或 『-』。
GPD 和 PPD 選項會依下列順序對應:
會指定 PrintSchemaKeywordMap 值,且它符合 PrintTicket 選項名稱。
會指定 PrintSchemaPrivateNamespaceURI 屬性,而且 GPD/PPD 選項名稱符合 PrintTicket 選項名稱。 比對選項名稱並不簡單,並遵循一些規則:
如果 GPD/PPD 選項名稱開頭為 [0-9] 或 '_',則在嘗試比對之前,會將 '_' 字元前面加上 GPD/PPD 選項名稱。 不過,適用下列其他規則:
如果這是 GPD 選項,而 *NoPunctuationCharSubstitute?屬性設定為 TRUE,則篩選條件不會加上 『_' 字元的 '_'。
如果這是PPD選項,而 *MSNoPunctuationCharSubstitute?string 設定為 TRUE,則篩選條件不會加上 『_』 字元的 '_'。
嘗試比對之前,任何不是 [A-Z]、[a-z]、[0-9] 或 '_' 的字元會取代為 '_' 字元。 不過,適用下列其他規則:
如果這是 GPD 選項,而 *NoPunctuationCharSubstitute?屬性設定為 TRUE,則篩選條件不會以 『_' 字元取代 '.' 或 '-'。
如果這是PPD選項,而 *MSNoPunctuationCharSubstitute?string 設定為 TRUE,則篩選條件不會以 '_' 字元取代 '.' 或 '-'。
窗體到匣對應
XPS 到 PCL6 和 XPS 到 PS 篩選支援表單到匣對應資料表。 如果多個匣支持選取的媒體大小(例如字母),篩選條件會中斷系結,如下所示:
如果預設匣(如 GPD 或 PPD 檔案中所指定)設定為使用指定的媒體大小,則會使用預設匣。
否則,篩選會選擇使用指定媒體大小的 GPD/PPD 檔案中所指定的第一個匣(由上至下)。
額外的后側頁面隱藏
根據預設,XPS 到 PCL6 和 XPS 至 PS 篩選會藉由插入空白頁面來處理包含混合媒體大小、媒體類型、輸入或輸出間隔的檔雙面列印。 當篩選插入此空白頁面時,它會強制裝置列印新媒體前端的下一頁。 對於不需要輸出後端頁面的裝置,您可以將下列關鍵詞新增至驅動程式的 GPD 或 PPD 檔案來隱藏此行為。
檔案類型 | 後端頁面隱藏關鍵詞 |
---|---|
GPD | *SuppressExtraBacksidePages?: TRUE |
PPD | *MSSuppressExtraBacksidePages: True |
優化 SetPageDevice 命令
使用具有MSxpsPS.dll之驅動程式的 PostScript 裝置的預設行為是,會針對每個頁面發出 SetPageDevice 命令,而此命令會指出為頁面指定的完整選項集。 請注意,某些裝置可能無法透過這項技術執行良好。
不過,如果您的裝置使用 MSxpsPS.dll,且隨附的 PPD 檔案指定 *MSOptimizeSetPageDevice:True,則下列是 PostScript 裝置行為: - 對於自上一頁起 SetPageDevice 命令的任何部分有變更的每個頁面,會發出新的 SetPageDevice 命令來指出頁面指定的選項集。 但是,如果自上一頁以來,SetPageDevice 命令的任何部分都沒有變更,則不會針對頁面發出 SetPageDevice 命令。