微软的Windows2000及其以后操作系统的打印架构,是有一个打印spooler
和一系列打印机驱动构成。应用程序可以通过调用(设备无关性的)函数创建打印作业,并把打印作业发送给不同的打印设备,这些打印设备包括:激光打印机,矢量打印机,光栅打印机和传真机。
打印机驱动包含两个组件,一个是rendering组件
,另一个是配置组件。Rendering组件把来自应用程序的绘图命令
转换成一种数据格式,打印机使用这种数据格式把图像呈现在页面/纸张上。配置组件
包含一个用户接口组件和一个编程接口:用户可以通过用户接口组件
控制打印机的可选选项;而编程接口
可以把打印机的配置和特征告知应用程序。
当一个微软的win32 GDI应用程序打印时,它会调用win32 API中的GDI函数。这些GDI函数(负责)把信息传递给GDI绘图引擎。GDI绘图引擎有两种处理方式,它会选择其中的一种来处理收到的信息。
一种处理方式是:把绘图指令假脱机(暂时缓存)成一个EMF(enhanced metafile)文件;
另一种处理方式是:结合一个打印机驱动,呈现一个可打印的图像,然后发送给spooler。
由spooler组件解释/翻译EMF文件,并且这些组件能够把页面布局信息和作业控制指令插入数据流中。然后spooler把数据流
发送给与目标打印机I/O端口关联的端口(串口,并口或者网络)驱动。再有就是,如果打印到的是一个XPS设备,那么GDI打印命令会被(GDI到XPS)转换组件进行转换,并且打印作业被发送到XPS打印路径上。
在Windows Vista和Windows 7系统中,XPS打印路径
上的打印机驱动都是基于XPS(XML Paper Specification)的。当一个微软的win32 XPS 应用程序打印时,这个应用程序就会调用XPS打印API中的XPS函数。当应用程序的打印由XPSDrv打印机驱动排队时,spooler把XPS假脱机(缓冲)文件直接传递个设备进行呈现和输出。当一个XPS文件被打印到一个GDI设备时,通过XPS到GDI转换模块它会被转换成一个EMF文件。然后以类似于通过GDI打印路径
的方式,被发送给win32 GDI 应用程序。
在Windows Vista和Windows 7操作系统中,(视图展现框架WPF)应用程序调用WPF支持的打印函数,把XPS文档以XPS假脱机文件格式
,假脱机(缓存)给spooler。因此当win32 xps 应用程序打印时,
如果spooler使用XPSDrv打印机驱动打印到打印队列,那么spooler把假脱机文件原封不动的传递给XPSDrv打印机驱动进行呈现和输出。
如果spooler打印到一个基于GDI 第三版打印机驱动的打印机时,那么spooler就会把XPS假脱机格式的文件发送给GDI转换模块,转换成一个EMF文件,然后这个EMF文件发送给基于GDI的打印机驱动进行打印。
关于数据路径更多的信息,请查看微软Windows Vista打印路径简介(Microsoft Windows Vista Print Path Overview)。关于XPS更多的信息,请看Microsoft XPS网站。
spooler组件和驱动组件是可以被替换的,因此硬件厂商能够很容易的添加新硬件的支持。