天天看點

Citrix XenApp和XenDesktop 列印系統解析②

思傑的通用解決方案推出的時間很久了,在2004年的思傑iForum大會上,Citrix宣布推出通用列印機驅動程式(UPD)并激動的宣布,Citrix已經永久性的解決了列印的問題。但是事實上,激情之後發現其實通用列印機驅動程式也沒有徹底的解決列印問題。其實列印問題長久的懸而未決是微軟的問題,思傑隻是創造了一些工具,進而使得列印更加的輕松。

思傑的通用列印解決方案,采用了Citrix開發的通用驅動程式(UPD)與底層網絡基礎設施,允許該驅動程式遠端操作所有用戶端列印機的設定。基于這個UPD基礎之上,Citrix開發新的列印元件:Citrix Universal PrintServer(UPS)思傑通用列印伺服器、Citrix UniversalPrinter(CUP)思傑通用列印機和Citrix PDFPrinter(CPP)思傑PDF列印機。形成了多元的思傑通用列印解決方案。

思傑通用列印解決方案的元件如圖所示:

Citrix XenApp和XenDesktop 列印系統解析②

我們首先介紹這幾個元件:

Citrix Universal PrintDriver中文全稱是思傑通用列印機驅動程式,簡稱UPD。UPD是一個與裝置無關的列印驅動程式,其被設計為允許在任何列印機上列印。Citrix的目标是通過UPD減少所需的驅動程式的數量進而簡化列印機驅動程式的管理。

這裡我們引出UPD的一個特性,裝置無關性,什麼是裝置無關性呢?在早期的應用程式開發中針對列印機的使用是需要應用程式的開發者了解硬體的。這成了程式員的負擔,同時也使開發好的程式難以移植。要實作裝置無關性,我們需要先明白在作業系統中的“裝置上下文(DeviceContext)”的概念。裝置上下文(DeviceContext)簡稱DC,DC可以了解為一個實體裝置在作業系統中的抽象,比如一台實體列印機,作業系統不能實際的看到這台實體的列印機也不能實際的模到它,但作業系統想使用它。怎麼辦呢?這就需要另外一個人将這個列印機抽像出來并告訴作業系統。通過什麼方法去抽象這台列印機呢?比如我旁邊有一個白闆,你們看不到它。但是我可以告訴你們,這個白闆在我的左邊,大小是600mm x 900mm,備有一個闆擦和一支黑色的記号筆,這個白闆就在你的腦中抽像出來了。當你想使用它的時候,你可以告訴我:拿起黑色的記号筆,從(100mm,200mm)開始劃條線到(200mm,300mm)的地方。我照做後,将與你期望的結果一緻。這些資訊就是白闆抽像出來的DC。各種圖形裝置都可以抽像成一個DC。這個DC可以是一個顯示器,可以是一個噴墨列印機,也可以是一個雷射列印機。對各種DC的操作大體上并無不同。這就大大友善了開發者,也使應用程式不再局限于裝置。應用程式開發者不再需要了解硬體的知識,隻要知道如何使用DC就可以在各種不同的裝置上實作想要的效果。

是以,我們就可以給裝置上下文(DC)一個定義:DC是一種包含有關某個裝置(如顯示器或列印機)的繪制屬性資訊的Windows資料結構。所有繪制調用都通過裝置上下文對象進行,這些對象封裝了用于繪制線條、形狀和文本的 Windows API。裝置上下文允許在Windows中進行與裝置無關的繪制。裝置上下文可用于繪制到螢幕、列印機或者圖元檔案。了解了裝置上下文,裝置無關性就好了解了。比如用GDI畫圓指令在顯示器的DC上畫了一個圓,同樣的處理隻需要将DC換成各種廠家的列印機DC,就可以在列印機上列印同樣的一個圓。這就是裝置無關性。

接下來我們看看思傑UPD的組成部分:

伺服器元件:在XenApp伺服器或基于XenDesktop的虛拟桌面上,思傑通用列印機驅動程式內建在XenApp/ XenDesktop的VDA中,在安裝VDA元件的時候自動進行安裝。當應用程式的列印作業需要此驅動程式或者說啟用通用列印時,此驅動将應用程式的列印資料直接輸出,資料不做任何修改,并經由ICA / HDX協定發送到使用者的用戶端。

