想弄出每页的图片的话,大概有三个办法:
投机取巧的办法,属于野路子的,用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的结构。
标签:打印机,printer,回放,windows,dll,驱动,processor,启发 From: https://blog.51cto.com/u_15307523/6024869