二、通用Unix打印系统(CUPS)
2.1 CUPS简介
CUPS使用的是IPP(网络打印协议)标准,这是从HTTP中衍生出来的IETF协议。CUPS后台程序可以接受IPP请求,并且将其作为和客户端应用程序进行通信的主要方法。作为一个Internet协议,IPP使得在广域网上配置打印服务器变得非常容易。CUPS也支持其它可以和打印机进行通信的流行协议,因此也可以将其作为一个连接不支持IPP协议打印机的一个桥梁。和其所基于的HTTP协议一样,IPP也可以通过使用认证和SSL连接来加强安全性。CUPS本身都支持这些功能,也就是说它可以进行安全打印。
CUPS采用的另外一个标准是PPD(PostScript Printer Definition)文件格式,这是Adobe另外一个用于PostScript打印机的标准。
CUPS还采用了很多过滤器用于传送数据至打印机的方法。与BSD类的假脱机程序不同的是,这是通过一种更加智能的方式来完成的。下面是在CUPS中可用的部分过滤器:
1.后端过滤器。它可以提供最终数据进行传送的端点。这些过滤器可用于并口、TCP/IP套接字连接、LPD和其它端点的连接。
2.文档转换过滤器。该过滤器是作为CUPS一个标准配置一起发行的。它可以转换图像、ASCⅡ文本、PDF文件和HP-GL/2矢量文档至PostScript。
3.接口过滤器。它可以将文档从PostScript转换至其它过渡的文件格式。
和其它的打印系统一样,为了能够在非PostScript打印机上正确打印,翻译过滤器也是必须的。CUPS允许PPD文件记述用于将文档换成设备本地语言的过滤器,比如:
*cupsFilter: "application/vnd.cups-raster 0 rastertohp
这是用于HP Deskjet打印机的一个PPD文件。它的意思是rastertohp程序(这是一个过滤器,通过位于/usr/lib/cups/filter)将把MIME数据类型的文件“application/vnd.cups-raster”作为输入,并且将其转换成可直接送至打印机的格式,在此就是HP PCL数据。
CUPS可以进行打印机分类,该功能最初用于Sy stem V打印系统中。它可以将打印机按组“分类”,并且自动执行负载均衡功能。一个分类可以将任务传送至一个正常的队列中,一旦任务提交,就会被分配给第一个可用的打印机来执行打印任务。
CUPS一个非常有用的功能就是可以自动进行网络配置。通过广播协议,所有位于同一个局域网的CUPS监控程序都可以相互通信,某一服务器上的队列配置可以被浏览,并可用于其它的系统之上。CUPS也可以为那些位于不同服务器上却有着同样名字的打印机提供一个“默认分类” ,并自动为其提供负载平衡。CUPS也支持LSP(服务定位协议),该协议可以发送广播以表明自己已经在线。
在客户端,CUPS有LPD类和System V类的接口,这就意味着它可以提供lpr、lpq、lp、lpstat等系统命对于IPP客户端和CUPS监控程序进行通信的过程来说,所有这些命令都是非常重要的。
CUPS还有一个基于Web的系统管理界面,可以直接通过Web浏览器进行配置和管理,或者检查打印机的状态。这显然要比使用命令或直接通过编辑/etc/cups/printers.conf文件来定义队列要直观得多。
CUPS打印不需要将输出格式限制在PostScript。虽然其它一些打印系统也不一定有这样的限制,但是CUPS却将它做得更容易。前面我们已经看到了用于CUPS的PPD文件中是如何指定一个转换过滤器的,以及这些内容如何包含在MIME中。CUPS广泛使用了MIME类型来决定打印机间任务提交和最终数据之间的数据流。过滤器可以在*.convs文件(通常位于/etc/cups)中定义,该文件可以描述每一个过滤器程序作为接收输入的数据类型及作为输出的数据类型。对于一给定类型的任务,CUPS会聪明地在一个过滤器链中做出决定。
2.1应用程序接口
在Unix世界里,PostScript语言仍然是主要用于打印的接口。所有主要的应用程序都会输出通用的PostScript页面,而这些PostScript经过打印系统处理后再被打印出来。这显然有很大的局限性,因为应用程序并没有一种统一的、查询打印功能或获知任务是否被正确打印的途径。有少量的应用程序可以使用PPD文件来访问打印机功能,不过StarOffice和OpenOffice并不包含在内。
现在情况还是有所改观。比如,CUPS提供了一个基本的C API,它可以让应用程序更简单地和打印系统进行整合。这个API包含了通过IPP和CUPS监控程序进行通信的功能,以及读取和解析PPD文件的功能,这样,应用程序就具备了收集打印机详细信息的能力。但对于应用程序开发人员来说还有很大的局限性,因为它只能在CUPS和类似的IPP服务器上工作。
在软件方面,为了使打印更加容易,现在GNOME和KDE桌面项目都包含了一个中间层,分别是KDEPrint和GNOME。这些框架的目的是通过抽出基本的打印系统,为应用程序提供一个统一的API。