用戶端元件:思傑UPD的用戶端元件也內建在Citrix Receiver裡面,在Citrix Receiver安裝的時候一并進行附帶安裝。它擷取接受的列印流的XenApp伺服器或XenDesktop虛拟桌面的列印資料,并将其轉發到本地Windows的列印子系統,然後利用Windows原本的列印機驅動程式進行列印作業。

其列印的基本流程如下圖所示:

Citrix XenApp和XenDesktop 列印系統解析②

該Citrix通用列印機驅動程式(UPD)在所有Citrix桌面或應用伺服器上會安裝它的驅動,同時,在用戶端上也運作着該通用列印驅動程式(UPD)。在實際的列印過程中,列印文檔需求的一些列印機設定直接從用戶端(帶智能緩存)檢索,比如列印機的屬性等資訊。

下圖表示了使用UPD後,在VDA上遠端去操作本地用戶端上的列印機的設定。

Citrix XenApp和XenDesktop 列印系統解析②

這些列印機的功能和列印機的服務是由本地用戶端的列印機真實的驅動去讀取的。通用驅動程式(UPD)不了解也并不需要了解這些列印機的設定或者選項。通用驅動程式(UPD)隻是将文檔列印設定選項以及需求傳遞給遠端用戶端,并由遠端用戶端去真實的列印機驅動裡面進行應答。這個行為在Windows列印中學名叫作:應用程式應答。

是以,使用通用列印驅動程式(UPD),就不需要在XenApp/XenDesktop伺服器上安裝列印機的驅動,隻需要在本地用戶端安裝列印機的真實的驅動即可,Citrix的通用驅動(UPD)隻是一個中介,承載Citrix後端的列印任務并傳送到用戶端本地,然後交由用戶端本地真正的列印機驅動去進行列印。

那麼UPD的伺服器端元件是如何在XenApp伺服器或XenDesktop的虛拟桌面擷取列印資料的?

我們通過下圖來逐漸進行講解:

Citrix XenApp和XenDesktop 列印系統解析②

Windows的列印機制是一個子產品化的系統,由列印假脫機 (Print Spooler)和一套列印機驅動組成。其功能可分為五個子產品:列印假脫機系統的列印處理器、語言螢幕和端口螢幕;列印機驅動程式的列印圖形DLL和列印接口DLL。如上圖。

一個完整的列印流程是這樣的:

1、使用者通過列印機的屬性界面,調用列印接口DLL枚舉列印機和設定列印文檔的屬性;

2、作業系統調用列印機驅動建立裝置上下文(DC),應用程式操作裝置上下文,調用GDI中函數(基于WPF架構開發的應用程式不用調用GDI,而是直接生成XPS紙張規範格式)發出的列印請求并初始化列印機;

3、列印接口DLL調用GDI函數進行繪圖操作,将繪圖記錄儲存在EMF檔案中,如果是PCL或者XPS,直接輸出為XPS或者PCL檔案;

4、重複繪圖操作直到繪圖完成,并生成一個完整的EMF檔案,然後WinSpool.drv列印用戶端通過RPC發送到列印假脫機程式(Print Spooler)。

5、列印處理器調用GDI的繪圖引擎(GDI Rendering Engine),在列印圖形DLL等插件協助下,把EMF檔案中的繪圖指令逐條解析到Spooler File(Windows下是.SPL和.SHD字尾的檔案)中。Spooler File是列印假脫機的緩存檔案池。

6、列印機假脫機系統的語言螢幕開始工作,根據列印機的列印控制語言,列印假脫機的緩存檔案被用來發送Postscript指令或者PCL指令到Postscript列印機或者HP列印機(PCL是HP列印機的控制語言,當然别的很多列印機也支援PCL),Postscript指令或PCL指令能夠被列印機了解。

7、列印語言螢幕調用列印端口螢幕,端口螢幕向下調用核心中的總線端口驅動程式并将列印機指令發送給實體列印機。

在這個過程中我們可以看到,我們能夠擷取資料的地方有三個:

第一個:在驅動生産列印假脫機檔案傳遞給列印假脫機程式之前截獲;

第二個:直接将列印假脫機的緩存檔案拿出來或者拷貝一份;

