1. 引言
随着数字化技术的迅猛发展,目前许多行业和个人普遍都使用电子文档处理资料和保存信息,并且经常通过打印,复印等途径将电子文档中的内容显示在纸张上,以供阅读和传播。这一过程无疑对资料和信息保密是一个重要挑战。存在的问题包括:如何控制用户使用打印机避免纸张浪费和打印机损耗;如何对进行打印操作的用户信息进行记录,并嵌入到打印数据中使形成的纸质文档具有明显身份标识,便于纸质文档管理和来源追踪。
目前已经出现了针对Windows操作系统下的打印控制和管理方法的诸多研究成果及成熟的应用系统,例如黎伶锋等在“打印监控审计技术研究”中公开了Windows系统下常见的四种打印监控技术[1] 。刘慧 [2] 在其学位论文中对Windows系统打印原理与网络打印机连接方式以及网络打印协议进行了研究与分析并提出了多种方式实现对网络打印的监控管理方案。北大方正集团在“一种文档打印管控与文档溯源追踪方法和系统”专利中给出的打印管控和文档溯源追踪方法等 [3] 。出于对企业成本的节约以及对企业信息安全的考虑,不少公司已经在打印机监控方面做出了不少的研究,并做出了许多好的产品。如上海银兆的PrintUsage、上海达安科技的PrinterAdiut打印监控系统、较流行的打印机监控王、山明打印机监控系统、WebJetAdmin等。
然而在UNIX/Linux操作系统或其衍生系统下,尚未出现相应的研究成果。随着Linux系统的广泛使用,该系统下的打印控制和管理方法的重要性已经日渐提升。此外,国产操作系统都是基于Linux的衍生系统,随着国产化的推进和保密要求的日渐严格,此类操作系统下的打印控制和管理方法也越来越具有重要意义。Unix/Linux下打印总是有许多限制,但如果安装了CUPS (Common UNIX Printing System),则可以得到一个完整的打印解决方案 [4] ,UNIX操作系统、Linux操作系统、国产操作系统和Mac OS操作系统均采用CUPS作为打印系统架构。因此,研究基于CUPS架构的打印管控方法,是实现Linux/UNIX系统及国产操作系统下打印管控的关键。本文给出一种基于CUPS架构的方法,以解决Linux操作系统和国产操作系统上的打印控制及打印管理等问题。
图1为本文给出的打印控制和管理方法的整体结构。该方法以CUPS架构为基础,包括虚拟打印机驱动、用户配置、打印记录、多个物理打印机。虚拟打印机驱动和物理打印机安装在CUPS架构上,用户配置和打印记录保存在系统存储器。CUPS是本发明的底层架构,用于支持虚拟打印机及物理打印机,并对打印机访问控制提供支持。虚拟打印机驱动用于获得打印操作用户名,打印内容及其他管理信息。

Figure 1. Architecture of the print control and manage system based on CUPS
图1. 基于CUPS的打印控制和管理方法架构
用户配置保存不同用户的配置信息,包括可操作物理打印机列表等,其作用是为显示给用户的操作界面提供数据。打印记录保存打印操作的用户名、拷贝数、标题、页数以及打印内容等,为后续的查询及审计等管理功能提供数据。物理打印机通过通信线缆与计算机连接,接收嵌入用户信息的打印文档,完成实际的打印操作,得到纸质文档。
2. 虚拟打印机驱动设计
CUPS架构下的打印机驱动包括两种类型:PostScript打印机驱动和光栅打印机驱动 [5] 。图2和图3给出了这两种类型的打印机驱动过滤器链。无论是哪一种类型的打印机驱动,打印作业的数据流是相同的。在用户打印的时候,调度程序cupsd确定打印作业的格式以及用于将打印作业转换成打印机能识别的信息的程序(CUPS已经包含了针对多种通用格式的过滤程序,例如将PDF文件转换为CUPS光栅数据的过滤程序)。然后将打印作业转换为CUPS的两种标准数据格式之一,转换后的数据发送到过滤器程序,由过滤器程序转换为打印机能识别的格式(例如HP-PCL)。转换后的数据发送到后端程序(backend),后端程序再将数据通过物理接口发送到打印机。在图2和图3中不同组件之间的数据传递均采用标准输入(stdin)和标准输出(stdout),即从标准输入获得前级组件发来的数据,处理后的数据通过标准输出发送给后级组件。对比图2和图3所示的两种类型打印机驱动的数据流,其区别仅仅在于从CUPS Filter得到的数据是PostScript格式还是光栅格式。由于PostScript语言是一种文本格式的打印控制语言 [6] ,而且在Linux系统下PostScript格式数据可以方便的转换到其他格式且便于嵌入自定义信息,因此本文设计的虚拟打印机驱动以PostScript格式作为中间数据格式,即采用图3的流程设计虚拟打印机驱动。
基于PostScript的虚拟打印机驱动,包括一个打印机描述文件(PPD文件)、一个过滤器程序(filter)和一个后端程序(backend)。打印机描述文件包含虚拟打印机驱动的信息和用户界面配置。过滤器程序是一个命令行程序,用于获得CUPS传入的打印操作信息和内容。后端程序用于产生一个在CUPS架构中对用户可见的虚拟端口,并存储打印内容,在安装虚拟打印机驱动时需要将虚拟打印机安装到该端口。通过打印机描述文件将虚拟打印机安装在CUPS下之后,所有通过该虚拟打印机进行的打印操作及相关信息都会发送到该虚拟打印机的过滤器程序,而过滤器处理后的数据将发送到后端程序。
2.1. PPD文件设计
PPD文件由文本格式的驱动信息文件(通常以.drv为后缀)通过CUPS的PPD编译器编译得到。驱动信息文件中定义了打印机的各种属性和选项,包括产品信息、过滤器、介质和分辨率以及自定义选项。由于虚拟打印机驱动并不直接输出打印内容而是要将打印内容通过用户选择的物理打印机进行输出,因此为了兼容绝大部分物理打印机,虚拟打印机需要提供常用的纸张、分辨率、单双面打印等打印选项,

