天天看點

列印機驅動的模式問題 看到别人說的 記錄一下 感覺還是很有啟發的

想弄出每頁的圖檔的話,大概有三個辦法:

投機取巧的辦法,屬于野路子的,用GPD去定制unidrv.dll,生成一個實際上無任何用的列印機驅動(當然你可以把自己的printer processor附加到别的已安裝的列印機驅動上去),這個驅動就是配合安裝print processor,讓windows可以通過它去産生脫機檔案(光有printer processor是無法讓windows生成spool檔案的);再修改genprint,在裡面解析spool file拿到每頁的EMF圖檔,EMF圖檔是矢量圖,體積小,适合在任何顯示裝置上回放,不過這樣因為那個GPD列印機驅動是個樣子貨,記得windows偶爾會彈出檔案無法列印之類的提示。這個代碼量最小。

第二個辦法,如果隻要JPG/BMP之類的,記得可以通過編寫Unidrv rendering plugin(例子大概是在ddk的oemui目錄),抓取surface内容儲存為JPG來實作,不過記得因為surface上的是一副位圖,是以你無法儲存成矢量圖了,而且在不同的裝置上回放效果可能有差別;

第三個辦法,也是最複雜最正規但是功能最強大的,就是自己從頭實作一個printer graphic dll,不借助unidrv,自己實作所有的GRE/DDI接口,不過這裡你不需要做太複雜的操作,就是記錄下GRE的每個回放動作,儲存為自己定義的格式的檔案,這個檔案雖然記錄了一系列的GDI操作,但是顯然windows是不認的,是以你要再提供一套庫函數,去解析回放每個動作。這個辦法的好處是你可以(1)拿到另外一台windows機器上回放每一頁效果不會有差别,因為本質上你儲存的是GDI操作(2)你可以在回放的同時做頁面操作如加水印合并頁面等然後再輸出到實體列印機(3)相容性最好,缺點是代碼量比較大,要花一點時間去熟悉DDI和printer graphic dll的結構。

繼續閱讀