虛擬列印是利用某種方式截獲作業系統的列印任務,將列印任務轉換為影像檔並儲存在指定目錄的系統。通過虛擬列印系統,使用者可以將任意可列印的文檔轉換為統一的影像檔,由一種應用程式進行瀏覽。因此在Web環境、多用戶端情況下,用戶端不需要為瀏覽多種應用程式的檔案而安裝多種應用程式,便於實現瘦用戶端和降低系統的軟體成本。本文通過研究比較現有的虛擬列印系統,提出建立基於組件模型的虛擬列印系統,主要介紹的技術包括:虛擬印表機的實現、虛擬印表機的安裝卸載、系統二次開發介面等。
1 Windows列印系統結構
虛擬列印基於Windows列印體系,是對Windows列印系統的一種應用及拓展。微軟的Windows NT系列列印體繫結構由列印假離線和一套列印驅動程式組成。
應用程式對Win32 GDI函數的調用傳送到GDI圖形引擎,GDI圖形引擎可以將繪製指令假脫到一個EMF檔案中,或者與列印驅動程式串連,向假離線繪製一個可列印的映像。假離線組件解釋EMF檔案,他們可以在資料流中插入頁面配置資訊以及作業控制指令。然後假離線將資料流發送給具有目標印表機I/O連接埠的串列、並行或網路連接埠的驅動程式。其體繫結構1所示。
2 虛擬列印系統的研究
按照擷取列印任務方式的不同,可以將虛擬列印系統分為3種類型:重寫Print Processor,在假託模組中實現轉換,例如Mabuse.De的VPrinter;採用回調機制在列印任務發送到Spoolez之前擷取列印資料流,例如NortheastData公司的Image Printer Driver;通過監視Port Monitor擷取列印任務資料,例如Adobe公司的Adobe AcrobatWriter。
目前絕大部分虛擬列印系統都是獨立的系統,使用各自的檔案格式來儲存列印結果,很少以組件的方式提供二次開發介面,使得上述虛擬列印系統很難與其他應用系統進行整合。本文研發的基於組件模型的虛擬列印系統,採用重寫Print Processor方式實現列印任務的擷取。該系統提供了豐富的二次開發介面,可以按照應用系統整合商的要求提供文檔轉換功能,最大限度地降低了應用系統的成本。
3 虛擬列印系統的實現
基於組件模型的虛擬列印系統主要包括2部分:印表機驅動程式模組和二次開發介面模組。其體繫結構2所示:
3.1 擷取列印任務
列印任務的截取,是整個虛擬列印系統的關鍵區段。從圖1中可以看出,Print Processor負責將列印任務處理後發送到Port Monitor,Print Processor是一個可替換的DLL,安裝DDK中的約定,實現以下6個函數,就可以自訂一個Print Processor。
(1)EnumPrintProcessorDatatypes,該函數主要處理並返回列印處理器所能處理的資料類型;
(2)ControlPrintProcessor,該函數主要提供方法供使用者控制列印處理器,如停止、刪除、重新開始列印任務等;
(3)GetPrintProcessorCapabilities,該函數主要供Windows系統擷取針對某種輸入資料的處理能力;
(4)OpenPrintProcessor,返回該列印處理器的控制代碼給系統;
(5)PrintDocumentOnPrintProcessor,處理列印任務,將處理後的資料發送到Port Monitor或者轉換為影像檔等;
(6)ClosePrintProcessor,關閉列印處理器。
圖3詳細說明在PrintDocumentOnPrintProcessor中如何將列印任務轉換為影像檔的過程。
3.2 產生指定格式、大小的映像
虛擬列印系統擷取的列印頁面未經處理資料是EMF向量圖形檔案。如果轉換前的文檔中沒有大量的圖片資訊,那麼轉換後的EMF檔案是比較小的,一般1頁Word轉換後在20~50 k大小。因此本系統提供了配置介面供使用者選擇最終儲存的映像格式,目前支援JPG,GIF,PNG等常用的映像格式。可以按照如下方式修改映像的格式和大小:
[ImageInfo]
ImageWidth=1024
ImageHeight=768
ImageType=JPG
以上資訊設定後,轉換產生的圖片為JPG格式檔案,圖片寬為1 024 pixel,高為768 pixel。
3.3 封裝組件,提供二次開發介面
二次開發介面是虛擬列印系統提供給第三方應用系統調用或設定的方法。良好豐富的二次開發介面,使得本系統可以快速便捷的與第三方應用系統進行整合,大大提高系統的應用範圍。按照組件模型的思想,本系統中將二次開發介面封裝成Activex組件,使得使用者可以通過簡單的JavaScript調用介面方法。
3.3.1 安裝、卸載印表機介面
一般採用由終端使用者通過在控制台中選擇添加印表機的方式來安裝印表機。這種方法對終端使用者要求比較高,不適合大規模的應用。因此,封裝了一個Acitvex實現印表機的安裝和卸載,使得第三方應用系統可以非常方便地安裝、卸載虛擬印表機。該Activex提供以下2個方法:
(1)InstallVirtualPrint,實現安裝印表機,關鍵區段解釋如下:
(2)UnInstallVirtualPrint,實現卸載印表機,關鍵區段解釋如下:
3.3.2 印表機資訊設定介面
為了方便第三方系統整合,印表機基本資料儲存在系統INI檔案中。整合使用者按照標準可以非常方便地修改印表機的相關資訊,例如:轉換後影像檔的儲存路徑,當前檔案的首碼等。
以上資訊設定後,轉換產生的影像檔就儲存在c:\123目錄下,檔案名稱按以下規則形成“123_頁碼”。第三方系統也可以通過編程的方式動態修改設定檔。
3.3.3 映像建置事件通知介面
在第三方系統整合時,希望即時知道什麼時候轉換完成,什麼時候轉換了某一頁。因此本系統採用Windows廣播訊息的方式來通知整合系統。廣播訊息是Windows系統中,不同進程之間通訊最即時、最快捷的方式。廣播訊息分為2個步驟:利用RegisterWindowMessage函數向Windows系統註冊訊息控制代碼;利用PostMessage函數寄送訊息,需要注意的是第一個參數必須為HWND_BROAD-CAST。整合系統可以在訊息迴圈中擷取廣播的訊息,以VC開發工具為例,如下過程就可以擷取廣播的訊息:利用RegisterWindowMessage註冊同一訊息控制代碼;利用ON_REGISTERED_MESSAGE宏,映射訊息控制代碼到訊息處理函數。
4 結 語
在研究現有虛擬列印系統的基礎上,指出這些系統存在的問題,研究並實現基於組件模型的虛擬列印系統。該系統具有轉換快速、二次開發介面豐富等特點,並且已經應用在第三方系統中,如:iWebOffice網路文檔、iSignatureGDF電子簽章系統