第三個:在端口螢幕将資料轉發給核心中的總線端口驅動的時候進行資料截斷;

實際上在Citrix的列印解決方案中,前兩個方法都會被使用到。第一個方法是給Citrix Universal PrintDriver(UPD)使用的,第二個方法是給Native Printer Driver(NPD)使用的。第三種方法為什麼沒用呢?毫無疑問,第三種方法中,直接截獲的是列印機的指令,必須是支援這種列印機指令的列印機才能夠進行列印作業,這種方法下相容性對列印機的相容性最差,需要相對應的列印機型号才行。

如上圖,Citrix Universal PrintDriver(UPD)通過在Spoolsv.exe程序的上面使用Citrix API Hook鈎子技術,将WinSpool.drv列印用戶端傳遞過來的列印假脫機檔案進行截獲,并傳遞給ICA/HDX協定傳輸到使用者用戶端。這個API Hook鈎子就是UPD Hook。說道這兒我想大家已經明白了大體的流程:

Citrix XenApp和XenDesktop 列印系統解析②

簡要說明上圖流程:

1、運作在XenApp伺服器或XenDesktop虛拟桌面上的應用程式請求列印。

2、應用程式通過調用列印驅動程式以及相關圖形API建立或繪制EMF檔案(如果是XPS格式的話,就需要通用驅動程式去調用Windows的通用驅動程式,然後進行XPS和EMF的轉換操作,這個在之前的文章有所闡述)。

3、EMF檔案被發送到作業系統上的列印背景處理程式上。

4、正常情況下列印背景處理程式使用适當的列印機驅動程式來建立用于列印機進行列印的假脫機檔案。但是在思傑“通用列印驅動程式。”模式下,此驅動程式根本不會根據EMF檔案建立列印假脫機檔案,而是通過API Hook攔截發送給Print Spooler的EMF檔案。

5、通用列印驅動程式将攔截的EMF檔案經由ICA/HDX協定列印通道傳遞到到Citrix Receiver用戶端。

6、Windows 的Citrix Receiver用戶端接收EMF檔案。并轉移到Citrix Receiver用戶端的通用列印元件處理。

7、用戶端的通用列印驅動程式元件将該檔案傳遞給用戶端上的WIndows本地列印假脫機系統處理(Spooler),然後繼續Windows的列印處理過程,調用本地的列印驅動程式,開始生成列印假脫機檔案。

8、最後,列印假脫機系統将其列印作業發送到适當的列印機。

在這個過程中,Citrix UPD模式使用的格式是EMF。實際上在Citrix UPD之前的版本中,預設使用的并不是EMF。

現在我們所使用的Citrix UPD是V3的版本,也就是說這是Citrix UPD的第三個發行版本。其版本演變如下:

UPD V1:這個版本是基于Citrix MetaFrame XPFR1的推出發行的,其發行日期為2004年。其預設使用的格式是PCL4而并不是EMF。這個主要是在當時,Citrix和HP公司簽署了一項合作,Citrix公司OEM惠普的PCL4以及相關的列印驅動來開發UPD V1的版本。在當時,PCL最新的版本就是PCL4。

UPD V2:這個版本主要是基于Citrix MetaFrame XPFR3推出的更新,當時包括HP業以推出了最新的PCL 5c的列印機控制語言,同時,在這個版本中,添加了一些顔色列印方案和列印dpi的提升。其預設使用的格式是PCL5c。

UPD V3:直到Citrix推出Presentation Server4.0之後,才推出了UPD V3的版本。這個版本一直沿用至今。在這個版本中,Citrix不在使用PCL作為預設的列印檔案格式,而是使用微軟的EMF作為預設的列印檔案格式。同時,也在該版本中添加了對XPS的支援。

而作為這三個版本的演變,我們通過下圖加深了解:

在UPD V1的時候,其截獲的資料檔案流程圖:

Citrix XenApp和XenDesktop 列印系統解析②

如圖,在UPD V1版本的時候,其使用PCL4語言,是以其用PCL4語言描述的檔案就是PCL4檔案。

在UPD V2的時候,其截獲的資料檔案流程圖:

Citrix XenApp和XenDesktop 列印系統解析②

在Citrix UPD V3的版本中,預設使用EMF,但是也支援XPS等格式。

下面羅列了Citrix UPD支援的列印格式:

