> 文档中心 > Linux系统下基于CUPS的打印机驱动程序

Linux系统下基于CUPS的打印机驱动程序

Linux下基于CUPS的打印机驱动程序开发与应用

摘要:本文阐述了Linux下基于CUPS的打印机驱动程序工作流程及开发实践,对工程实际操作具有较强指导意义。

关键词:打印机  驱动程序  CUPS   Linux  国产化

1 引言

由于Linux系统的开放自由,使得越来越多的人进入Linux的世界。目前,国防建设相关软硬件国产化已成为国家战略。在此背景下,国内以中标软件公司、国防科大为代表的的一批公司和科研机构依托国外开源的Linux系统进行了国产操作系统的研制。经过十几年的发展,以中标麒麟操作系统为代表的操作系统已经标准化、系列化、成熟化,在易用性、稳定性、综合性能指标上已接近或达到成熟商业操作系统的标准,并且在一些政府、军队、机要等部门已经取得一些实际应用。

在军民融合大背景下,我司作为国产打印机的核心企业,打印机在专用市场领域已取得广泛应用,市场占有率达80%以上。由于Linux系统的应用越来越广泛,为更好服务客户,提升打印机的市场竞争力,特别研发了适应多种国产操作系统的打印机驱动程序。

打印机驱动开发属于边缘冷门技术,开发人员不多,涉众不广,经验技术交流平台和渠道比较欠缺。目前,主要参考资料一般来源于国外相关专业网站。主流打印机制造商在Linux下的驱动一般都是基于CUPS(Common Unix Printing  System)框架开发。

本文描述了一种普遍适用于Linux下基于CUPS的打印驱动开发的通用技术和实践方法。目前基于此技术开发的驱动已支持数十种光电通系列信息安全打印机。

2 基于CUPS的打印流程

CUPS是一种供Unix以及Linux操作系统使用的打印系统。通过这种打印系统,为打印机厂商提供了统一的接口,极大方便了驱动程序的开发。CUPS以互联网打印协议(IPP)为基础。IPP是一种新型网络打印协议,它使我们能够在办公室里或世界上任何地方通过网络打印机进行本地或远程打印。IPP定义了打印、管理打印作业以及打印机选项(如纸张大小、分辨率等)的标准协议。

典型的CUPS打印流程如下图1所示,首先用户通过系统应用程序(如文本编辑软件等)下发打印任务,原始文件可能是txt、pdf、html或者图片等格式,这些格式的文件经初始预处理过滤器统一转换成PS文件。PS文件再经过一系列过滤器转换后生成打印机能够理解的图片格式,最后通过后端(backend)下发给打印机。后端根据通信的接口形式不同会有多种,如支持USB和网络通信的后台程序。

图1  CUPS打印流程图

3 驱动程序开发与实现

基于CUPS的Linux打印机驱动程序主要包括过滤器(filter)、PPD文件、后台程序(backend)等组成。(1)后台程序一般可以使用系统自带的,而不需要程序员重新开发,也可以重新开发产品专属的后台程序,这样的好处是自主可控;(2)PPD文件需要根据打印机的功能性能来定制生成;(3)驱动程序的核心主体还是过滤器,驱动开发的主要工作也集中在过滤器的开发上。下面主要介绍过滤器和PPD文件的实现方法。

3.1 过滤器的开发

过滤器(filter)一般由打印机特有的一个或多个过滤器组成。经过一系列过滤器的转换,打印文件最终被转换为打印机能够理解的格式(如HP-PCL)。

3.1.1 过滤器功能

CUPS过滤器是打印系统的中枢。有了过滤器就能让打印系统支持任何类型的打印机。打印过程中,调度程序可以按照一定的规则来选择适当的过滤器,以将打印文件转换为可以打印的格式。过滤器可以是系统可以执行的任何程序或脚本[1]。

CUPS已经提供了很多标准过滤器,位于目录/usr/lib/cups/filter/中(不同操作系统可能会有差异)。对于打印机厂商来说,一般都需要在CUPS已有的过滤器基础上,再根据自身打印语言的特殊要求来增加一些过滤器,来得到最终打印机需要的文件格式。打印驱动完成的主要功能就是:把原始的文件格式通过一系列过滤器最终转换成打印机可以理解的文件格式的过程。

每个过滤器程序都被传送给下一个过滤器,而状态和其他消息被写入标准错误文件中(/var/log/cups/error_log)。过滤器链(Filter Chain)中的第一个过滤器将读取指定的文件。其后的过滤器必须读取标准输入文件。

第一个过滤器在运行时使用七个参数,而其后的过滤器只有六个参数。这就使得第一个过滤器可以读取打印文件,而其他过滤器只能从标准输入读取前面过滤器输出的结果。所以每个过滤器的main必须带参数。

3.1.2过滤器的选择过程

在打印文件的时候,CUPS 使用 MIME(多用途 Internet 邮件扩展)类型确定合适的转换过滤器,CUPS 使用来自 /usr/share/cups/mime/mime.types 的规则确定文件的类型,然后从/usr/share/cups/mime/mime.convs 列出的过滤器中为给出的 MIME 类型选择合适的过滤器。MIME 类型在 IANA(Internet Assigned Numbers AuthorityInternet)上注册。如果所需的类型没有注册,请在mime.types中增加新增的类型;也可以在mime文件夹下增加自己的**.types和**.convs文件,来增加新的类型和规则[2]。