Figure 2. Postscript filter chain
图2. PostScript驱动过滤器链
这些选项只需要在驱动信息文件中参照CUPS的要求进行设置即可。在我们的打印机驱动信息文件中最重要的是指明该驱动将要用到的过滤器程序,使得CUPS在对打印操作进行调度时,可以把打印内容发送到指定的过滤器程序。而要指定驱动使用的过滤器程序只需要按照下面的格式在文件中增加Filter命令即可。

其中“DriverType ps”命令表明我们的驱动类型是PostScript。而“Filter application/vnd.cups-postscript 100 cpifilter”表明我们的驱动对应的过滤器程序名为“vfilter”,且过滤器内得到的数据为PostScript格式。驱动信息文件完成后通过PPD编译器PPDC进行编译即可得到安装驱动所需的打印机描述文件。
2.2. 过滤器程序设计
过滤器程序为标准命令行程序,由CUPS调度。当过滤器程序被调度时,通过命令行参数传入了打印作业的相关信息,如表1所示。从表1中可知,发起打印作业的用户名可从argv[2]中获得。其他打印选项如纸张尺寸,送纸器等可以利用cups标准函数cupsGetOption从argv[5]中获得。
通过命令行参数argv[2]得到当前用户名,并使用该用户名在用户配置文件中查找该用户可以使用的所有物理打印机,生成物理打印机列表并通过对话框展示给用户。在用户选择物理打印机后,过滤器程序使用用户名,物理打印机名称,拷贝数量等信息生成打印记录,然后进行打印内容处理。
打印内容处理的主要目的是将包括用户名,作业ID,作业标题以及打印时间等内容的打印管理信息嵌入打印作业的每个页面。在过滤器中获得的打印内容是PostScript格式的打印数据。PostScript格式的打印数据会使用“showpage”命令来打印每一页,因此只需在打印内容数据流中找到所有“showpage”命令,并在每一条“showpage”命令之前增加一条“show”命令将打印管理信息文本添加到页面中不影响页面内容的地方(通常在页面顶部或底部)。在完成页面内容处理后,嵌入了管理信息的打印内容通过标准输出发送给后端程序。过滤器程序的处理流程如图4所示。

Table 1. Command line arguments of filter
表1. 过滤器程序中传入的命令行参数
2.3. 后端程序设计
后端程序(backend)将过滤器程序处理后的PCL数据流发送给打印机,完成打印过程。设计后端程序的关键是要让CUPS识别所扩充的后端程序是一个有效的后端程序,这一过程在后端程序中称为“设备发现”。其核心是当后端程序以不带命令行参数形式被CUPS调用时要将该后端程序支持的设备信息输出到标准输出(stdout),输出的内容包括“设别类别”(例如,direct、network、file等),“设备URI”,“制造商信息”和“设备信息”。为了使虚拟打印机可以安装到该端口上,虚拟端口类别为direct,其设备发现信息如下所示。

