Windows打印體系結構之打印驅動框架


 

廬山煙雨浙江潮,未到千般恨不消。到得原來無別事,廬山煙雨浙江潮。windows


1.2Windows打印驅動框架

Windows的打印驅動從整體架構上來講,包括一個渲染組件和一個配置組件。咱們能夠回想一下最開始的整體架構圖。緩存

  • 渲染組件就是負責將應用程序傳來的每一頁的繪製命令(GDI命令)轉換成打印機用來渲染的命令數據(打印機才能識別的命令)發送到打印機中。網絡

  • 配置組件又包含一個可讓用戶進行打選項配置的用戶接口組件和一個將打印機的配置和特徵傳遞給應用程序的程序接口。架構

而相較於Windows的其餘硬件設備,比較特殊的狀況是,打印機的驅動程序並不直接訪問和操縱硬件設備,而是把通過處理的二進制指令流和數據流發送給假脫機系統,由假脫機系統負責在合適的時間將打印數據發送至打印機設備所在的端口,完成打印任務。框架

而打印機驅動在這裏也細分紅兩個大的框架:GDI框架與XPS框架。ide

1.2.1GDI打印驅動程序體系結構

GDI 打印驅動程序由如下2個組件組成【https://msdn.microsoft.com/en-us/library/windows/hardware/ff549558(v=vs.85).aspx】:函數

  • 打印圖形DLL:輔助 GDI 繪製打印做業,並將繪製後的數據流傳送到打印假脫機程序。佈局

  • 打印接口DLL:爲打印配置選項導出一個用戶接口,同時導出假脫機能夠調用以通知驅動程序與打印相關的系統事件的接口。測試

渲染組件:打印圖形 DLLhttps://msdn.microsoft.com/en-us/library/windows/hardware/ff551757(v=vs.85).aspxspa

這裏的打印圖形DLL其實就是一個渲染組件。打印圖形DLL實現Drv爲前綴的圖形DDI(Device Driver Interface,圖形驅動接口)後面說明】函數,這些函數有以下兩個方面的做用:

1)輔助GDI完成打印任務。當一個繪製操做必須以設備指定的方式來繪製或者要執行一些GDI引擎不支持的繪製操做時,打印圖形DLL能夠提供圖形DDI函數來處理那些必須按照特定於設備的方式執行和那些不能由GD繪製引擎單獨完成的繪製操做。

2)將繪製後的數據流傳送到假脫機系統。打印圖形DLL一般以RAW數據類型(包括命令序列)後面說明】產生一個輸出流,假脫機能夠經過打印監視器將該輸出流傳送到打印機硬件。

首先咱們來講明什麼是圖形DDI(Device DriverInterface,圖形驅動接口)GDI是圖形引擎,其和圖形設備驅動程序之間的接口協議就是設備驅動程序接口(DDI)。須要注意的是,DDIDevice DriverInterface,中文字面意思是設備驅動程序接口,正確的寫法其實前面還應該加上圖形的英文,這樣纔沒有歧義。圖形設備驅動程序通常是內核模式DLL,被加載到內核地址空間。它負責在硬件設備上最終實現用戶應用程序的繪製調用。

另一個須要說明的是RAW數據類型,Windows 打印進程一般支持五種數據類型。最經常使用的兩種數據類型是加強型圖元文件 (EMF) 和打印就緒 (RAW)

EMF,即加強型圖元文件,是大多數Windows應用程序的默認數據類型。使用EMF,系統會將要打印的文檔更改成比RAW文件更易於移植並一般能夠在任意打印機上打印的圖元文件格式。

RAW是使用非Windows程序的客戶端的默認數據類型。RAW數據類型通知後臺處理程序在打印以前不要更改打印做業。使用這種數據類型,準備打印做業的整個過程是在客戶端計算機上完成的。RAW數據格式是打印機語言PDL的數據格式。PCLPostScript都是RAW數據,打印引擎能夠直接處理。

EMF(Enhanced MetaFile)RAW處理方式和功能有所不一樣。