增強型圖元檔案格式(EMF)(預設)。 EMF是32位版本的Windows圖元檔案(WMF)格式。什麼是圖元檔案呢?應用程式經常需要互相交換圖形資料,這需要将圖形資料存放成檔案格式。這種檔案格式就是圖元檔案。例如,使用者可能使用CAD複雜的特效來設計線條藝術,用PhotoShop編輯真實圖像,用Word做文字處理,當這些應用程式一起工作時,它們需要一種通用的資料供它們讀寫,并交換圖形資料。那麼每一個應用程式都會建立這麼一個圖元檔案。

XML紙張規格(XPS)。XPS驅動程式使用XML建立一個獨立于平台的“電子紙”,類似Adobe的PDF格式。XPS列印作業傾向于具有更小的體積,但在列印作業開始的時候,需要一直等到列印機收到作業的最後一頁才會開始列印,EMF則可以邊接收邊開始列印。如果應用程式支援Windows示範基礎(WPF)格式以及列印機支援XPS格式。那麼就這可以直接使用XPS進行列印作業了。如果任何一個不被支援,那麼列印作業将被轉換為EMF格式。

列印機指令語言(PCL5c和PCL4)。PCL最初是由惠普為噴墨列印機開發的一款列印協定。現在的PCL廣泛支援HP LaserJet和多功能外設。最新的是PCL6,但是Citrix UPD并不支援PCL 6。PCL5c和PCL4主要是Citrix UPD V1和V2支援,并在V3中保持向上相容。

PostScript(PS)。PostScript是一種計算機語言,可以用于列印文字和矢量圖形。它一方面是一種具有很強圖形功能的通用程式設計語言,另一方面又是一種具有一般程式設計語言特性的頁面描述語言。也就是說,PostScript具有通用程式設計語言和頁面描述語言的雙重特征。PostScript是Adobe公司開發的,屬于收費的語言,任何公司和産品要使用PostScript都得向Adobe公司繳納費用。同時,PostScript語言還屬于直接列印假脫機檔案,其直接省略了列印假脫機系統的渲染或者解析步驟,直接發送給列印機,由列印機對指令的内容進行渲染和繪制。這種直接列印檔案的優勢很明顯,将渲染工作交給列印機,可以減少系統的負擔。這類檔案比較少見,目前也就是HP格式的PCL6和Adobe的PostScript是屬于這類型的直接列印檔案和列印機控制語言。該驅動程式主要在高成本的列印機和多功能外圍裝置使用。

PCL和PS驅動程式除了在Windows上受支援外,還支援非Windows的用戶端,比如Mac、Linux或UNIX用戶端。而且也是這樣的,在Citrix Receiver的Linux用戶端上,由于Linux系統并不支援Windows系統的EMF和XPS,是以也沒法使用基于EMF和XPS列印檔案格式的驅動程式。注:可以根據Citrix的“通用驅動程式優先”政策改變思傑UPD使用驅動的順序。

根據被支援的列印檔案格式,我們來說明一下Citrix UPD列印機驅動程式的工作原理:

一個應用程式通過調用圖形驅動界面(GDI)或者WPF建立一個列印任務。如果是GDI的,不管列印任務的初始輸出格式是否為EMF格式,本地列印服務程式的任務生成API都會建立一個緩沖檔案。如果是XPS的,直接生成XPS的格式,之後該任務在進入本地Windows的Print Spooler列印子系統時,Citrix API Hook鈎子就将其發送過來的的EMF/XPS/PS/PCL4/PCL5c檔案攔截,是以本地的Print Spooler不會接收到應用程式發送過來的列印資料。而Citrix的API Hook将資料截取過來之後,Citrix UPD反而将列印檔案重新封裝,然後經ICA/HDX協定的虛拟列印通道傳送給前端的Citrix Receiver。

Citrix Receiver終端将接收到的資料拆裝, 然後傳入Citrix UPD,Citrix UPD會根據列印的格式做相應的處理:

1、如果格式是EMF時,轉發至本地Print Spooler,本地Print Spooler會首先生成Spooler File并存儲在緩存中,然後根據語言螢幕判斷,列印機是否支援EMF格式的列印,如果不支援,EMF列印處理器就會将資料傳回給GDI,在列印機圖形DLL的幫助下,轉換成RAW格式。轉換後的資料流能夠通過本地列印服務程式在送回列印機(不再重新被緩沖)。