此外,后端程序还需要从标准输入读取所有打印数据并存储到文件,同时发送给物理打印机,直到接收完所有打印数据,后端程序流程如图5所示。
3. 打印控制和管理方法
在完成虚拟打印机驱动设计后,可以通过CUPS和虚拟打印机驱动协作完成打印控制和管理。打印控制和管理方法的具体步骤如下:
1) 安装基于CUPS架构的虚拟打印机驱动。
2) 通过CUPS对虚拟打印机和物理打印机(包括本地打印机、共享打印机和网络打印机)进行访问控制,使得所有物理打印机只能被一个区别于普通用户的特定用户(该特定用户的用户名可以由root用户指定,假设为print_user)访问,而虚拟打印机可以被所有用户访问。
3) 配置各个用户可以用来输出打印内容的物理打印机,并形成配置文件。
4) 用户在客户端启动打印操作,此时只能访问虚拟打印机。当用户在打印操作界面中选择虚拟打印机启动打印操作时,虚拟打印机获得打印请求。
5) 虚拟打印机驱动获得打印操作的用户名,并根据用户名从步骤3)的配置文件中获得该用户可以使用的物理打印机列表,并将列表展示给用户以供选择
6) 用户在物理打印机列表中选择用于完成实际打印操作的物理打印机名称,虚拟打印机驱动记录用户名,用户选择的物理打印机名称、打印格式及打印作业的相关信息(包括标题,拷贝数量,打印时间等)。
7) 虚拟打印机驱动在PostScript格式的打印页面中嵌入步骤6)的打印管理信息。
8) 虚拟打印机驱动通过特定用户(print_user)将嵌入管理信息的打印内容按照用户指定的打印格式发送给用户选择的物理打印机,完成实际输出。
4. 实验结果
为了验证本文给出的打印管理方法,我们设计并实现了一个简单的原型系统。该原型系统在Linux Fedora 16操作系统下进行安装并测试。测试内容主要包括:虚拟打印机安装,物理打印机访问控制、打印记录生成及管理信息嵌入。
4.1. 虚拟打印机安装测试
使用2.1节给出的PPD文件,过滤器程序和后端程序,可以将虚拟打印机驱动安装到CUPS。安装完成后该虚拟打印机机可以在CUPS中查看,如图6所示。
4.2. 物理打印机访问控制
通过CUPS的管理页面可以设置每个物理打印机的访问控制,在原型系统中我们将所有物理打印机设置为不能被普通用户访问,而虚拟打印机可以被所有用户访问。如图7(a)所示,在设置访问控制之前,用户在进行打印操作时,可以看到所有物理打印机和虚拟打印机。如图7(b)所示,设置了访问控制后,用户在进行打印操作时,只能看到虚拟打印机。
4.3. 打印记录生成及管理信息嵌入
用户进行打印操作时,首先根据用户名访问用户配置文件,弹出图8所示的选择物理打印机对话框,在用户选择了某个物理打印机后,用户名,物理打印机名、作业ID、作业标题、打印时间等信息被嵌入到打印作业的每个页面,如图9所示。

Figure 6. The virtual printer installed in CUPS
图6. CUPS中安装的虚拟打印机
(a)
(b)
Figure 7. Printer access control: (a) before access control; (b) after access control
图7. 打印机访问控制 (a) 设置访问控制之前; (b)设置访问控制之后

Figure 8. The dialog used to select physical printer
图8. 选择物理打印机对话框

Figure 9. The page embedded manage information
图9. 嵌入了管理信息的打印页面
5. 结论
小节4的测试证明了本文所给出的打印控制和管理方法及原型系统的可行性。由于目前国内还没有针对Linux系统及国产操作系统的打印控制和管理方法的研究成果,因此本文给出的方法及原型系统具有独创性。本文给出的方法以CUPS架构为基础,而CUPS架构在Linux、UNIX,国产操作系统以及Mac系统下都被广泛使用,因此该方法也适用于这些系统,具备较强的通用性。
文中给出的原型系统还存在若干可以进一步完善的地方:1) 除了明文形式的来源信息外,还可以使用打印管理信息生成二维码图像,然后通过数字水印技术在页面中嵌入二维码图像,嵌入水印之后的页面在打印后与原始文档的区别无法用肉眼分辨,但通过扫描和特定水印提取算法可以得到嵌入在页面中的二维码图像,从而得到打印管理信息,这种方式更加安全和隐蔽;2) 除了嵌入打印来源信息外,还可以通过[7] 给出的方法获得打印作业中包含的文本信息,然后通过文本匹配算法找到所有敏感的关键字。获得的关键字可以用于对打印作业进行审核,进一步增强打印管理系统的安全性。
基金项目
本文由西安市科技计划项目《智能管理与数字生活关键技术与研发——打印安全管理系统》资助,项目编号:CXY1440(2)。