數據類型設置爲EMF時,Windows系統生成一個包含GDI功能調用的打印處理文件,此功能調用生成一個組命令以造成應用程序的對象,在設置文件的讀取和傳輸過程當中完成對打印設置文件的解釋。所以,EMF數據格式的處理方式可以使返回應用程序的時間加快。

使用RAW數據類型時,在寫入設置文件以前,打印任務被傳輸到驅動程序進行解釋,圖像處理和數據解包。因此,使用RAW數據格式比使用EMF格式打印速度慢。

 

配置組件:打印接口DLLhttps://msdn.microsoft.com/en-us/library/windows/hardware/ff551764(v=vs.85).aspx

這個打印接口DLL就是驅動程序架構的配置組件,打印驅動程序一般給用戶提供不少可修改打印配置的選項,這些選項能夠在每個要打印的文檔中被修改。如打印的份數、雙面打印、紙張大小、紙張來源、色彩模式、打印分辨率、方向和縮放等,這些選項能夠經過由應用程序所調用的用戶接口來實現。

打印接口DLL負責爲打印配置選項導出一個用戶接口。經過爲打印機建立屬性表單頁來提供這一用戶接口。應用程序(如Word等)經過調用由假脫機導出的Win32函數顯示這個接口,假脫機系統轉而又能夠調用由打印接口DLL定義的函數。

打印接口DLL不只爲打印配置選項提供用戶接口,還導出一些函數。這些函數被假脫機調用以通知驅動程序與打印相關的系統事件,例如驅動程序的安裝和升級、打印機的添加和鏈接等。

 

1.2.2GDI打印驅動的工做模式

打印圖形DLL提供的繪製函數是基於特定設備的,取決於硬件的繪製能力來決定其所處的工做模式。這裏說的繪製其實就是渲染。包括以下3種狀況:

  • 打印圖形DLL能夠選擇所有提供DDI繪製函數(RAW模式);

  • 部分提供DDI繪製函數(回調模式);

  • 不提供DDI繪製函數(EMF模式)。

下圖是MSDN上對於GDI框架的說明。

wKioL1fWDMewy2DgAACAksL9yMI514.png

上圖說明了應用程序使用GDI建立打印做業時的數據流。數據流傳送至打印機硬件以前,並非打印圖形DLL會以後直接傳送,而是先返回至假脫機,再由假脫機傳送至一個監視器然後同過本地或網絡端口傳送至打印機硬件。

RAW模式

RAW模式下,應用能夠直接調用驅動所提供的接口直接生成打印機所能處理的Raw文件並直接經過端口監視器發給物理打印機進行打印。這個驅動能夠是微軟的通用驅動程序也能夠是廠商本身編寫的驅動程序。

回調模式

回調模式下,由應用發起的打印文件的部分可能沒法使用GDI自己的API來完成了,可是大部分工做是能夠之間生成對應的EMF文件的,小部分文件必須調用DDI的繪製函數來進行,生成Raw文件提交給打印處理器,打印處理器會將其進行處理,好比生成EMF文件,提交給GDI User-Mode Client,而後合併爲一個完整的EMF文件,最後提交給打印處理器進行處理。打印處理器會講EMF文件解析爲打印機能夠處理的Raw文件,並經過端口監視器發給打印機進行打印。

EMF模式

EMF模式中,應用經過調用GDI提供的接口而生成用於打印的通用中間文件(EMF文件)。再由打印假脫機隊列服務調用打印機驅動的接口將這個EMF文件解析爲打印機能夠處理的Raw文件,並經過端口服務發給打印機進行打印。

通過上述的說明,也許有人會產生疑問,爲何生成EMF文件不須要去調用DDI就能夠生成EMF文件?簡要來講,這是由Windows決定的,EMF文件是經過WindowsGDI函數集來描述圖像的。咱們能夠把EMF文件理解爲是GDI的指針或者MetafileEMF格式裏面標記的每一個含義或者鍵值和GDI裏面的某一類進行一一對應,當須要解析EMF文件時,只須要讀取相應的鍵值就能夠知道相應的GDI圖像顯示的動做是什麼。