2、如果格式是PCL4或者PCL5c時,如果是Windows的用戶端,轉發至本地Print Spooler,本地Print Spooler會首先生成Spooler File并存儲在緩存中,然後根據語言螢幕判斷,列印機是否支援PCL4或PCL5c格式的列印,如果不支援,驅動列印處理器就會将資料傳回給GDI,在列印機圖形DLL的幫助下,轉換成RAW格式。如果是Linux的用戶端, Linux的CUPS(Common UNIXPrinting System,Linux/Unix平台的首選列印系統)中通過列印機驅動進行渲染,然後判斷列印機是否支援PCL4以及PCL5c,如果不支援,則需要CUPS将轉化為列印機能夠識别的資料,比如PostScript資料。注:Linux系統中最長見的列印格式支援是PCL和PostScript。

3、如果格式是XPS時,轉發至本地Print Spooler,本地Print Spooler會首先生成Spooler File并存儲在緩存中,然後根據語言螢幕判斷,列印機是否支援XPS格式的列印,如果不支援,XPS驅動會首先調用XPS轉EMF處理器,将XPS檔案轉換為EMF格式,再去判斷EMF是否支援,不被支援時,再由列印處理器将資料傳回給GDI,在列印機圖形DLL的幫助下,轉換成RAW格式。

4、如果格式是PostScript時,如果是Windows的用戶端,那麼就轉發至本地的Print Spooler,本地的Print Spooler直接将PS檔案轉發至列印機。如果是Linux的系統,Linux的CUPS(Common UNIXPrinting System,Linux/Unix平台的首選列印系統)将列印資料直接輸出到列印機。如果列印機不支援PostScript,而是PCL的列印機,,則需在CUPS中通過列印機驅動将PostScript轉化為PCL資料。

上述以及說明了Citrix UPD的列印前驅動程式鎖支援的列印格式,那麼Citrix的UPD都開發了那些元件來支援這些列印格式呢?下面我們來看看Citrix UPD的元件。

在Windows XP作業系統的32位或64位版本中,那個時代的Citrix UPD屬于V1的版本,是以其開發了如下的元件用于支援上述的列印檔案格式:

Citrix UniversalPrinter

Citrix XPS UniversalPrinter

HP Color LaserJet

HP Color LaserJet PS

HP LaserJet Series II

打開Windows XP下的通用列印驅動程式,我們可以看到其上所列的元件:

Citrix XenApp和XenDesktop 列印系統解析②

在Citrix UPD V2版本下,其元件由有所變化:

HP Color LaserJet 4500PCL 5

HP Color LaserJet 4500PS

如圖所示:

Citrix XenApp和XenDesktop 列印系統解析②

在Citrix UPD V3版本的時候,其元件如下:

HP Color LaserJet 2800Series PS

如下圖所示:

Citrix XenApp和XenDesktop 列印系統解析②

就V3版本的這三個元件來說,其各自支援的列印檔案格式有所不同,  Citrix Universal Printer是用于支援EMF/PCL4/PCL5c的元件;Citrix XPS UniversalPrinter是用于支援XPS的元件;HP Color LaserJet 2800Series PS用于支援PostScript的元件。

Citrix UPD這種方式有諸多優點:

1) 體驗好。在大型的安裝和部署環境中,可以通過使用Citrix UPD來減少對後端系統的列印機驅動程式的維護量,并且有相同的列印機屬性頁給到使用者,提供一緻的使用者體驗。

2) 列印穩定性更高。XenApp伺服器或XenDesktop虛拟桌面與Citrix Receiver終端之間實際傳輸的是檔案, 其穩定性和可靠性比基于網絡的USB通信協定的傳輸方式更高。

當然,UPD 技術也有明顯的局限性,:

1)用戶端上大量列印機驅動的維護問題;

2)使用Windows終端的作業系統所具有的許可成本.;

3)不支援列印機的進階特性;

4)列印設計問題:比如不檢查列印的适當的對齊和格式;

5)在使用特定應用程式的時候與列印機存在相容性問題等等。

接下來我們來講解Citrix UPS!歡迎大家指點,共同進步。

繼續閱讀