确定了文件的 MIME 类型之后,CUPS就会自动从 /usr/share/cups/mime/mime.convs 文件中查找合适的过滤器(依据cost开销最少的一条路径)进行文件格式的转换。Convs文件中每行对应一个转换规格,这个规则包括四项内容,分别是源MIME类型、目标MIME 类型、代价cost和过滤器的名称。本驱动开发过程中,用到的主要MIME类型及对应的过滤器如下表所示:

表1 CONVS文件类型

[1]源MIME类型

[2]目标MIME 类型

[3]代价cost

[4]过滤器的名称

备注

text/plain

application/postscript

33

texttops

Mime.convs

application/vnd.cups-postscript

image/x-portable-bitmap

60

pstopbm

Toec.convs

image/x-portable-bitmap

image/x-portable-jbig

60

pbmtojbig

image/x-portable-jbig

application/x-toecopl

100

jbigtoopl

3.1.3 核心过滤器的开发

本驱动开发过程中,自主开发的过滤器包括:pstopbm,pbmtojbig和jbigtoopl三种。前两种过滤器主要完成图像格式转换,转换过程为:PS-〉PBM-〉JBIG,最后一个主要实现通信协议并完成与打印机交互。开发采用C语言,用到了一些第三方商业图像库(如Leadtool),编写makefile,在Linux下基于gcc编译生成pstopbm,pbmtojbig和jbigtoopl等三个过滤器(可执行文件)。

一些国际知名打印机公司,如Hp、Cannon等,在过滤器开发上一般都是提供一个高度集成的过滤器来完成所有功能。这样的好处是中间转换过程对用户不可见,具有一定的机密性,同时,具有完整性和简洁性,方便打包安装卸载和传播。

3.2 PPD文件

打印机驱动除了过滤器程序外,还必须包含一个postscript打印机描述文件——PPD。PPD文件由纯文本文件组成,它说明了打印机的特性、选项和功能,包含以下4部分:

(1)打印机标识:

此部分以标准的PPD报头开始,如:*PPD-Adobe:”4.3”  

说明:PPD-Adobe:表示此文件是PPD文件;4.3表示PPD文件遵循PPD规范的版本。

(2)约束:

告诉驱动程序,有两个选项不兼容 。示例如下

*UIConstraints: *PageSize A4  *InputSlot Envelope

说明:当选择Envelope 送纸器打印时,不能选择A4幅面大小的纸张。

(3)选项:

PPD文件可包含任意数量的选项和选项组,选项有三种类型:Boolean布尔型、PickOne从列表中选择、PickMany允许进行多项选择。新选项以*OpenUI作为开头。示例如下:

*OpenUI *cupsDarkness/Darkness: PickOne 

*OrderDependency: 10 AnySetup *cupsDarkness

*DefaultcupsDarkness: Light

*cupsDarkness Light/Light: "<>setpagedevice"

*cupsDarkness Normal/Normal: "<>setpagedevice"

*cupsDarkness Dark/Dark: "<>setpagedevice"

*CloseUI: *cupsDarkness

(4)字体

PPD包含打印机的字体列表。每行都指定了字体名、编码、版本、字符集和状态。如:*Font  AvantGarde-Book: Standard  "(1.05)"  Standard  ROM

注意:在UNIX中,PPD文件中每一行都由换行符结尾,注释行以字符串“*%”开头。得到ppd文件的另外一种方法是:先编写一个.drv文件,在Linux命令行下用ppdc命令进行编译就可以生成一个标准格式的ppd文件。这种方法比较方便,文件结构比较清楚。

4驱动程序打包发布

4.1准备素材

按最终需要安装到系统中的目录结构在本地建立对应的文件夹目录,把准备好的过滤器、PPD及其他可能的脚本、帮助文件复制到对应的文件夹中,再打成压缩包,如toec_oep102d-1.0.tar.bz2。主要文件目录功能说明如表2所示。

表2 目录功能说明

序号

路径说明

路径

文件

1

过滤器

/usr/lib/cups/filter/

Pstopbm_102d/pbmtojbig_102d等

2

PPD文件目录

/usr/share/cups/model/

OEP102D.PPD

3

文件类型及转换规则

/usr/share/cups/mime/

toec.types/ toec.convs

4.2生成安装包

驱动的安装包制作采用RPM(RPM Package Manager,RPM软件包管理器),首先把4.1中准备好的压缩包复制到/ rpmbuild/SOURCES/目录中,编写一个SPEC文件,复制到/rpmbuild/SPEC/目录中,接着从Linux终端下执行打包命令rpmbuild -ba rpmpackage-0.1-1.spec,生成的安装包位于目录/rpmbuild /RPMS/i386/toec_oep102d-1.0-1.nk.i386.rpm。

5 结论

通过对CUPS深入的研究和理解,在Linux系统上基于CUPS框架的通用技术实现了多款打印机驱动程序,适配了多种型号打印机,并与多种国产软硬件平台进行了适配,特别适配了搭载国产龙芯、飞腾等CPU的计算机,同时对中标麒麟、U麒麟等国产操作系统进行了全面适配,取得了较好效果,加快了相关领域国产化的进程。

参考文献

[1] http://www.cups.org/documentation.php/ppd-compiler.html

[2] CUPS: Common UNIX Printing System

天津圣卡普斯智能科技有限公司

商务洽谈 18522215712    技术支持 13011321319 (微信同号) 

资料索取请注明:打印机驱动