同時,還有一個疑問:爲何最後都是生成Raw文件發送到打印機?先說說這得從打印後臺打印數據格式提及,通常的打印機後臺格式有多種,如RAWEMF...,但RAW格式是惟一被所有打印機所支持。並且在遠程打印中,只有RAW格式是被Windows支持的,這能夠在MSDN中查到。另外,若是打印圖像,除DIB圖像外,部分打印機在採用EMF格式時沒法打印,如HP LaserJet 1100。固然,若是採用GDIPLUS技術打印,在400DPI下也是能夠正常打印的,但當DPI大於400(具體上限沒有測試),圖像依然沒法打印。

這裏出現的DPI指的是顯示的分辨率。如今咱們一般講的打印機分辨率是多少 dpi,指的是在該打印機最高分辨率模式下,每英寸所能打印的最多理論墨點數。更加合理的對於dpi 的解釋是這樣的:若是一臺打印機的分辨率是4800×1200 dpi,那麼意味着在X方向(橫向)上,兩個墨點最近的距離能夠達到1/4800英寸;在Y方向(縱向)上,兩個墨點的距離能夠達到1/1200英寸。

最後在MSDN上面還有一副關於GDI模式的圖:

wKioL1fWDODzcMiBAABITQIWaks766.png

這幅圖表示的是GDI模式下打印驅動位於內核態的工做模型,因爲XP之後的打印機驅動都爲用戶態,內核態的打印機驅動基本再也不使用,就不另加說明了。

總結一下:當GDI程序執行打印時,經過調用API來傳遞GDI繪圖指令到繪圖引擎,繪圖引擎要麼和打印驅動一塊兒合做來緩存這些繪製指定到一個EMF文件中,要麼直接渲染成一個可打印的圖片發送到打印假脫機隊列服務spooler中。打印假脫機隊列服務Spooler解釋EMF文件,並將頁面佈局和做業控制指令信息插入到數據流中,而後發送這些數據裏到序列化、並行化或者網絡形式的打印機關聯的端口上。

因爲打印假脫機隊列服務Spooler和打印驅動都是能夠被單獨取代,因此硬件廠商們能夠很容易的增長對新硬件的支持。當須要增長對新款打印機的支持時,一般只須要建立根據微軟所提供的打印驅動類型中相關聯的數據類型就能夠了。

1.2.3XPSDrv打印驅動程序體系結構

XPSDrv打印驅動程序體系結構基於新一代文檔格式XPSXML PaPer Specification(XML文件規格,簡稱XPS)。這是一種可直接打印的通用電子文檔格式,和PDF同樣能夠由其餘任何格式轉化。XPSWindows內部一個徹底能夠重複書寫的打印子系統,打印機能夠根據工做類型的不一樣來接收這種電子文件,包括Microsoft PublisherMicrosoft Office文件等的文件皆可自由轉化爲XPS電子文檔格式進行打印。

XPS不只僅是一種文檔格式,它仍是一種物理存儲結構上基於OPC,顯示技術上基於WPF技術,而且將它們與打印子系統結合的產物。

wKiom1fWDPqiNCmRAABYgfeL27E688.png

如上圖所示,一個XPS驅動體系的主要組件包括:

  • 過濾器(Filter);

  • 過濾管道(Filter pipeline);

  • 過濾器管道管理器(Filter Pipeline Manager);

  • 過濾器配置文件(Filter ConfigurationFile);

  • XPS Spooler Process

  • WPF應用程序。

其中過濾器(Filter),官方翻譯爲篩選器,意思差很少。過濾器配置文件和配置模塊又稱爲XPSDrv。相較於 GDI 打印驅動程序體系結構,XPSDrv 打印驅動程序體系結構採用了過濾器的方式,能夠提供更具彈性的打印途徑。XPS 打印機驅動程序 (XPSDrv) 過濾器管道設計用於啓用直接和可縮放的XPS文檔打印。

