專利名稱:在Windows打印過程中監(jiān)控打印數(shù)據(jù)的系統(tǒng)和方法
技術領域:
本發(fā)明涉及若干在Windows打印過程中監(jiān)控打印數(shù)據(jù)的系統(tǒng)和方法。通過這些系統(tǒng)和方法,可以通用的實現(xiàn)Windows操作系統(tǒng)的打印過程監(jiān)控、打印審批、打印內容過濾、預覽和保存、條碼和水印嵌入、重新打印、異地還原打印等功能,并且通用的解決了打印作業(yè)高級屬性設置和打印機特性屬性設置丟失的問題。
背景技術:
Windows操作系統(tǒng)泛指微軟公司推出的一系列操作系統(tǒng)。當前,微軟發(fā)布的常規(guī)Windows操作系統(tǒng)(如ffindows XP, Vista, Windows 7等)均內置了打印管理系統(tǒng),并且其架構自Windows 2000以來未發(fā)生本質改變,因此,本文所述之Windows打印管理系統(tǒng),適用于Windows 2000及以上版本。微軟將Windows打印管理系統(tǒng)的體系結構設計得非常復雜,其目的是為支持不同類型打印機和兼容早期型號打印機。Windows NT/2000的打印體系結構以后臺打印為基礎,并由GDI和一套打印機驅動程序所支持。圖1描述了 Windows打印管理體系⑶I打印路徑的方框圖。為了能便于對流程的描述,先簡單介紹一下圖中出現(xiàn)的關鍵名詞術語1.后臺打印(Print SPOOLing)SPOOL 是 Simultaneous Peripheral Operation On-Line (即外部設備聯(lián)機并行操作)的縮寫,它是關于低速輸入輸出設備如何與計算機主機交換信息的一種技術,通常稱為“假脫機技術”。SPOOLing系統(tǒng)既不同于脫機方式,也不同于直接稱合方式,SPOOLing技術實際上是一種外圍設備同時聯(lián)機操作技術,又稱為排隊轉儲技術。它在輸入和輸出之間增加了“輸入池”和“輸出池”的排隊轉儲環(huán)節(jié),以消除用戶的“聯(lián)機”等待時間。宏觀上,雖然是多個進程在同時使用同一臺設備,而對每一個進程而言,它們都認為自己是獨占了一臺設備。當然,該設備只是邏輯上的設備。SPOOLing系統(tǒng)實現(xiàn)了將獨占設備變換為若干臺對應的邏輯設備的功能。SPOOLing技術實質上是用戶進程利用一個共享的存儲區(qū),并不是真正占用了此設備,用戶進程把要完成的任務以文件的形式存入存儲區(qū),在存儲區(qū)中排隊并等待SPOOLing系統(tǒng)調度,只有被SPOOLing系統(tǒng)調度并輸出,此項任務才真正完成,通過這一技術可以大大提高了共享設備的使用率,節(jié)約了硬件資源。SPOOLing技術的典型應用就是后臺打印(Print SPOOLing):特定格式的文件(打印作業(yè)文件)被保存在一個磁盤上,而打印系統(tǒng)根據(jù)自己的速度檢索并打印這些文檔。打印機通常一次只能打印一個文件,并且需要幾秒或者幾分鐘完成一個文件的打印。有了后臺打印系統(tǒng),多個進程可以直接將要打印的文檔放入隊列中而不需要做任何等待。一個進程只要將文檔放入打印作業(yè)隊列(即人們通常所說的發(fā)起打印作業(yè))就可以處理其他任務,因為有另外一個獨立的打印進程來負責處理打印隊列并操作打印機進行打印,直到打印隊列為空。在Windows系統(tǒng)中,微軟將此功能稱為“后臺打印”,因此,本文中也將PrintSPOOLing稱為后臺打印。2.打印處理器打印處理器是Windows的后臺打印體系中負責接收和處理打印作業(yè)的接口,即負責把打印進程放入后臺打印隊列中的打印格式文件轉換到可送到打印機的原始數(shù)據(jù)格式,打印處理器也用于控制打印作業(yè)的暫停,恢復,取消。在Windows 2000/NT下,放入打印池中的打印格式文件一般是EMF格式的。GDI幫助應用程序把繪圖請求記錄成EMF格式,并把它快速寫入磁盤,讓應用程序回到正常操作的狀態(tài)。Windows打印處理器(在LOCALSPL. DLL中)支持幾種打印池格式,包括NT EMF,RAW 和 TEXT。3.打印作業(yè)數(shù)據(jù)格式打印進程放入后臺打印隊列中的打印作業(yè)文件的數(shù)據(jù)格式,通常被稱為打印作業(yè)數(shù)據(jù)格式。而其文件被稱為打印作業(yè)文件。打印作業(yè)數(shù)據(jù)格式通常有EMF、RAW和TEXT這二種。EMF數(shù)據(jù)格式是所有Windows應用程序的最常用打印作業(yè)數(shù)據(jù)格式。EMF打印作業(yè)文件通常比打印機能接收的原始數(shù)據(jù)小很多;RAW數(shù)據(jù)格式,指的是由打印程序直接生成可被打印機直接使用的數(shù)據(jù),而不是由打印服務生成;TEXT數(shù)據(jù)格式只包括ANSI文本,打印處理器負責把文本字符串生成打印機接受的數(shù)據(jù)格式。結合圖1和以上名詞術語解釋可以看出,Windows打印管理體系⑶I打印路徑的主要流程是用戶應用程序調用GDI和后臺打印客戶DLL導出的API入口點啟動打印作業(yè),GDI和后臺打印程序在打印機驅動程序的幫助下處理打印作業(yè),并把數(shù)據(jù)發(fā)送到各種硬件拷貝設備,包括激光打印機,噴墨打印機,繪圖儀和傳真機。其詳細流程如圖2所示,說明如下1.用戶發(fā)起一個打印作業(yè)如果是EMF格式打印作業(yè),用戶應用程序對Win32⑶I函數(shù)的調用被Windows發(fā)送到⑶I圖形引擎(簡稱⑶I),由其負責將繪圖指令轉換成增強型元文件(EMF)。此EMF文件和另一個包含當前打印設置的文件被傳遞給后臺打印系統(tǒng)服務進程(SPOOLS. EXEhM時,應用程序完成了自己的任務,而后臺打印系統(tǒng)保證文檔被打印。如果是RAW格式打印作業(yè),⑶I把⑶I命令分解成由DDI (device driverinterface,設備驅動程序接口)定義的繪元,并把繪元送到打印機驅動程序。打印機驅動程序將圖元轉換成打印機語言格式的原始數(shù)據(jù)(RAW格式數(shù)據(jù)),例如PCL,ESC/P, POSTSCRIPT。2.打印作業(yè)進入打印隊列后臺打印進程把任務發(fā)送到打印提供者,打印提供者操作真實打印機。打印機可以是本地打印提供者(LOCALSPL. DLL)管理的本地打印機,也可以是通過Windows網絡打印提供者(WIN32SPL. DLL)管理的Windows網絡打印機。如果打印機在遠程計算機上,Windows網絡服務會把后臺打印作業(yè)文件發(fā)送到遠程計算機,然后遠程計算機將其作為本地計算機的打印作業(yè)放入打印隊列。3.⑶I回放
如果是EMF格式打印作業(yè),本地打印提供者得到打印作業(yè),并將它傳遞給打印處理器,打印處理器檢查后臺打印文件的格式。對于EMF文件,它將內容的每一頁回放給GDI,⑶I把⑶I命令分解成由DDI (device driver interface,設備驅動程序接口)定義的繪元,并把繪元送到打印機驅動程序。打印機驅動程序將圖元轉換成打印機語言格式的原始數(shù)據(jù)(RAW格式數(shù)據(jù)),例如PCL,ESC/P,POSTSCRIPT。如果是RAW格式打印作業(yè),因為已經是打印機語言格式的原始數(shù)據(jù),則無此步驟。4.輸出至打印機打印機語言格式的原始數(shù)據(jù)再次被送到后臺打印程序的打印處理器中,處理器將其發(fā)送到語言監(jiān)視器,語言監(jiān)視器將數(shù)據(jù)送到端口監(jiān)視器,端口監(jiān)視器用Windows的文件系統(tǒng)API往硬件端口寫數(shù)據(jù),打印機解析數(shù)據(jù)并進行打印輸出,整個打印作業(yè)完成。從以上Windows的打印架構可以看出,在打印路徑的各個節(jié)點進行注入(Hook)均可以實現(xiàn)打印過程的監(jiān)控。主要方法有以下兩種1.利用進程內注入(Hook)技術獲得打印內容首先,WINDOWS應用程序通常調用后臺打印API來查詢打印隊列狀態(tài),控制打印作業(yè),或往打印機發(fā)送數(shù)據(jù)。在系統(tǒng)默認的打印處理器支持的數(shù)據(jù)類型是RAW,RAff[FFappended], RAW[FF auto], NT EMF1. 003, NT EMF1. 006, NT EMF1. 007, NT EMF1. 008,TEXT。對于RAW格式打印作業(yè),打印處理器用WritePrinter調用,在這種情況下,數(shù)據(jù)直接傳到語言監(jiān)視器。對于TEXT格式打印作業(yè)數(shù)據(jù),打印處理器進行新的startdoc調用,并將⑶I繪圖命令發(fā)送打印機驅動程序,打印機驅動程序負責調用WritePrinter。對于EMF格式打印作業(yè)數(shù)據(jù),打印處理器使用GDI的EMF回放機制把記錄好的繪圖命令發(fā)送到打印機驅動中。這樣的方式對于EMF和Text格式的打印作業(yè)有效,但是RAW數(shù)據(jù)格式的打印作業(yè)在打印處理器中無法獲得內容,因此單純的進程內注入(Hook)技術對于RAW數(shù)據(jù)格式的打印作業(yè)是完全無效的。2.利用打印端口監(jiān)視器中注入(Hook)技術獲得打印內容不論應用程序如何設置打印數(shù)據(jù)類型,利用打印端口監(jiān)視器中Hook技術可以保證獲得打印數(shù)據(jù)。但是當數(shù)據(jù)到達該層次時,已經是原始打印數(shù)據(jù),又稱為打印機就緒數(shù)據(jù),是用打印機控制語言表達的,不同的打印機接收不同的打印機控制語言。也就是說,這里獲得的數(shù)據(jù)已經是各種打印機語言。因此,在這個層次上實現(xiàn)打印數(shù)據(jù)的修改是非常復雜的,引發(fā)兼容性問題的風險很大。也就是說,此項技術不宜用于實現(xiàn)水印嵌入等帶有打印內容修改的功能,同時也增大了實現(xiàn)打印作業(yè)預覽的難度。3.禁用物理打印機驅動,利用虛擬打印機獲得打印內容此方法可以保證打印作業(yè)為EMF格式,并且保證能獲得打印內容。但是一個打印作業(yè)包含一個EMF文件和另一個包含當前打印設置的文件,此打印設置文件里面包含了一些不同打印機特殊的打印參數(shù)配置,而通過虛擬打印機獲得的打印數(shù)據(jù)幾乎無法做到完全匹配這些打印參數(shù),因此,當用戶打印文檔,特別是圖紙時利用到一些高級打印功能時,通過虛擬打印機再轉換為物理打印機(如繪圖儀)輸出時將出現(xiàn)打印作業(yè)高級屬性設置和打印機特性屬性設置丟失的問題。也就是說,現(xiàn)有技術存在著一定的局限性或兼容性問題,不能利用一項技術同時滿足打印過程監(jiān)控、打印審批、打印內容過濾、預覽和保存、條碼和水印嵌入、重新打印、異地還原打印的需求。
發(fā)明內容
本發(fā)明提出了若干在Windows操作系統(tǒng)打印過程中監(jiān)控打印數(shù)據(jù)的系統(tǒng)和方法。此系統(tǒng)和方法可以從以下打印作業(yè)中截獲并提取打印數(shù)據(jù)和對打印數(shù)據(jù)進行增加和(或)修改1.所有EMF格式打印作業(yè)2.用戶選擇非EMF打印格式的打印作業(yè)3.打印機默認使用非EMF格式的打印作業(yè)相比其它注入(Hook)技術獲得Windows打印數(shù)據(jù)而言,處理打印內容時無需處理對打印機語言的翻譯,因此本發(fā)明做到了最佳兼容性和完整性。另外,本發(fā)明還提出了一種利用多個打印作業(yè)打印文件的方法此方法能夠從公知的Windows操作系統(tǒng)的EMF打印作業(yè)中截獲并增加和(或)修改打印數(shù)據(jù),然后利用此打印數(shù)據(jù)替換或嵌入到另外一個打印作業(yè)的打印數(shù)據(jù)中。另外,本發(fā)明還提出一種利用兩個Windows系統(tǒng)的多個打印作業(yè)打印文件的方法此方法能夠從一個公知的Windows操作系統(tǒng)的EMF打印作業(yè)中截獲并增加和(或)修改打印數(shù)據(jù),然后在另外一個公知的Windows操作系統(tǒng)中利用此打印數(shù)據(jù)替換或嵌入到另外一個打印作業(yè)的打印數(shù)據(jù)中。根據(jù)本發(fā)明的實施例,可以結合其他一些公知技術,實現(xiàn)打印過程監(jiān)控、打印審批、打印內容過濾、預覽和保存、條碼和水印嵌入、重新打印、異地還原打印等功能。比如將提取到的打印數(shù)據(jù)由EMF格式轉換成PDF格式,利用PDF瀏覽組件來實現(xiàn)打印內容的預覽;或者在打印過程中往EMF格式打印數(shù)據(jù)中實時的嵌入二維條碼或者文字/圖片水印,實現(xiàn)打印審計追溯等功能;或者將提取的打印數(shù)據(jù)保存成文件,如果打印遇到錯誤,可以從文件獲取此打印數(shù)據(jù),然后在本地或異地發(fā)起一個打印作業(yè)并將其打印數(shù)據(jù)替換為需重新打印的打印數(shù)據(jù),從而實現(xiàn)重新打印或異地還原打印功能;或者利用一個打印內容解析引擎,實時的分析打印數(shù)據(jù)中的文本,甚至是圖片中的文本信息,然后根據(jù)一定的策略阻止用戶打印出包含敏感信息的內容,從而實現(xiàn)打印內容過濾的功能;又或者在用戶打印文檔時,截獲打印數(shù)據(jù)并轉換成jpg、Pdf等可閱讀的格式,由審批人進行審批來決定此文檔是否允許打印,從而實現(xiàn)打印內容審批的功能。隨后參考下列附圖所示的具體最佳實施例,對本發(fā)明的其他特征和優(yōu)點予以更詳細的說明。
圖1是Windows打印管理體系⑶I打印路徑的方框2是Windows處理打印作業(yè)的流程3是未引入本發(fā)明實施例前Windows系統(tǒng)處理EMF格式打印作業(yè)時的方框4是未引入本發(fā)明實施例前Windows系統(tǒng)處理EMF格式打印作業(yè)的流程5是處理EMF格式打印作業(yè)時本發(fā)明實施例所涉及基本單元的方框圖
圖6是處理EMF格式打印作業(yè)時本發(fā)明實施例的流程7是未引入本發(fā)明實施例前Windows系統(tǒng)處理用戶選擇非EMF打印格式打印作業(yè)時的方框8是未引入本發(fā)明實施例前Windows系統(tǒng)處理用戶選擇非EMF打印格式的打印作業(yè)時的流程9是處理用戶選擇非EMF打印格式的打印作業(yè)時本發(fā)明實施例所涉及基本單元的方框10是處理用戶選擇非EMF打印格式的打印作業(yè)時本發(fā)明實施例的流程11是未引入本發(fā)明實施例前Windows系統(tǒng)處理打印機默認使用非EMF格式的打印作業(yè)時的方框12是未引入本發(fā)明實施例前Windows系統(tǒng)處理打印機默認使用非EMF格式的打印作業(yè)時的流程13是處理打印機默認使用非EMF格式的打印作業(yè)時本發(fā)明實施例所涉及基本單元的方框14是處理打印機默認使用非EMF格式的打印作業(yè)時本發(fā)明實施例的流程15是處理打印作業(yè)的重打印時本發(fā)明實施例的流程16是處理打印作業(yè)的印前審核時本發(fā)明實施例的流程17是處理打印作業(yè)的異機打印時本發(fā)明實施例的流程圖
具體實施例方式為了方便對本發(fā)明的原理和特征的理解,下文將參考一示范實施例的實施來予以說明。具體地來說,本示范實施例是以在本地硬盤上安裝了 Windows XP操作系統(tǒng)的標準PC計算機和一臺兼容Windows系統(tǒng)的網絡打印機作為設備場景,以Windows自帶的Notepad作為用戶打印程序來進行描述的。但應理解,這不是唯一可以實施本發(fā)明的實施例。相反,本發(fā)明可以應用于各種不同的Windows操作系統(tǒng),例如Windows 2000, XP, 2003, Vista, 7, 2008 ;可以應用于不同的計算機環(huán)境,如臺式機、筆記本、上網本、平板電腦等;可以應用于不同類型、型號和接口打印機,如U 口 /并口打印機、網絡打印機,激光打印機,噴墨打印機,繪圖儀和傳真機等,嚴格來說可以是任意兼容Windows系統(tǒng)的打印設備。本發(fā)明實施例涉及在Windows操作系統(tǒng)打印過程中提取、增加和(或)修改打印數(shù)據(jù)的系統(tǒng)和方法。根據(jù)打印作業(yè)的不同,本發(fā)明實施例的流程和模塊略有不同,其核心思想是讓所有打印作業(yè)都強制以EMF格式被生成,然后注入(Hook)打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor函數(shù),并在此關鍵位置對獲取的數(shù)據(jù)進行相應的處理,因為數(shù)據(jù)格式為EMF格式,是微軟內置支持的格式,可利用API自然的實現(xiàn)通用的處理。在繼續(xù)下文前,需要說明的是,因上文(背景技術部分)已做說明,下文一些重復出現(xiàn)的流程細節(jié)將不做贅述。為了更清晰的描述,以下按打印作業(yè)的格式分為3種情況進行描述1.所有EMF格式打印作業(yè)2.用戶選擇非EMF打印格式的打印作業(yè)
3.打印機默認使用非EMF格式的打印作業(yè)對于EMF格式打印作業(yè),未引入本發(fā)明實施例前Windows系統(tǒng)處理該類型打印作業(yè)的方式和流程如圖3和圖4所不。圖3顯示了未引入本發(fā)明實施例前Windows系統(tǒng)處理EMF格式打印作業(yè)時的方框圖。從圖中可看出EMF打印任務將由打印處理器進行一次GDI回放,因此注入(Hook)打印處理器,替換其數(shù)據(jù)處理函數(shù)是本發(fā)明的基本思路。圖4是未引入本發(fā)明實施例前Windows系統(tǒng)處理EMF打印格式的打印作業(yè)時的流程圖。分為以下步驟1.用戶發(fā)起一個EMF格式打印作業(yè)2.打印作業(yè)進入打印隊列3.⑶I回放4.輸出至打印機對于EMF格式打印作業(yè),引入本發(fā)明實施例后打印作業(yè)被處理的方式和流程如圖5和圖6所示。本發(fā)明的實施例包含注入(Hook)模塊和打印數(shù)據(jù)處理模塊此注入模塊負責將此打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程中,并將此Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessorο此打印數(shù)據(jù)處理模塊負責接收、提取、增加和(或)修改打印數(shù)據(jù),并可以將此打印數(shù)據(jù)繼續(xù)傳遞給相應的打印處理器,讓Windows繼續(xù)處理此打印作業(yè)。圖5顯示了處理EMF格式打印作業(yè)時本發(fā)明實施例所涉及基本單元的方框圖。在利用注入模塊將打印數(shù)據(jù)處理模塊注入到打印處理器后,打印數(shù)據(jù)處理模塊先于打印處理器獲得EMF格式的打印數(shù)據(jù)。圖6顯示了處理EMF格式打印作業(yè)時本發(fā)明實施例的流程圖。其具體工作流程如下1.用戶發(fā)起一個EMF格式打印作業(yè)此步驟,用戶以任意公知的方法發(fā)起一個EMF格式打印作業(yè),如利用Notepad、word等應用程序打開一個文檔,然后點擊打印;2.打印作業(yè)進入打印隊列3.打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)因打印數(shù)據(jù)處理模塊已被注入(Hook),此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);4.打印數(shù)據(jù)的提取、增加或修改此打印數(shù)據(jù)處理模塊提取此打印數(shù)據(jù),或對打印內容進行增加或修改。提取打印數(shù)據(jù)的典型應用場景是打印內容審計,提取的打印數(shù)據(jù)原始格式是EMF,Windows系統(tǒng)支持EMF格式文件的直接瀏覽,可以利用公知的圖形轉換技術,轉換成SVG、JPG等格式,并縮小其尺寸和分辨率,以便于Web瀏覽。打印內容進行增加的典型應用場景是水印和條碼嵌入,因為截獲的打印數(shù)據(jù)是EMF格式,利用Windows的⑶I API(類似⑶I回放)可以方便的在EMF數(shù)據(jù)中增加內容,如嵌入水印或條碼。打印內容進行修改的典型應用場景是數(shù)字水印,將一些隱含信息隱藏在文本的字里行間中,需要對EMF數(shù)據(jù)進行修改,而不是簡單的增加。5.打印數(shù)據(jù)繼續(xù)傳遞(GDI回放)打印數(shù)據(jù)處理模塊將修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor,打印處理器將進行GDI回放動作,Windows后臺打印系統(tǒng)將繼續(xù)處理并完成此打印作業(yè)。如果打印數(shù)據(jù)處理模塊中包含一個打印數(shù)據(jù)自動審核子模塊,可自動審核打印數(shù)據(jù)是否繼續(xù)傳遞,如果此模塊返回結果為否,則不會發(fā)生GDI回放動作,打印作業(yè)被中止。6.輸出至打印機打印數(shù)據(jù)被以RAW格式發(fā)送至打印機。對于由用戶選擇非EMF打印格式的打印作業(yè),未引入本發(fā)明實施例前Windows系統(tǒng)處理該類型打印作業(yè)的方式和流程如圖7和圖8所示。圖7顯示了未引入本發(fā)明實施例前Windows系統(tǒng)處理用戶選擇非EMF打印格式打印作業(yè)時的方框圖。從圖中可看出非EMF打印任務將不會有GDI回放的動作,因此簡單的注入(Hook)打印處理器也無法獲得需要的打印數(shù)據(jù),需要在打印任務產生階段就對打印作業(yè)的格式進行修改,使其變?yōu)镋MF格式打印任務。圖8顯示了未引入本發(fā)明實施例前Windows系統(tǒng)處理用戶選擇非EMF打印格式的打印作業(yè)時的流程圖。分為以下步驟1.用戶發(fā)起一個非EMF格式打印作業(yè)此步驟,用戶以任意公知的方法發(fā)起一個非EMF格式打印作業(yè),如利用Word等應用程序打開一個doc文檔,然后點擊打印,并在打印對話框上點選項,在彈出的對話框上去掉“后臺打印”的勾選,最后點擊確定按鈕。2.打印作業(yè)進入打印隊列3.輸出至打印機整個打印過程與EMF格式打印作業(yè)相比,少了⑶I回放的環(huán)節(jié),打印數(shù)據(jù)直接以RAff格式發(fā)送給打印機進行打印輸出。對于用戶選擇非EMF打印格式的打印作業(yè),引入本發(fā)明實施例后打印作業(yè)被處理的方式和流程如圖9和圖10所不。本發(fā)明的實施例包含注入模塊、打印格式修改模塊和打印數(shù)據(jù)處理模塊此注入模塊負責將此打印格式修改模塊注入到文件打印進程并將其打印格式選擇函數(shù)修改為此打印格式修改模塊的打印格式選擇函數(shù);此注入模塊還負責將此打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程中并此Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù) PrintDocumentOnPrintProcessor ;此打印格式修改模塊負責將用戶發(fā)起打印任務時選擇的非EMF打印格式強制修改為EMF打印格式;此打印數(shù)據(jù)處理模塊負責接收、提取、增加和(或)修改打印數(shù)據(jù),并可以將此打印數(shù)據(jù)繼續(xù)傳遞給相應的打印處理器,讓Windows繼續(xù)處理此打印任務。圖9顯示了處理用戶選擇非EMF打印格式的打印作業(yè)時本發(fā)明實施例所涉及基本單元的方框圖。利用注入模塊將打印格式修改模塊注入到文件打印進程并將其打印格式選擇函數(shù)修改為此打印格式修改模塊的打印格式選擇函數(shù),可以將用戶選擇非EMF格式打印作業(yè)強制修改為EMF格式打印作業(yè);在此基礎上,利用注入模塊將打印數(shù)據(jù)處理模塊注入到打印處理器后,打印數(shù)據(jù)處理模塊先于打印處理器獲得EMF格式的打印數(shù)據(jù),并進一步實現(xiàn)對打印數(shù)據(jù)的提取、增加和(或)修改。圖10顯示了處理用戶選擇非EMF打印格式的打印作業(yè)時本發(fā)明實施例的流程圖。其具體工作流程如下1.用戶發(fā)起一個非EMF格式打印作業(yè)2.打印格式修改模塊修改打印作業(yè)為EMF格式因打印格式修改模塊已被注入(Hook),此打印格式修改模塊的將在產生打印作業(yè)前,代替原打印格式選擇函數(shù)工作,無論用戶發(fā)起的格式是否為EMF格式,打印作業(yè)均將被設置為EMF格式。3.打印作業(yè)進入打印隊列4.打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)因打印數(shù)據(jù)處理模塊已被注入(Hook),此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);5.打印數(shù)據(jù)的提取、增加或修改此打印數(shù)據(jù)處理模塊提取此打印數(shù)據(jù),或對打印內容進行增加或修改。6.打印數(shù)據(jù)繼續(xù)傳遞(GDI回放)打印數(shù)據(jù)處理模塊將修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor,打印處理器將進行GDI回放動作,Windows后臺打印系統(tǒng)將繼續(xù)處理并完成此打印作業(yè)。如果打印數(shù)據(jù)處理模塊中包含一個打印數(shù)據(jù)自動審核子模塊,可自動審核打印數(shù)據(jù)是否繼續(xù)傳遞,如果此模塊返回結果為否,則不會發(fā)生GDI回放動作,打印作業(yè)被中止。7.輸出至打印機打印數(shù)據(jù)被以RAW格式發(fā)送至打印機。對于打印機默認非EMF打印格式的打印作業(yè),未引入本發(fā)明實施例前Windows系統(tǒng)處理該類型打印作業(yè)的方式和流程如圖11和圖12所示。圖11顯示了未引入本發(fā)明實施例前Windows系統(tǒng)處理打印機默認非EMF打印格式的打印作業(yè)時的方框圖。從圖中可看出非EMF打印任務將不會有GDI回放的動作,因此簡單的注入(Hook)打印處理器也無法獲得需要的打印數(shù)據(jù),需要在打印任務產生階段就對打印作業(yè)的格式進行修改,使其變?yōu)镋MF格式打印任務。圖12顯示了未引入本發(fā)明實施例前Windows系統(tǒng)處理打印機默認非EMF打印格式的打印作業(yè)時的流程圖。分為以下步驟1.用戶發(fā)起一個打印作業(yè)此步驟,用戶以任意公知的方法發(fā)起一個打印作業(yè),如利用Notepad等應用程序打開一個txt文檔,在打印時選擇一臺默認格式為非EMF的打印機,然后點擊打印。
2.非EMF格式打印作業(yè)進入打印隊列因為用戶選擇的是默認格式為非EMF的打印機,GDI在產生打印作業(yè)前調用打印機驅動程序的DrvEnableroEV函數(shù)時,此函數(shù)返回的是非EMF格式。因此打印作業(yè)將以非EMF格式生成并進入打印隊列。3.輸出至打印機整個打印過程與EMF格式打印作業(yè)相比,少了⑶I回放的環(huán)節(jié),打印數(shù)據(jù)直接以RAff格式發(fā)送給打印機進行打印輸出。對于打印機默認非EMF打印格式的打印作業(yè),引入本發(fā)明實施例后打印作業(yè)被處理的方式和流程如圖13和圖14所示。本發(fā)明的實施例包含注入模塊、打印格式修改模塊和打印數(shù)據(jù)處理模塊此注入模塊負責將此打印格式修改模塊注入到所有或用戶所選打印機驅動程序,并將此打印機驅動程序的DrvEnableroEV函數(shù)修改為此打印格式修改模塊的DrvEnableroEV函數(shù);此注入模塊還負責將此打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程中并將此Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;此打印格式修改模塊負責將此打印機驅動程序默認使用非EMF格式改為默認使用EMF格式;此打印數(shù)據(jù)處理模塊負責接收、提取、增加和(或)修改打印數(shù)據(jù),并可以將此打印數(shù)據(jù)繼續(xù)傳遞給相應的打印處理器,讓Windows繼續(xù)處理此打印任務。圖13顯示了處理打印機驅動程序默認使用非EMF格式的打印作業(yè)時本發(fā)明實施例所涉及基本單元的方框圖。利用注入模塊將打印格式修改模塊注入到所有或用戶所選打印機驅動程序并將此打印機驅動程序的DrvEnableroEV函數(shù)修改為此打印格式修改模塊的DrvEnableroEV函數(shù),可以將打印機驅動程序默認使用非EMF格式打印作業(yè)強制修改為EMF格式打印作業(yè);在此基礎上,利用注入模塊將打印數(shù)據(jù)處理模塊注入到打印處理器后,打印數(shù)據(jù)處理模塊先于打印處理器獲得EMF格式的打印數(shù)據(jù),并進一步實現(xiàn)對打印數(shù)據(jù)的提取、增加和(或)修改。圖14顯示了處理打印機驅動程序默認使用非EMF格式的打印作業(yè)時本發(fā)明實施例的流程圖。其具體工作流程如下1.用戶發(fā)起一個打印作業(yè)此步驟,用戶以任意公知的方法發(fā)起一個打印作業(yè),如利用Notepad等應用程序打開一個txt文檔,在打印時選擇一臺默認格式為非EMF的打印機,然后點擊打印。2.打印格式修改模塊修改打印作業(yè)為EMF格式因打印格式修改模塊已被注入(Hook),⑶I在產生打印作業(yè)前調用打印機驅動程序的DrvEnableroEV函數(shù)時,此函數(shù)已被打印格式修改模塊對應函數(shù)替換,而此函數(shù)始終返回的是EMF格式,因此打印作業(yè)將以EMF格式產生。3.打印作業(yè)進入打印隊列4.打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)因打印數(shù)據(jù)處理模塊已被注入(Hook),此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);5.打印數(shù)據(jù)的提取、增加或修改此打印數(shù)據(jù)處理模塊提取此打印數(shù)據(jù),或對打印內容進行增加或修改。6.打印數(shù)據(jù)繼續(xù)傳遞(GDI回放)打印數(shù)據(jù)處理模塊將修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor,打印處理器將進行GDI回放動作,Windows后臺打印系統(tǒng)將繼續(xù)處理并完成此打印作業(yè)。如果打印數(shù)據(jù)處理模塊中包含一個打印數(shù)據(jù)自動審核子模塊,可自動審核打印數(shù)據(jù)是否繼續(xù)傳遞,如果此模塊返回結果為否,則不會發(fā)生GDI回放動作,打印作業(yè)被中止。7.輸出至打印機打印數(shù)據(jù)被以RAW格式發(fā)送至打印機。通過上文的說明,對于本發(fā)明的核心思想進行了闡述,結合到實際的產品中,可以實現(xiàn)打印過程監(jiān)控、打印內容審計、打印內容過濾、預覽和保存、條碼和水印嵌入等功能。另外,本發(fā)明還提出了一種利用多個打印作業(yè)打印文件的方法此方法能夠從公知的Windows操作系統(tǒng)的EMF打印作業(yè)中截獲并增加和(或)修改打印數(shù)據(jù),然后利用此打印數(shù)據(jù)替換或嵌入到另外一個打印作業(yè)的打印數(shù)據(jù)中。本發(fā)明還提出一種利用兩個Windows系統(tǒng)的多個打印作業(yè)打印文件的方法此方法能夠從一個公知的Windows操作系統(tǒng)的EMF打印作業(yè)中截獲并增加和(或)修改打印數(shù)據(jù),然后在另外一個公知的Windows操作系統(tǒng)中利用此打印數(shù)據(jù)替換或嵌入到另外一個打印作業(yè)的打印數(shù)據(jù)中。引入此本發(fā)明的實施例后,處理打印作業(yè)的重打印、印前審核、異機打印是一個本發(fā)明實施例與公知的技術組合形成的方法。其中處理打印作業(yè)的重打印時本發(fā)明實施例的流程如圖15所示,具體流程說明如下1.用戶發(fā)起一個打印作業(yè)用戶以任意公知的方法發(fā)起一個打印任務;2.打印格式修改模塊修改打印作業(yè)為EMF格式按照上文所述方法引入打印格式修改模塊,將所有打印作業(yè)統(tǒng)一為EMF格式。3.打印作業(yè)進入打印隊列4.打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)按照上文所述方法引入打印數(shù)據(jù)處理模塊,打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);5.打印數(shù)據(jù)的增加或修改此步驟為可選步驟,即可以不做增加或修改,并且可在打印數(shù)據(jù)保存前也可以是保存后對打印數(shù)據(jù)進行增加或修改。6.保存打印數(shù)據(jù)(PDl)此打印數(shù)據(jù)處理模塊或其他關聯(lián)模塊將打印數(shù)據(jù)保存至任意自己能再次訪問的存儲空間,為明確此數(shù)據(jù),取名為ro I。7.打印數(shù)據(jù)繼續(xù)傳遞(⑶I回放)
打印數(shù)據(jù)處理模塊將修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor,打印處理器將進行GDI回放動作,Windows后臺打印系統(tǒng)將繼續(xù)處理并完成此打印作業(yè)。8.輸出至打印機打印數(shù)據(jù)被以RAW格式發(fā)送至打印機。如果打印機出現(xiàn)缺紙、缺墨等故障,會導致用戶的打印作業(yè)失敗。9.用戶或程序發(fā)起重打印命令當出現(xiàn)打印作業(yè)失敗時,或者用戶需要重打印文檔時,用戶可以手工解決打印機故障后發(fā)起重打印命令,也可以由程序利用公知的方法檢測打印作業(yè)是否成功,并在打印機恢復正常后自動發(fā)起重打印命令。10.打印作業(yè)進入打印隊列同步驟311.打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)同步驟412.打印數(shù)據(jù)替換為roi此步驟中,打印數(shù)據(jù)處理模塊或其關聯(lián)模塊利用公知的方法獲取在步驟6保存的打印數(shù)據(jù)roi,并將當前打印作業(yè)的打印數(shù)據(jù)替換為roi。13.打印數(shù)據(jù)的增加或修改同步驟5,步驟5和步驟13可以同時存在,也可以存在其一,也可以都不存在。14.打印數(shù)據(jù)繼續(xù)傳遞(GDI回放)同步驟715.輸出至打印機打印數(shù)據(jù)被以RAW格式發(fā)送至打印機。如果打印機故障得到解決,則打印作業(yè)可以被打印機成功輸出。其中處理打印作業(yè)的印前審核時本發(fā)明實施例的流程如圖16所示,具體流程說明如下1.用戶發(fā)起一個打印作業(yè)用戶以任意公知的方法發(fā)起一個打印任務;2.打印格式修改模塊修改打印作業(yè)為EMF格式按照上文方法引入打印格式修改模塊,將所有打印作業(yè)統(tǒng)一為EMF格式。3.打印作業(yè)進入打印隊列4.打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)按照上文所述方法引入打印數(shù)據(jù)處理模塊,打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);5.打印數(shù)據(jù)的增加或修改此步驟為可選步驟,即可以不做增加或修改,并且可在打印數(shù)據(jù)保存前也可以是保存后對打印數(shù)據(jù)進行增加或修改。6.保存打印數(shù)據(jù)(PDl)此打印數(shù)據(jù)處理模塊或其他關聯(lián)模塊將打印數(shù)據(jù)保存至任意自己能再次訪問的存儲空間,為明確此數(shù)據(jù),取名為ro I。在保存打印數(shù)據(jù)后,當前打印作業(yè)的打印數(shù)據(jù)不會被繼續(xù)傳遞,當前打印作業(yè)被中止。7.審核此步驟可以是程序自動審核,也可以是人工審核。打印數(shù)據(jù)為EMF格式,為微軟內置格式,因此可以公知的方法預覽打印數(shù)據(jù),供人工審核。如果審核不通過,則流程結束。8.用戶或程序發(fā)起重打印命令審核通過后,用戶可以手工發(fā)起重打印命令,也可以由程序利用公知的方法檢測打印作業(yè)審核通過或者獲取審核通過的通知,然后自動發(fā)起重打印命令。9.打印作業(yè)進入打印隊列同步驟310.打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)同步驟411.打印數(shù)據(jù)替換為roi此步驟中,打印數(shù)據(jù)處理模塊或其關聯(lián)模塊利用公知的方法獲取在步驟6保存的打印數(shù)據(jù)roi,并將當前打印作業(yè)的打印數(shù)據(jù)替換為roi。12.打印數(shù)據(jù)的增加或修改同步驟5,步驟5和步驟12可以同時存在,也可以存在其一,也可以都不存在。13.打印數(shù)據(jù)繼續(xù)傳遞(⑶I回放)打印數(shù)據(jù)處理模塊將修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor,打印處理器將進行GDI回放動作,Windows后臺打印系統(tǒng)將繼續(xù)處理并完成此打印作業(yè)。14.輸出至打印機打印數(shù)據(jù)被以RAW格式發(fā)送至打印機。如果打印機工作正常,則打印作業(yè)可以被打印機成功輸出。其中處理打印作業(yè)的異機打印時本發(fā)明實施例的流程如圖17所示,具體流程說明如下1.用戶在操作系統(tǒng)A發(fā)起一個打印作業(yè)用戶以任意公知的方法在操作系統(tǒng)A發(fā)起一個打印任務;2.打印格式修改模塊修改打印作業(yè)為EMF格式按照上文方法引入打印格式修改模塊,將所有打印作業(yè)統(tǒng)一為EMF格式。3.打印作業(yè)進入操作系統(tǒng)A打印隊列4.操作系統(tǒng)A打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)按照上文方法引入打印數(shù)據(jù)處理模塊,操作系統(tǒng)A打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);5.打印數(shù)據(jù)的增加或修改此步驟為可選步驟,即可以不做增加或修改,并且可在打印數(shù)據(jù)保存前也可以是保存后對打印數(shù)據(jù)進行增加或修改。
6.保存打印數(shù)據(jù)(PDl)此打印數(shù)據(jù)處理模塊或其他關聯(lián)模塊將打印數(shù)據(jù)保存至任意自己以及下文中操作系統(tǒng)B均能再次訪問的存儲空間,為明確此數(shù)據(jù),取名為roi。在保存打印數(shù)據(jù)后,當前打印作業(yè)的打印數(shù)據(jù)不會被繼續(xù)傳遞,當前打印作業(yè)被中止。7.審核此步驟為可選步驟。可以是程序自動審核,也可以是人工審核。打印數(shù)據(jù)為EMF格式,為微軟內置格式,因此可以公知的方法預覽打印數(shù)據(jù),供人工審核。審核的動作可以是發(fā)生在操作系統(tǒng)A中,也可以是任意可訪問到PDl或其預覽數(shù)據(jù)的操作系統(tǒng)中。如果審核不通過,則流程結束。8.用戶或程序發(fā)起重打印命令審核通過后,用戶可以手工發(fā)起重打印命令,也可以由程序利用公知的方法檢測打印作業(yè)審核通過或者獲取審核通過的通知,然后自動發(fā)起重打印命令。如果沒有審核步驟,則程序檢測到打印數(shù)據(jù)PDl可用后,自動發(fā)起重打印命令。9.操作系統(tǒng)B發(fā)起一個打印作業(yè)由程序在操作系統(tǒng)B (通常是服務器)發(fā)起一個打印作業(yè)。10.打印作業(yè)進入操作系統(tǒng)B打印隊列同步驟311.操作系統(tǒng)B打印數(shù)據(jù)處理模塊截獲打印數(shù)據(jù)同步驟412.打印數(shù)據(jù)替換為HH此步驟中,操作系統(tǒng)B打印數(shù)據(jù)處理模塊或其關聯(lián)模塊利用公知的方法獲取在步驟6保存的打印數(shù)據(jù)roi,并將當前打印作業(yè)的打印數(shù)據(jù)替換為roi。13.打印數(shù)據(jù)的增加或修改同步驟5,步驟5和步驟12可以同時存在,也可以存在其一,也可以都不存在。14.打印數(shù)據(jù)繼續(xù)傳遞(⑶I回放)操作系統(tǒng)B打印數(shù)據(jù)處理模塊將修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor,打印處理器將進行GDI回放動作,Windows后臺打印系統(tǒng)將繼續(xù)處理并完成此打印作業(yè)。15.輸出至打印機打印數(shù)據(jù)被以RAW格式發(fā)送至打印機。如果打印機工作正常,則打印作業(yè)被打印機成功輸出。從上述內容,可以看出,本發(fā)明提出了一種在Windows操作系統(tǒng)打印過程中提取、增加和(或)修改打印數(shù)據(jù)的系統(tǒng)和方法。此系統(tǒng)和方法可以從以下打印作業(yè)中截獲并提取打印數(shù)據(jù)和對打印數(shù)據(jù)進行修改1.所有EMF格式打印作業(yè)2.用戶選擇非EMF打印格式的打印作業(yè)3.打印機默認使用非EMF格式的打印作業(yè)
相比其它注入(Hook)技術獲得Windows打印數(shù)據(jù)而言,處理打印內容時無需處理對打印機語言的翻譯,因此本發(fā)明做到了最佳兼容性和完整性。本發(fā)明可以通用的實現(xiàn)Windows操作系統(tǒng)的打印過程監(jiān)控、打印審批、打印內容過濾、預覽和保存、條碼和水印嵌入、重新打印、異地還原打印等功能,并且通用的解決了打印作業(yè)高級屬性設置和打印機特性屬性設置丟失的問題。本專業(yè)人員會理解,可以在不背離其精神或核心特征的前提下以各種特定形式實施本發(fā)明,比如可以結合其他一些公知技術,實現(xiàn)打印過程監(jiān)控、打印審批、打印內容過濾、預覽和保存、條碼和水印嵌入、重新打印、異地還原打印等功能。比如將提取到的打印數(shù)據(jù)由EMF格式轉換成PDF格式,利用PDF瀏覽組件來實現(xiàn)打印內容的預覽;或者在打印過程中往EMF格式打印數(shù)據(jù)中實時的嵌入二維條碼或者文字/圖片水印,實現(xiàn)打印審計追溯等功能;或者將提取的打印數(shù)據(jù)保存成文件,如果打印遇到錯誤,可以從文件獲取此打印數(shù)據(jù),然后在本地或異地發(fā)起一個打印作業(yè)并將其打印數(shù)據(jù)替換為需重新打印的打印數(shù)據(jù),從而實現(xiàn)重新打印或異地還原打印功能;或者利用一個打印內容解析引擎,實時的分析打印數(shù)據(jù)中的文本,甚至是圖片中的文本信息,然后根據(jù)一定的策略阻止用戶打印出包含敏感信息的內容,從而實現(xiàn)打印內容過濾的功能;又或者在用戶打印文檔時,截獲打印數(shù)據(jù)并轉換成jpg、pdf等可閱讀的格式,由審批人進行審批來決定此文檔是否允許打印,從而實現(xiàn)打印內容審批的功能。因此,本說明書中公開的實施例完全視為說明性的,而非限定性的,本發(fā)明范圍由所附權利要求書限定,而非前述描述的內容,只包括屬于此范圍和及其等效物范圍和含義之內的所有變更。
權利要求
1.一種在Windows操作系統(tǒng)打印過程中提取、增加和(或)修改打印數(shù)據(jù)的系統(tǒng)此系統(tǒng)能夠從公知Windows操作系統(tǒng)的所有EMF格式打印任務中截獲并提取打印數(shù)據(jù)和對打印數(shù)據(jù)進行增加和(或)修改。此系統(tǒng)包含注入模塊和打印數(shù)據(jù)處理模塊此注入模塊負責將此打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的 Print Spooler服務進程中,并將此Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù) PrintDocumentOnPrintProcessor。此打印數(shù)據(jù)處理模塊負責接收、提取、增加和(或)修改打印數(shù)據(jù),并可以將此打印數(shù)據(jù)繼續(xù)傳遞給相應的打印處理器,讓Windows繼續(xù)處理此打印任務。
2.—種在W i n dow s操作系統(tǒng)打印過程中提取打印數(shù)據(jù)的方法,此方法能夠從公知 Windows操作系統(tǒng)的所有EMF格式打印任務中截獲并提取打印數(shù)據(jù)。此方法包含如下步驟將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程并將此 Prin Spooler中所有的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;用戶以任意公知的方法發(fā)起一個EMF格式打印任務;此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);此打印數(shù)據(jù)處理模塊提取此打印數(shù)據(jù)。
3.—種在Windows操作系統(tǒng)打印過程中增加和(或)修改打印數(shù)據(jù)的方法,此方法能夠從公知Windows操作系統(tǒng)的所有EMF格式打印任務中截獲并增加和(或)修改打印數(shù)據(jù)。 此方法包含如下步驟注入打印數(shù)據(jù)處理模塊步驟,將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程并將此Print Spooler中所有的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù) PrintDocumentOnPrintProcessor ;用戶以任意公知的方法發(fā)起一個EMF格式打印任務;此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);此打印數(shù)據(jù)處理模塊將此打印數(shù)據(jù)進行增加和(或)修改;打印數(shù)據(jù)繼續(xù)傳遞步驟,此打印數(shù)據(jù)處理模塊將增加和(或)修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor, Windows將繼續(xù)處理此打印任務。
4.一種在Windows操作系統(tǒng)打印過程中提取、增加和(或)修改打印數(shù)據(jù)的系統(tǒng)此系統(tǒng)能夠從公知的Windows操作系統(tǒng)中的用戶選擇的非EMF打印格式的打印任務中截獲、 提取打印數(shù)據(jù)和對打印數(shù)據(jù)進行增加和(或)修改;此系統(tǒng)包含注入模塊、打印格式修改模塊和打印數(shù)據(jù)處理模塊此注入模塊負責將此打印格式修改模塊注入到文件打印進程并將其打印格式選擇函數(shù)修改為此打印格式修改模塊的打印格式選擇函數(shù);此注入模塊還負責將此打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程中并此Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印內容處理模塊的處理函數(shù) PrintDocumentOnPrintProcessor ;此打印格式修改模塊負責將用戶發(fā)起打印任務時選擇的非EMF打印格式強制修改為 EMF打印格式;此打印數(shù)據(jù)處理模塊負責接收、提取、增加和(或)修改打印數(shù)據(jù),并可以將此打印數(shù)據(jù)繼續(xù)傳遞給相應的打印處理器,讓Windows繼續(xù)處理此打印任務。
5.根據(jù)權利要求4所述的系統(tǒng),所述的非EMF打印格式是指所述的文件打印進程在調用Windows API =StartDoc時將打印格式參數(shù)設為非EMF格式。
6.一種在Windows操作系統(tǒng)打印過程中提取打印數(shù)據(jù)的方法,此方法能夠從公知的 Windows操作系統(tǒng)中的用戶選擇的非EMF打印格式的打印任務中截獲和提取打印數(shù)據(jù)。此方法包含如下步驟將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程并將上述Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;將一個打印格式修改模塊注入到文件打印進程中并將其打印格式選擇函數(shù)修改為打印格式修改模塊的打印格式選擇函數(shù);用戶利用此文件打印進程發(fā)起一個打印任務,并且選擇非EMF打印格式;此打印格式修改模塊將非EMF打印格式轉成EMF打印格式;·此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);此打印數(shù)據(jù)處理模塊提取此打印數(shù)據(jù)。
7.—種在Windows操作系統(tǒng)打印過程中增加和(或)修改打印數(shù)據(jù)的方法,此方法能夠從公知的Windows操作系統(tǒng)中的用戶選擇的非EMF打印格式的打印任務中截獲、增加和 (或)修改打印數(shù)據(jù)。此方法包含如下步驟將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程并將上述Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;將一個打印格式修改模塊注入到文件打印進程中并將其打印格式選擇函數(shù)修改為打印格式修改模塊的打印格式選擇函數(shù);用戶利用此文件打印進程發(fā)起一個打印任務,并且選擇非EMF打印格式;此打印格式修改模塊將非EMF打印格式轉成EMF打印格式;此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);此打印數(shù)據(jù)處理模塊增加和(或)修改此打印數(shù)據(jù);此打印數(shù)據(jù)處理模塊將增加和(或)修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor, Windows將繼續(xù)處理此打印任務。
8.根據(jù)權利要求4、6或7所述的系統(tǒng)和方法,其特征是,所述的文件打印進程,是指用戶發(fā)起打印操作所使用的軟件的進程,如Microsoft Word等。
9.一種在Windows操作系統(tǒng)打印過程中提取、增加和(或)修改打印數(shù)據(jù)的系統(tǒng)此系統(tǒng)能夠從公知的Windows操作系統(tǒng)的打印機默認使用非EMF格式的打印任務中截獲、提取打印數(shù)據(jù)和對打印數(shù)據(jù)的增加和(或)修改,所述系統(tǒng)包含注入模塊、打印格式修改模塊和打印內容處理模塊此注入模塊負責將此打印格式修改模塊注入到所有或用戶所選打印機驅動程序,并將此打印機驅動程序的DrvEnableroEV函數(shù)修改為此打印格式修改模塊的 DrvEnablePDEV函數(shù);此注入模塊還負責將此打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程中并此Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印內容處理模塊的處理函數(shù) PrintDocumentOnPrintProcessor ;此打印格式修改模塊負責將此打印機驅動程序默認使用非EMF格式改為默認使用EMF 格式;此打印數(shù)據(jù)處理模塊負責接收、提取、增加和(或)修改打印數(shù)據(jù),并可以將此打印數(shù)據(jù)繼續(xù)傳遞給相應的打印處理器,讓Windows繼續(xù)處理此打印任務。
10.根據(jù)權利要求8所述的系統(tǒng),所述的打印機默認使用非EMF格式是指其打印驅動程序的DrvEnableTOEV函數(shù)返回特性為非EMF格式。
11.一種在Windows操作系統(tǒng)打印過程中提取打印數(shù)據(jù)的方法此方法能夠從公知的 Windows操作系統(tǒng)的打印機默認使用非EMF格式的打印任務中截獲和提取打印數(shù)據(jù)。此方法包含如下步驟將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程并將上述Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;將一個打印格式修改模塊注入到所有或用戶所選打印機驅動程序,并將此打印機驅動程序的DrvEnableroEV函數(shù)修改為此打印格式修改模塊的DrvEnableTOEV函數(shù)用戶以任意公知的方法發(fā)起一個打印任務;用戶所選打印機的打印驅動程序的DrvEnableroEV函數(shù)返回特性中為非EMF格式,此打印格式修改模塊將此打印驅動程序的DrvEnableroEV函數(shù)返回特性中的非EMF格式改為 EMF格式,實際打印數(shù)據(jù)將為EMF格式;此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);此打印數(shù)據(jù)處理模塊提取此打印數(shù)據(jù)。
12.—種在Windows操作系統(tǒng)打印過程中修改打印數(shù)據(jù)的方法此方法能夠從公知的 Windows操作系統(tǒng)的打印機默認使用非EMF格式的打印任務中截獲、增加和(或)修改打印數(shù)據(jù)。此方法包含如下步驟將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程并將上述Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;將一個打印格式修改模塊注入到所有或用戶所選打印機驅動程序,并將此打印機驅動程序的DrvEnableroEV函數(shù)修改為此打印格式修改模塊的DrvEnableTOEV函數(shù)用戶以任意公知的方法發(fā)起一個打印任務;用戶所選打印機的打印驅動程序的DrvEnableroEV函數(shù)返回特性中為非EMF格式,此打印格式修改模塊將此打印驅動程序的DrvEnableroEV函數(shù)返回特性中的非EMF格式改為 EMF格式,實際打印數(shù)據(jù)將為EMF格式;此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);此打印數(shù)據(jù)處理模塊增加和(或)修改此打印數(shù)據(jù)。此打印數(shù)據(jù)處理模塊將增加和(或)修改后的打印數(shù)據(jù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor, Windows將繼續(xù)處理此打印任務。
13.一種利用多個打印任務打印文件的方法此方法能夠從公知的Windows操作系統(tǒng)的EMF打印任務中截獲并提取、增加和(或)修改打印數(shù)據(jù),然后利用此打印數(shù)據(jù)替換或嵌入到另外一個打印任務的打印數(shù)據(jù)中。此方法包含如下步驟將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)的Print Spooler服務進程并將上述Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;用戶以任意公知的方法發(fā)起一個EMF格式打印任務;此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);此打印數(shù)據(jù)處理模塊提取、增加和(或)修改此打印數(shù)據(jù),并將其以保存至任意自己能再次訪問的存儲空間。以任意公知的方法發(fā)起另外一個EMF格式打印任務;此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor接收到此另外一個打印任務的打印數(shù)據(jù);打印數(shù)據(jù)處理模塊從此存儲空間重新獲取此被保存的打印數(shù)據(jù),并用此打印數(shù)據(jù)替換或嵌入到此另外一個打印任務的打印數(shù)據(jù)中。
14.根據(jù)權利要求13所述的方法,可以將用戶發(fā)起的多個打印任務的打印數(shù)據(jù)進行提取或修改后嵌入到另一個打印任務中,也可以連續(xù)多次將當前打印任務的打印數(shù)據(jù)進行提取或修改后嵌入到下一個打印任務中。
15.一種利用兩個Windows系統(tǒng)的多個打印任務打印文件的方法此方法能夠從一個公知的Windows操作系統(tǒng)的EMF打印任務中截獲并提取、增加和(或)修改打印數(shù)據(jù),然后在另外一個公知的Windows操作系統(tǒng)中利用此打印數(shù)據(jù)替換或嵌入到另外一個打印任務的打印數(shù)據(jù)中。此方法包含如下步驟將一個打印數(shù)據(jù)處理模塊注入到Windows操作系統(tǒng)A和B的Print Spooler服務進程并將上述Print Spooler中所有打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor 替換為此打印數(shù)據(jù)處理模塊的處理函數(shù)PrintDocumentOnPrintProcessor ;用戶以任意公知的方法在Windows操作系統(tǒng)A發(fā)起一個EMF格式打印任務;Windows操作系統(tǒng)A的此打印數(shù)據(jù)處理模塊的處理函數(shù) PrintDocumentOnPrintProcessor接收到用戶打印的數(shù)據(jù);Windows操作系統(tǒng)A的此打印數(shù)據(jù)處理模塊提取、增加和(或)修改此打印數(shù)據(jù),并將其以保存至任意自己和Windows操作系統(tǒng)B的此打印數(shù)據(jù)處理模塊都能再次訪問的存儲空間或者發(fā)送給Windows操作系統(tǒng)B的此打印數(shù)據(jù)處理模塊,由Windows操作系統(tǒng)B的此打印數(shù)據(jù)處理模塊保存在自己能再次訪問的存儲空間。以任意公知的方法在Windows操作系統(tǒng)B發(fā)起另一個EMF格式打印任務;Windows操作系統(tǒng)B此打印數(shù)據(jù)處理模塊的處理函數(shù) PrintDocumentOnPrintProcessor接收到此另一個打印任務的打印數(shù)據(jù);Windows操作系統(tǒng)B此打印數(shù)據(jù)處理模塊從所述的存儲空間獲取此被保存打印數(shù)據(jù), 并用此打印數(shù)據(jù)替換或嵌入到此另一個打印任務的打印數(shù)據(jù)中。
16.根據(jù)權利要求15所述的方法,可以將Windows操作系統(tǒng)A用戶發(fā)起的多個打印任務的打印數(shù)據(jù)進行提取、增加和(或)修改后嵌入到Windows操作系統(tǒng)B的另一個打印任務中,也可以連續(xù)多次將當前打印任務的打印數(shù)據(jù)進行提取、增加和(或)修改后嵌入到下一個打印任務中,最終再嵌入到Windows操作系統(tǒng)B的另一個打印任務中。
17.根據(jù)權利要求15所述的方法,注入到Windows操作系統(tǒng)A和B的可以是同一個打印數(shù)據(jù)處理模塊,也可以是不同打印數(shù)據(jù)處理模塊。
18.根據(jù)權利要求1、2、3、4、6、7、9、11、12、13或15所述的系統(tǒng)和方法,其特征是,打印數(shù)據(jù)處理模塊接收的打印數(shù)據(jù)包含兩種類型的數(shù)據(jù),一種是打印內容,一種是打印屬性,打印內容是指將會實際輸出的打印紙張上的內容,打印屬性是指控制打印內容的特性,所述打印屬性包含但不限于要打印的紙張類型、打印份數(shù)、是否彩色打印、打印質量、是否雙面打印、打印方向、縮放比例等。
19.根據(jù)權利要求1、2、3、4、6、7、9、11、12、13或15所述的系統(tǒng)和方法,所述的所有的打印處理器是指所有注冊到Print Spooler服務中的打印處理器,可以是調用Windows API (如AddPrintProcessor)或通過修改注冊表的方式安裝的打印處理器。
20.根據(jù)權利要求1、3、4、7、9、12、13或15所述的系統(tǒng)和方法,所述的打印數(shù)據(jù)處理模塊修改所述的打印數(shù)據(jù)的方法可以是固定的或非固定的或其它模塊來完成的,所述的固定的是指由打印數(shù)據(jù)處理模塊獨立完成所述的打印數(shù)據(jù)修改動作,所述的非固定的是指可配置的策略來控制完成,所述的其它模塊來完成是指由運行于同一或其它Windows操作系統(tǒng)上的其他模塊來完成。
21.根據(jù)權利要求2、6、11、13或15所述的方法,所述的打印數(shù)據(jù)提取步驟后,可以包含一個同意或拒絕打印步驟,所述同意,是指將所述的打印數(shù)據(jù)繼續(xù)傳遞到對應的真實的打印處理器的引出函數(shù)PrintDocumentOnPrintProcessor,所述拒絕是指不再做進一步的傳遞動作,其結果是用戶將無法打印出數(shù)據(jù)。
全文摘要
本發(fā)明涉及若干在Windows打印過程中監(jiān)控打印數(shù)據(jù)的系統(tǒng)和方法。通過這些系統(tǒng)和方法,可以通用的實現(xiàn)Windows操作系統(tǒng)的打印過程監(jiān)控、打印審批、打印內容過濾、預覽和保存、條碼和水印嵌入、重新打印、異地還原打印等功能,并且通用的解決了打印作業(yè)高級屬性設置和打印機特性屬性設置丟失的問題。
文檔編號G06F3/12GK102999299SQ20111026891
公開日2013年3月27日 申請日期2011年9月13日 優(yōu)先權日2011年9月13日
發(fā)明者張勇, 汪雷 申請人:北京路模思科技有限公司