开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
前言
前几章我们学习了如何操控文本,下面要做的是将文本呈于纸上。在这章中,我们将会着手用于打印文件和控制打印选项的命令行工具。通常不同发行版的打印配置各有不同且都会在其安装时自动完成,因此这里我们不讨论打印的配置过程。本章的练习需要一台正确配置的打印机来完成。
我们将讨论一下命令:
-
pr ——转换需要打印的文本文件
-
lpr ——打印文件
-
lp ——打印文件(System V)
-
a2ps ——为 PostScript 打印机格式化文件
-
lpstat ——显示打印机状态信息
-
lpq ——显示打印机队列状态
-
lprm ——取消打印任务
-
cancel ——取消打印任务(System V)
一、打印
1.1 打印简史
为了较好的理解类 Unix 操作系统中的打印功能,我们必须先了解一些历史。类 Unix 系统中的打印可追溯到操作系统本身的起源,那时候打印机和它的用法与今天截然不同。
早期的打印
和计算机一样,前 PC 时代的打印机都很大、很贵,并且很集中。1980 年的计算机用户都是在离电脑很远的地方用一个连接电脑的终端来工作的,而打印机就放在电脑旁并受到计算机管理员的全方位监视。
由于当时打印机既昂贵又集中,而且都工作在早期的 Unix 环境下,人们从实际考虑通常都会多人共享一台打印机。为了区别不同用户的打印任务,每个打印任务的开头都会打印一张写着用户名字的标题页,然后计算机工作人员会用推车装好当天的打印任务并分发给每个用户。
基于字符的打印机
80 年代的打印机技术有两方面的不同。
-
首先,那时的打印机基本上都是打击式打印机。 打击式打印机使用撞针打击色带的机械结构在纸上形成字符。这种流行的技术造就了当时的菊轮式打印和点阵式打印。
-
其次,更重要的是,早期打印机的特点是它使用设备内部固定的一组字符集。 比如,一台菊轮式打印机只能打印固定在其菊花轮花瓣上的字符,就这点而言打印机更像是高速打字机。 大部分打字机都使用等宽字体,意思是说每个字符的宽度相等,页面上只有固定的区域可供打印,而这些区域只能容纳固定的字符数。大部分打印机采用横向 10 字符每英寸(CPI)和纵向 6 行每英寸(LPI)的规格打印,这样一张美式信片纸就有横向 85 字符宽纵向 66 行高,加上两侧的页边距,一行的最大宽度可达 80 字符。据此,使用等宽字体就能提供所见即所得(WYSIWYG,What You See Is What You Get)的打印预览。
图形化打印机
图形用户界面(GUI)的发展催生了打印机技术中主要的变革。随着计算机的展现步入更多以图形为基础的方式,打印技术也从基于字符走向图形化技术,这一切都是源于激光打印机的到来,它不仅廉价,还可以在打印区域的任意位置打印微小的墨点,而不是使用固定的字符集。这让打印机能够打印成比例的字体(像用排字机那样),甚至是图片和高质量图表。然而,从基于字符的方式到转移到图形化的方式提出了一个严峻的技术挑战。原因如下:使用基于字符的打印机时,填满一张纸所用的字节数可以这样计算出来(假设一张纸有 60 行,每行 80 个字符):60 × 80 = 4800 字节相比之下,用一台 300 点每英寸(DPI)分辨率的激光打印机(假设一张纸有 8 乘 10 英寸的打印区域)打印则需要 (8 × 300) × (10 × 300) ÷ 8 = 900,000 字节。当时许多慢速的个人电脑网络无法接受激光打印机打印一页需要传输将近 1 兆的数据这一点,因此,很有必要发明一种更聪明的方法。这种发明便是页面描述语言(PDL)。PDL 是一种描述页面内容的编程语言。简单的说就是,“到这个地方,印一个 10 点大小的黑体字符 a ,到这个地方……”这样直到页面上的所有内容都描述完了。第一种主要的 PDL 是 Adobe 系统开发的 PostScript,直到今天,这种语言仍被广泛使用。PostScript 是专为印刷各类图形和图像设计的完整的编程语言,它内建支持 35 种标准的高质量字体,在工作是还能够接受其他的字体定义。最早,对 PostScript 的支持是打印机本身内建的。这样传输数据的问题就解决了。相比基于字符打印机的简单字节流,典型的 PostScript 程序更为详细,而且比表示整个页面的字节数要小很多。一台 PostScript 打印机接受 PostScript 程序作为输入。打印机有自己的处理器和内存(通常这让打印机比连接它的计算机更为强大),能执行一种叫做 PostScript 解析器的特殊程序用于读取输入的 PostScript 程序并生成结果导入打印机的内存,这样就形成了要转移到纸上的位(点)图。这种将页面渲染成大型位图(bitmap)的过程有个通用名称作光栅图像处理器(raster image processor),又叫 RIP。多年之后,电脑和网络都变得更快了。这使得 RIP 技术从打印机转移到了主机上,还让高品质打印机变得更便宜了。现在的许多打印机仍能接受基于字符的字节流,但很多廉价的打印机却不支持,因为它们依赖于主机的 RIP 提供的比特流来作为点阵打印。当然也有不少仍旧是 PostScript 打印机
1.2 在 Linux 下打印
当前 Linux 系统采用两套软件配合显示和管理打印。第一,CUPS(Common Unix PrintingSystem,一般 Unix 打印系统),用于提供打印驱动和打印任务管理;第二,Ghostscript,一种 PostScript 解析器,作为 RIP 使用。CUPS 通过创建并维护打印队列来管理打印机。如前所述,Unix 下的打印原本是设计成多用户共享中央打印机的管理模式的。由于打印机本身比连接到它的电脑要慢,打印系统就需要对打印任务进行调度使其保持顺序。CUPS 还能识别出 不同类型的数据(在合理范围内)并转换文件为可打印的格式。
1.3 为打印准备文件
pr
—— 转换需要打印的文本文件
1.4 将打印任务送至打印机
lpr
——打印文件(Berkeley 风格)
lpr 程序可以用来把文件传送给打印机。由于它能接收标准输入,所以能用管道来协同工作。
例如,要打印刚才多列目录列表的结果,我们只需这样
[me@linuxbox ~]$ ls /usr/bin | pr -3 | lpr
报告会送到系统默认的打印机,如果要送到别的打印机,可以使用 -P 参数: lpr -Pprinter name printer name 表示这台打印机的名称。若要查看系统已知的打印机列表:
lp
——打印文件(System V 风格)
和 lpr 一样,lp 可以接收文件或标准输入为打印内容。与 lpr 不同的是 lp 支持不同的选项(略为复杂),表 22-3 列出了其常用选项。
另一种选择:a2ps
a2ps 程序很有趣。单从名字上看,这是个格式转换程序,但它的功能不止于此。程序名字的本意为 ASCII to PostScript
,它是用来为 PostScript 打印机准备要打印的文本文件的。
多年后,程序的功能得到了提升,名字的含义也变成了 Anything to PostScript。
尽管名为格式转换程序,但它实际的功能却是打印。它的默认输出不是标准输出,而是系统的默认打印机。程序的默认行为被称为“漂亮的打印机”,这意味着它可以改善输出的外观。
1.5 监视和控制打印任务
lpstat
——显示打印系统状态
lpq
——显示打印机队列状态
使用 lpq 程序可以查看打印机队列的状态,从中我们可以看到队列的状态和所包含的打印任务。
lprm
和 cancel
——取消打印任务
CUPS 提供两个程序来从打印队列中终止并移除打印任务。一个是 Berkeley 风格的(lprm),另一个是 System V 的(cancel)。在支持的选项上两者有较小的区别但是功能却几乎相同。