首先由應用程序發出打印請求,若是發出的請求是WPF形式的打印請求那麼就將進入XPS交換流管道Spooler ProcessXPSDrvXPS打印管道的核心,它包括一個調用過濾器的打印進程模塊的設定文件,描述了打印驅動是如何被加載調用的,以及不一樣的過濾器之間的數據是如何通訊的。(這部分在XPSDrv裏叫作IFC)。另外圖中Print Pipeline Filter的配置文件(XML)定義了:過濾器的分類,過濾器的接口以及每一個過濾器的輸入輸出格式。

在圖中,打印做業經過WPF,以XPS流文件的格式進入系統驅動,經過驅動的Ul設置,能夠配置給過濾器打印時須要的信息來進行打印操做,而後scheduler通知過濾器管道管理器(Filter pipeline manager),下面過濾器管道管理器(Filter pipeline manager)開始按照過濾器配置文件(Filter ConfigurationFile)配置文件來處理這些做業,過濾器管道管理器(Filter pipeline manager)經過調用配置文件來建立過濾管道(Filter pipeline),當過濾管道(Filter pipeline)被建立完成和初始化後,濾器管道管理器(Filter pipeline manager)就打開過濾管道(Filter pipeline)讀取XPS流文件的內容。同時,在各個過濾器之間,使用StreamDoculnent類型進行數據交換。XPS文件流經過WPF形式傳送給Spooler,同時在不一樣的過濾器之間經過一個XML配置文件進行管理,Ul能夠經過DevMode寫入Prinit Ticket從而對驅動過濾器進行設置控制。最終,文件經過CsxPStops這個過濾器轉化爲目前大部分打印機可識別的PSPCL語言,最後經過打印流接口,將PDL數據交付打印機打印。

 

1.2.4XPSDrv打印驅動的工做模式

下圖描述了打印子系統(XPSDrv)的工做流程,其中,淺藍色的部分是Microsoft 提供的,淺×××的部分是有軟件供應商提供的軟件和應用程序,×××的是硬件打印機供應商(好比HP)提供的部分。

wKiom1fWDRGCOkdRAABi39MYAbM729.png

XPS框架下,只有XPS一種工做模式。應用程序將不會直接調用驅動,打印的數據都會經過操做系統的XPS服務而生成一個用於打印的通用XPS文件。再由打印假脫機隊列服務調用打印機驅動的各類過濾器修改生成的XPS文件並最終生成打印機能夠處理的文件(能夠是XPS文件,也能夠是Raw文件),再經過端口監視器發給打印機進行打印。而XPS驅動體系爲了兼容之前的系統,提供了兩條印刷路徑:一條是經過將XPS轉化爲傳統的EMF文件流,再經過傳統的GDI印刷路徑打印;而另外一種打印路徑是XPS文件經過一系列過濾器過濾,最後生成打印機能識別的PDL格式文件。這樣既能夠在新版本的操做系統環境下使用原有的打印技術,也能夠在XP操做系統裏用XPS打印路徑。XPSDrv模型裏提供從 XPSGDI格式的轉換器,用來實現Win32應用程序可以打印XPS文檔。若是說WPF應用程序在進行寫操做的目標打印隊列沒有XPSDrv驅動程序,那麼該轉換器就會自動完成從XPSGDI格式的轉換。

1.2.5、總結

下圖分別展示了GDI驅動體系和XPS驅動體系的工做流程圖:

wKioL1fWDSWzjXq2AABa0PpCmaU447.gif

接下來咱們須要看看Windows系統上都有哪些打印機的驅動。目前Windows Server 2012上擁有如下打印機驅動程序:

  • V4打印機驅動程序(V4 Printer Driver

  • 對於OpenXPS驅動程序支持

  • XPS打印機驅動程序(XPSDrv

  • 微軟通用打印機驅動程序(Microsoft UniversalPrinter Driver

  • 微軟PostScript打印機驅動程序(Microsoft PostScriptPrinter Driver

  • 微軟繪圖儀驅動程序(Microsoft PlotterDriver

V4版本的驅動程序框架主要在WindowServer 2012Windows 8上出現,可是如今基於這樣的打印機以及打印驅動還不是市場的主流,相信進過一段時間的推廣和發展,從此咱們就看V4版本的驅動框架了。

相關文章
相關標籤/搜索