庐山烟雨浙江潮,未到千般恨不消。到得原来无别事,庐山烟雨浙江潮。windows
Windows的打印驱动从整体架构上来讲,包括一个渲染组件和一个配置组件。咱们能够回想一下最开始的整体架构图。缓存
渲染组件就是负责将应用程序传来的每一页的绘制命令(GDI命令)转换成打印机用来渲染的命令数据(打印机才能识别的命令)发送到打印机中。网络
配置组件又包含一个可让用户进行打选项配置的用户接口组件和一个将打印机的配置和特征传递给应用程序的程序接口。架构
而相较于Windows的其余硬件设备,比较特殊的状况是,打印机的驱动程序并不直接访问和操纵硬件设备,而是把通过处理的二进制指令流和数据流发送给假脱机系统,由假脱机系统负责在合适的时间将打印数据发送至打印机设备所在的端口,完成打印任务。框架
而打印机驱动在这里也细分红两个大的框架:GDI框架与XPS框架。ide
GDI 打印驱动程序由如下2个组件组成【https://msdn.microsoft.com/en-us/library/windows/hardware/ff549558(v=vs.85).aspx】:函数
打印图形DLL:辅助 GDI 绘制打印做业,并将绘制后的数据流传送到打印假脱机程序。布局
打印接口DLL:为打印配置选项导出一个用户接口,同时导出假脱机能够调用以通知驱动程序与打印相关的系统事件的接口。测试
渲染组件:打印图形 DLL:【https://msdn.microsoft.com/en-us/library/windows/hardware/ff551757(v=vs.85).aspx】spa
这里的打印图形DLL其实就是一个渲染组件。打印图形DLL实现Drv为前缀的图形DDI(Device Driver Interface,图形驱动接口)【后面说明】函数,这些函数有以下两个方面的做用:
1)辅助GDI完成打印任务。当一个绘制操做必须以设备指定的方式来绘制或者要执行一些GDI引擎不支持的绘制操做时,打印图形DLL能够提供图形DDI函数来处理那些必须按照特定于设备的方式执行和那些不能由GD绘制引擎单独完成的绘制操做。
2)将绘制后的数据流传送到假脱机系统。打印图形DLL一般以RAW数据类型(包括命令序列)【后面说明】产生一个输出流,假脱机能够经过打印监视器将该输出流传送到打印机硬件。
首先咱们来讲明什么是图形DDI(Device DriverInterface,图形驱动接口)?GDI是图形引擎,其和图形设备驱动程序之间的接口协议就是设备驱动程序接口(DDI)。须要注意的是,DDI是Device DriverInterface,中文字面意思是设备驱动程序接口,正确的写法其实前面还应该加上图形的英文,这样才没有歧义。图形设备驱动程序通常是内核模式DLL,被加载到内核地址空间。它负责在硬件设备上最终实现用户应用程序的绘制调用。
另一个须要说明的是RAW数据类型,Windows 打印进程一般支持五种数据类型。最经常使用的两种数据类型是加强型图元文件 (EMF) 和打印就绪 (RAW)。
EMF,即加强型图元文件,是大多数Windows应用程序的默认数据类型。使用EMF,系统会将要打印的文档更改成比RAW文件更易于移植并一般能够在任意打印机上打印的图元文件格式。
RAW是使用非Windows程序的客户端的默认数据类型。RAW数据类型通知后台处理程序在打印以前不要更改打印做业。使用这种数据类型,准备打印做业的整个过程是在客户端计算机上完成的。RAW数据格式是打印机语言PDL的数据格式。PCL和PostScript都是RAW数据,打印引擎能够直接处理。
EMF(Enhanced MetaFile)和RAW处理方式和功能有所不一样。
数据类型设置为EMF时,Windows系统生成一个包含GDI功能调用的打印处理文件,此功能调用生成一个组命令以造成应用程序的对象,在设置文件的读取和传输过程当中完成对打印设置文件的解释。所以,EMF数据格式的处理方式可以使返回应用程序的时间加快。
使用RAW数据类型时,在写入设置文件以前,打印任务被传输到驱动程序进行解释,图像处理和数据解包。因此,使用RAW数据格式比使用EMF格式打印速度慢。
配置组件:打印接口DLL【https://msdn.microsoft.com/en-us/library/windows/hardware/ff551764(v=vs.85).aspx】
这个打印接口DLL就是驱动程序架构的配置组件,打印驱动程序一般给用户提供不少可修改打印配置的选项,这些选项能够在每个要打印的文档中被修改。如打印的份数、双面打印、纸张大小、纸张来源、色彩模式、打印分辨率、方向和缩放等,这些选项能够经过由应用程序所调用的用户接口来实现。
打印接口DLL负责为打印配置选项导出一个用户接口。经过为打印机建立属性表单页来提供这一用户接口。应用程序(如Word等)经过调用由假脱机导出的Win32函数显示这个接口,假脱机系统转而又能够调用由打印接口DLL定义的函数。
打印接口DLL不只为打印配置选项提供用户接口,还导出一些函数。这些函数被假脱机调用以通知驱动程序与打印相关的系统事件,例如驱动程序的安装和升级、打印机的添加和链接等。
打印图形DLL提供的绘制函数是基于特定设备的,取决于硬件的绘制能力来决定其所处的工做模式。这里说的绘制其实就是渲染。包括以下3种状况:
打印图形DLL能够选择所有提供DDI绘制函数(RAW模式);
部分提供DDI绘制函数(回调模式);
不提供DDI绘制函数(EMF模式)。
下图是MSDN上对于GDI框架的说明。
上图说明了应用程序使用GDI建立打印做业时的数据流。数据流传送至打印机硬件以前,并非打印图形DLL会以后直接传送,而是先返回至假脱机,再由假脱机传送至一个监视器然后同过本地或网络端口传送至打印机硬件。
RAW模式:
在RAW模式下,应用能够直接调用驱动所提供的接口直接生成打印机所能处理的Raw文件并直接经过端口监视器发给物理打印机进行打印。这个驱动能够是微软的通用驱动程序也能够是厂商本身编写的驱动程序。
回调模式:
回调模式下,由应用发起的打印文件的部分可能没法使用GDI自己的API来完成了,可是大部分工做是能够之间生成对应的EMF文件的,小部分文件必须调用DDI的绘制函数来进行,生成Raw文件提交给打印处理器,打印处理器会将其进行处理,好比生成EMF文件,提交给GDI User-Mode Client,而后合并为一个完整的EMF文件,最后提交给打印处理器进行处理。打印处理器会讲EMF文件解析为打印机能够处理的Raw文件,并经过端口监视器发给打印机进行打印。
EMF模式:
在EMF模式中,应用经过调用GDI提供的接口而生成用于打印的通用中间文件(EMF文件)。再由打印假脱机队列服务调用打印机驱动的接口将这个EMF文件解析为打印机能够处理的Raw文件,并经过端口服务发给打印机进行打印。
通过上述的说明,也许有人会产生疑问,为何生成EMF文件不须要去调用DDI就能够生成EMF文件?简要来讲,这是由Windows决定的,EMF文件是经过Windows的GDI函数集来描述图像的。咱们能够把EMF文件理解为是GDI的指针或者Metafile。EMF格式里面标记的每一个含义或者键值和GDI里面的某一类进行一一对应,当须要解析EMF文件时,只须要读取相应的键值就能够知道相应的GDI图像显示的动做是什么。
同时,还有一个疑问:为何最后都是生成Raw文件发送到打印机?先说说这得从打印后台打印数据格式提及,通常的打印机后台格式有多种,如RAW、EMF...,但RAW格式是惟一被所有打印机所支持。并且在远程打印中,只有RAW格式是被Windows支持的,这能够在MSDN中查到。另外,若是打印图像,除DIB图像外,部分打印机在采用EMF格式时没法打印,如HP LaserJet 1100。固然,若是采用GDIPLUS技术打印,在400DPI下也是能够正常打印的,但当DPI大于400(具体上限没有测试),图像依然没法打印。
这里出现的DPI指的是显示的分辨率。如今咱们一般讲的打印机分辨率是多少 dpi,指的是“在该打印机最高分辨率模式下,每英寸所能打印的最多理论墨点数”。更加合理的对于dpi 的解释是这样的:若是一台打印机的分辨率是4800×1200 dpi,那么意味着在X方向(横向)上,两个墨点最近的距离能够达到1/4800英寸;在Y方向(纵向)上,两个墨点的距离能够达到1/1200英寸。
最后在MSDN上面还有一副关于GDI模式的图:
这幅图表示的是GDI模式下打印驱动位于内核态的工做模型,因为XP之后的打印机驱动都为用户态,内核态的打印机驱动基本再也不使用,就不另加说明了。
总结一下:当GDI程序执行打印时,经过调用API来传递GDI绘图指令到绘图引擎,绘图引擎要么和打印驱动一块儿合做来缓存这些绘制指定到一个EMF文件中,要么直接渲染成一个可打印的图片发送到打印假脱机队列服务spooler中。打印假脱机队列服务Spooler解释EMF文件,并将页面布局和做业控制指令信息插入到数据流中,而后发送这些数据里到序列化、并行化或者网络形式的打印机关联的端口上。
因为打印假脱机队列服务Spooler和打印驱动都是能够被单独取代,因此硬件厂商们能够很容易的增长对新硬件的支持。当须要增长对新款打印机的支持时,一般只须要建立根据微软所提供的打印驱动类型中相关联的数据类型就能够了。
XPSDrv打印驱动程序体系结构基于新一代文档格式XPS。XML PaPer Specification(XML文件规格,简称XPS)。这是一种可直接打印的通用电子文档格式,和PDF同样能够由其余任何格式转化。XPS是Windows内部一个彻底能够重复书写的打印子系统,打印机能够根据工做类型的不一样来接收这种电子文件,包括Microsoft Publisher和Microsoft Office文件等的文件皆可自由转化为XPS电子文档格式进行打印。
XPS不只仅是一种文档格式,它仍是一种物理存储结构上基于OPC,显示技术上基于WPF技术,而且将它们与打印子系统结合的产物。
如上图所示,一个XPS驱动体系的主要组件包括:
过滤器(Filter);
过滤管道(Filter pipeline);
过滤器管道管理器(Filter Pipeline Manager);
过滤器配置文件(Filter ConfigurationFile);
XPS Spooler Process
WPF应用程序。
其中过滤器(Filter),官方翻译为筛选器,意思差很少。过滤器配置文件和配置模块又称为XPSDrv。相较于 GDI 打印驱动程序体系结构,XPSDrv 打印驱动程序体系结构采用了过滤器的方式,能够提供更具弹性的打印途径。XPS 打印机驱动程序 (XPSDrv) 过滤器管道设计用于启用直接和可缩放的XPS文档打印。
首先由应用程序发出打印请求,若是发出的请求是WPF形式的打印请求那么就将进入XPS交换流管道Spooler Process。XPSDrv是XPS打印管道的核心,它包括一个调用过滤器的打印进程模块的设定文件,描述了打印驱动是如何被加载调用的,以及不一样的过滤器之间的数据是如何通讯的。(这部分在XPSDrv里叫作IFC)。另外图中Print Pipeline Filter的配置文件(XML)定义了:过滤器的分类,过滤器的接口以及每一个过滤器的输入输出格式。
在图中,打印做业经过WPF,以XPS流文件的格式进入系统驱动,经过驱动的Ul设置,能够配置给过滤器打印时须要的信息来进行打印操做,而后scheduler通知过滤器管道管理器(Filter pipeline manager),下面过滤器管道管理器(Filter pipeline manager)开始按照过滤器配置文件(Filter ConfigurationFile)配置文件来处理这些做业,过滤器管道管理器(Filter pipeline manager)经过调用配置文件来建立过滤管道(Filter pipeline),当过滤管道(Filter pipeline)被建立完成和初始化后,滤器管道管理器(Filter pipeline manager)就打开过滤管道(Filter pipeline)读取XPS流文件的内容。同时,在各个过滤器之间,使用Stream或Doculnent类型进行数据交换。XPS文件流经过WPF形式传送给Spooler,同时在不一样的过滤器之间经过一个XML配置文件进行管理,Ul能够经过DevMode写入Prinit Ticket从而对驱动过滤器进行设置控制。最终,文件经过CsxPStops这个过滤器转化为目前大部分打印机可识别的PS或PCL语言,最后经过打印流接口,将PDL数据交付打印机打印。
下图描述了打印子系统(XPSDrv)的工做流程,其中,浅蓝色的部分是Microsoft 提供的,浅×××的部分是有软件供应商提供的软件和应用程序,×××的是硬件打印机供应商(好比HP)提供的部分。
在XPS框架下,只有XPS一种工做模式。应用程序将不会直接调用驱动,打印的数据都会经过操做系统的XPS服务而生成一个用于打印的通用XPS文件。再由打印假脱机队列服务调用打印机驱动的各类过滤器修改生成的XPS文件并最终生成打印机能够处理的文件(能够是XPS文件,也能够是Raw文件),再经过端口监视器发给打印机进行打印。而XPS驱动体系为了兼容之前的系统,提供了两条印刷路径:一条是经过将XPS转化为传统的EMF文件流,再经过传统的GDI印刷路径打印;而另外一种打印路径是XPS文件经过一系列过滤器过滤,最后生成打印机能识别的PDL格式文件。这样既能够在新版本的操做系统环境下使用原有的打印技术,也能够在XP操做系统里用XPS打印路径。XPSDrv模型里提供从 XPS到GDI格式的转换器,用来实现Win32应用程序可以打印XPS文档。若是说WPF应用程序在进行写操做的目标打印队列没有XPSDrv驱动程序,那么该转换器就会自动完成从XPS到GDI格式的转换。
下图分别展示了GDI驱动体系和XPS驱动体系的工做流程图:
接下来咱们须要看看Windows系统上都有哪些打印机的驱动。目前Windows Server 2012上拥有如下打印机驱动程序:
V4打印机驱动程序(V4 Printer Driver)
对于OpenXPS驱动程序支持
XPS打印机驱动程序(XPSDrv)
微软通用打印机驱动程序(Microsoft UniversalPrinter Driver)
微软PostScript打印机驱动程序(Microsoft PostScriptPrinter Driver)
微软绘图仪驱动程序(Microsoft PlotterDriver)
V4版本的驱动程序框架主要在WindowServer 2012和Windows 8上出现,可是如今基于这样的打印机以及打印驱动还不是市场的主流,相信进过一段时间的推广和发展,从此咱们就看V4版本的驱动框架了。