摘 要:為了在第三方系統中可以方便地使用虛擬打印,在研究虛擬打印技術的基礎上,按照組件模型標準提供了豐富的二次開發接口,包括安裝、卸載虛擬打印機等。為快速將文檔轉換成圖形文件,該系統采用重寫Print Processor方式實現虛擬打印。目前該系統已經在多個第三方系統中得到初步的應用。
關鍵詞:虛擬打印;打印處理機;組件模型;廣播消息
中圖分類號:TP271文獻標識碼:B
文章編號:1004-373X(2008)06-171-03
Research and Realization of Virtual Printer Based on Component Object Model
YI Yun
(Gannan Normal University,Ganzhou,341000,China)
Abstract:Base on the research of virtual printer technology,the virtual printer system provides abundant secondary exploitation interface according to COM standard,in order to conveniently use virtual printer in third party system.The interfaces include install,uninstall virtual printer etc.In order to convert document into image file quickly,the system uses rewriting Print Processor to realize virtual printer.Now there are several third party systems that use the virtual printer system.
Keywords:virtual printer;print processor;component object model;broadcast message
虛擬打印是利用某種方式截獲操作系統的打印任務,將打印任務轉換為圖像文件并保存在指定目錄的系統。通過虛擬打印系統,用戶可以將任意可打印的文檔轉換為統一的圖像文件,由一種應用程序進行瀏覽。因此在Web環境、多客戶端情況下,客戶端不需要為瀏覽多種應用程序的文件而安裝多種應用程序,便于實現瘦客戶端和降低系統的軟件成本。本文通過研究比較現有的虛擬打印系統,提出建立基于組件模型的虛擬打印系統,主要介紹的技術包括:虛擬打印機的實現、虛擬打印機的安裝卸載、系統二次開發接口等。
1 Windows打印系統結構
虛擬打印基于Windows打印體系,是對Windows打印系統的一種應用及拓展。微軟的Windows NT系列打印體系結構由打印假脫機和一套打印驅動程序組成。
應用程序對Win32 GDI函數的調用傳送到GDI圖形引擎,GDI圖形引擎可以將繪制指令假脫到一個EMF文件中,或者與打印驅動程序連接,向假脫機繪制一個可打印的圖像。假脫機組件解釋EMF文件,他們可以在數據流中插入頁面布局信息以及作業控制指令。然后假脫機將數據流發送給具有目標打印機I/O端口的串行、并行或網絡端口的驅動程序。其體系結構如圖1所示。
2 虛擬打印系統的研究
按照獲取打印任務方式的不同,可以將虛擬打印系統分為3種類型:重寫Print Processor,在假托模塊中實現轉換,例如Mabuse.De的VPrinter;采用回調機制在打印任務發送到Spooler之前獲取打印數據流,例如Northeast Data 公司的Image Printer Driver;通過監視Port Monitor獲取打印任務數據,例如Adobe公司的Adobe Acrobat Writer。
圖1 Windows打印體系結構
目前絕大部分虛擬打印系統都是獨立的系統,使用各自的文件格式來保存打印結果,很少以組件的方式提供二次開發接口,使得上述虛擬打印系統很難與其他應用系統進行集成。本文研發的基于組件模型的虛擬打印系統,采用重寫Print Processor方式實現打印任務的獲取。該系統提供了豐富的二次開發接口,可以按照應用系統集成商的要求提供文檔轉換功能,最大限度地降低了應用系統的成本。
3 虛擬打印系統的實現
基于組件模型的虛擬打印系統主要包括2部分:打印機驅動程序模塊和二次開發接口模塊。其體系結構如圖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
圖3 打印任務轉換過程
以上信息設定后,轉換生成的圖片為JPG格式文件,圖片寬為1 024 pixel,高為768 pixel。
3.3 封裝組件,提供二次開發接口
二次開發接口是虛擬打印系統提供給第三方應用系統調用或設置的方法。良好豐富的二次開發接口,使得本系統可以快速便捷的與第三方應用系統進行集成,大大提高系統的應用范圍。按照組件模型的思想,本系統中將二次開發接口封裝成Activex組件,使得用戶可以通過簡單的JavaScript調用接口方法。
3.3.1 安裝、卸載打印機接口
一般采用由最終用戶通過在控制面板中選擇添加打印機的方式來安裝打印機。這種方法對最終用戶要求比較高,不適合大規模的應用。因此,封裝了一個Acitvex實現打印機的安裝和卸載,使得第三方應用系統可以非常方便地安裝、卸載虛擬打印機。該Activex提供以下2個方法:
(1) InstallVirtualPrint,實現安裝打印機,關鍵部分解釋如下:
bool flag;
DRIVER_INFO_3 DriverInfo3;
……………………
//添加打印驅動程序
flag=AddPrinterDriver(NULL,3,DriverInfo3);
……………………
PRINTER_INFO_2 pPrinter;
HANDLE pHand;
……………………
//添加虛擬打印機
pHand=AddPrinter(NULL,2,(LPBYTE)pPrinter);
if (pHand == 0)
{
//如果添加失敗,返回出錯代碼
ClosePrinter(pHand);
return GetLastError();}
ClosePrinter(pHand);
(2) UnInstallVirtualPrint,實現卸載打印機,關鍵部分解釋如下:
//刪除打印處理器
DeletePrintProcessor(NULL,L\"Windows NT x86\",L\"VPrint\");
……………………
LPTSTR Env;
Env= L\"Windows NT x86\";
//刪除打印驅動
DeletePrinterDriver(NULL,Env,L\"VPrinter Driver\");
……………………
PRINTER_DEFAULTS pd;
HANDLE hp;
ZeroMemory(pd,sizeof(PRINTER_DEFAULTS));
pd.DesiredAccess=PRINTER_ALL_ACCESS;
if (OpenPrinter(\"VPrinter\",hp,pd))
{ //刪除打印機
if (1==DeletePrinter(hp))
{ //如果失敗,返回出錯代碼
return GetLastError(); } }
3.3.2 打印機信息設置接口
為了方便第三方系統集成,打印機基本信息存儲在系統INI文件中。集成用戶按照標準可以非常方便地修改打印機的相關信息,例如:轉換后圖像文件的保存路徑,當前文件的前綴等。
[FileInfo]
Directory = c:\\\\123
Prefix = 123
以上信息設定后,轉換生成的圖像文件就保存在c:\\\\123目錄下,文件名稱按以下規則形成“123_頁碼”。第三方系統也可以通過編程的方式動態修改配置文件。
3.3.3 圖像生成事件通知接口
在第三方系統集成時,希望實時知道什么時候轉換完成,什么時候轉換了某一頁。因此本系統采用Windows廣播消息的方式來通知集成系統。廣播消息是Windows系統中,不同進程之間通信最實時、最快捷的方式。廣播消息分為2個步驟:利用RegisterWindowMessage函數向Windows系統注冊消息句柄;利用PostMessage函數寄送消息,需要注意的是第一個參數必須為HWND_BROADCAST。集成系統可以在消息循環中獲取廣播的消息,以VC開發工具為例,如下過程就可以獲取廣播的消息:利用RegisterWindowMessage注冊同一消息句柄;利用ON_REGISTERED_MESSAGE宏,映射消息句柄到消息處理函數。
4 結 語
在研究現有虛擬打印系統的基礎上,指出這些系統存在的問題,研究并實現基于組件模型的虛擬打印系統。該系統具有轉換快速、二次開發接口豐富等特點,并且已經應用在第三方系統中,如:iWebOffice網絡文檔、iSignature GDF電子簽章系統。
參 考 文 獻
[1]\\[美\\]Art Baker,Jerry Lozano.Windows2000設備驅動程序設計指南\\[M\\].北京:機械工業出版社,2001.
[2]\\[美\\]David J Kruglinski.Visual C++技術內幕\\[M\\].北京:清華大學出版社,2001.
[3]Documentation of Driver Development Kit (DDK) for Microsoft.Windows,2000.
作者簡介 易 云 男,1983年出生,碩士。主要研究方向為網絡信息安全等。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文