The Linux Printing Usage HOWTO 作者:Mark Komarinski <markk@auratek.com> 译者:赵平望 <tchao@worldnet.att.net> v1.2.2, 6 February 1998 翻译日期:2000年1月10日 说明如何使用 Linux 操作系统提供的打印机系统。 导言

HOWTOs!printing usage printing!user-level introduction 这份文件说明如何使用 Linux 操作系统提供的打印机假脱机系统,它也对专门讨论 Linux 打印系统的安装和设置的 Linux Printing Setup HOWTO 作了补充,其内容不仅适用于 Linux 操作系统,也同样适用于各种 BSD 操作系统。 Linux Printing HOWTO 文件的演变

Mark Komarinski <markk@auratek.com> 指出:

非常感谢 Matt Foster 重写这份 HOWTO。我尽量保留他的内容,并作出必要的增删润饰。

Matt Foster <mwf@engr.uark.edu> 指出:

这份 Linux Printing HOWTO 完全改写了Grant Taylor <grant@god.tufts.edu> 和 Brian McCauley <B.A.McCauley@bham.ac.uk> 的原文。本来我打算保留 Grant 和 Brian 原来 HOWTO 中的材料,但後来几乎全部改写并增加了许多新材料。我认为这份 HOWTO 中的材料比较完整, 也比较容易阅读。我希望您同意我的看法。 版本演变

v1.2.2 重新编序和作出一些改动以便编为 RedHat 文件。 v1.2.1 增订内容和作出一些改动以便用于 Linux 出版物。 v1.2 视窗打印机。 改变打印文档的最大长度。 v1.11 新管理员。 增加 lpc 的资料。 增加一些查错资料。 开始编写打印图像的文档。 v1.1 修正一些用语。 编写 PostScript 打印部分。 设法进一步说明一些实例。 详述一些 Linux 打印工具。 v1.0 Printing Usage HOWTO 首次公开发行 版权和商标

这份文件中提到的有些名字是某些人的版权和(或)商标名称。这些名字在这份 HOWTO 中以全名或缩称出现。

(c) 1995 Matt Foster (mwf@engr.uark.edu) (c) 1996-1997 Mark F. Komarinski (markk@auratek.com)

任何涉及 Linux HOWTO 的翻译和作述均需载列这份版权说明。 换言之,如在此种作述中限制他人引用与 HOWTO 有关的内容就不得引用这份 HOWTO。在某些情况下, 可以有例外情况,但需与下址 Linux HOWTO 协调员联系。

简言之,即使这份文件尽量四处流通,但HOWTO 文件的版权还得保留,同时希望知道这份 HOWTO 文件的 流通情况。

任何问题均请与 Linux HOWTO 协调员 Tim Bynum 联系。他的地址是 <linux-howto@sunsite.unc.edu>。不妨从他的地址查询电话号码和其他联系资料。 下载 Linux Printing HOWTO

printing!downloading HOWTOs 如欲打印这份 HOWTO 文件,不妨下载这份 HOWTO 的 PostScript 版本,其编排格式更适於阅读。这份文件的 PostScript 版本可从许多 Linux 网站取得(例如 sunsite 网站 )。 反馈意见

欢迎对本文提出建议和批评,来信请寄 <markk@auratek.com>。 致谢

非常感谢对本文初版提出许多宝贵意见的朋友 --- 有些建议已经列入本文。

我也要感谢最初改写本文的 Matt Foster 先生。 在 Linux 系统内打印文档

本节说明在 Linux 环境中如何打印文件、检查列印队列、从列印队列删除打印任务、 打印前文档排版和设置打印环境等。 Linux 打印系统的演变

printing!history of Linux 打印系统 - lp 系统 - 是将加利福尼亚大学校方为 UNIX 操作系统的 BSD 版编写的源代码改编而成。 利用 lpr 打印文档

printing!using lpr command lpr command!usage example 到目前为止,在 Linux 系统中打印文档的最简单方法就是将文档直接送到打印设备打印。使用 cat 指令就是方法之一。作为 root,发送下列指令就可打印文档: # cat thesis.txt > /dev/lp 在这个例子中,/dev/lp 是实际打印设备的符号连接 - 不论打印机是点阵列印机、激光打印机、 排版打印机或图表打印机均可使用这个指令。(关於符号连接的进一步说明见 ln(1))

由于安全上的考量,只有 root 和属於打印监控程式的同一群组的使用者才可书写到打印机, 使打印机进行打印。这就是必需使用 lprlprmlpq 等指令才能使用打印机的理由。

因此,使用者必需使用 lpr 列印文档。lpr 为打印进行所有初始设定, 然後将任务交给打印监控程序 - lpd。这个打印监控程序随即告知打印机如何打印文档。

lpr 执行过程中,它首先将有待打印的文档抄到一个目录(假脱机目录), 然後让该文档留在该目录中等待 lpd 进行打印。一旦 lpd 得知有文档等待打印, 它就自行生成一个备份(编程员称为派生(forking))。这个派生的 lpd 监控程序就会打印有待打印的文档, 同时原 lpd 仍继续等待後面可能发出的打印指令。通过这种方式,Linux 系统可同时处理列队打印任务。

使用 lpr(1) 指令的语法如下: $ lpr [ options ] [ filename ... ] # # (译注:$ lpr [ 选项 ] [ 文档名 ... ]) # 如果 filename (译注:文档名)没有标示,lpr 认为将由标准输入口(通常为键盘或另一程式的输出)提供输入。通过这种方法, 使用者可将一个程式的输出导入打印假脱机程序。例如, $ cat thesis.txt | lpr $ pr -l60 thesis.txt | lpr 均把运行的结果导入打印机印出。 lpr 指令还接受各种打印选项参数,使使用者能控制打印方式。最常用的选项参数有: -lpr 的例子如下: $ lpr -#2 -sP dj thesis.txt 这个指令会在假脱机目录内为称为 dj 的打印机建立一个连接 thesis.txt 文档的符号连接,然後由 lpd 对其进行打印。印完之後,它还会再打印一次 thesis.txt (译注:共印两份)。

关於 lpr 使用的所有选项参数,见 lpr(1)。 利用 lpq 察看打印队列

printing!using lpq command lpq command!usage example 使用 lpq 指令可察看当前的打印队列。如直接使用指令,不加选项参数, 可察看默认打印机的打印队列情况。

lpq 的结果有许多用途。 $ lpq lp is ready and printing (译注:打印机准备打印,下面列出打印信息) Rank Owner Job Files Total Size active mwf 31 thesis.txt 682048 bytes 利用 lprm 取消打印任务

printing!using lprm command lprm command!usage example 对任何一个打印系统而言,都需要有一个取消打印任务的工具软件。在 Linux 系统中,可用 lprm $ lprm - 上述指令取消使用者发出的所有打印指令。如果只要取消一个打印任务,可用 lpq 查明打印任务编号,然後将该编号作为参数用于 lprm 指令。例如: $ lprm 31 取消默认打印机第 31 号打印任务 (thesis.txt)。 利用 lpc 控制 lpd 程序

printing!using lpc command lpc command!usage example lpc(8) 程式用来控制 lpd 提供打印的打印机。通过 lpc 程式可控制打印机的打印功能、 打印任务列队、重新安排列队次序和提供打印机和列队状况。 lpc 多数用于设置系统时一机配置多打印机的情况。 $ lpc 上述指令启动 lpc 程式。在不设置任何参数的情况下,这使用户进入互动模式,此後可开始输入指令。 使用 lpc 的另一个方式是从指令行输入参数。 $ lpc status all 所有可用的指令均在 lpd 的使用说明(man page)内可以查到。此处列出一些主要指令。指令中作为 选项 列出的部分可以是打印机名(lp、print 等)或关键字 all,此处表示所有打印机。 disable 选项 - 不让打印机再接受新的打印任务 down 选项 - 停止打印机的一切打印 enable 选项 - 允许打印任务进入打印列队 quit (或 exit) - 停止 lpc 运行 restart 选项 - 重新开始打印机的 lpd status 选项 - 印出打印机的机况 up 选项 - 重新起始并开始新的 lpd RedHat 的打印工具(printtool)

printing!using Red Hat printool Red Hat Linux!printool printool utility RedHat 的 printtool 是一个非常好用的工具。它几乎无所不能。下文说明如何通过 RedHat 4.0 在并联埠接连 HP LJ 4L 的方法(此法也可用于其他 RedHat 版本)。 以 root 身份登录,并启动 printtool (如果作为 su ,还记得 SETENV DISPLAY :0.0 和 xhost + 吗?) 按 "Add",然後在本地打印机项按 "OK" 填入打印机名称 (如 /dev/lp1) 填入参数 - 选择打印机种类、分辨率和纸张大小 (ljet4、300x300 和 信纸尺寸) 按 "OK" 一直到底,重新启动 lpd。 利用这种方法可为一台打印机设定多种打印方式,例如为各种打印设定不同的纸张尺寸、分辨率等。 打印文档

printing!by file type 本节说明在 Linux 设定中设定打印的文档类别。 打印图像档

printing!graphics files 用打印机打印图像档通常取决于图像转换的类别和用何种打印机打印。点阵打印机一般不适合打印图像, 因为点阵打印机无法适当处理图案。在这种情况下,如果打印机是是类似Epson 或IBM ProPrinter 的打印机,则可将图像转换成 PostScript 格式,然後利用 Ghostscript (见下节)打印图像。

如果接连的打印机是激光打印机,打印图像就比较简单,因为多数激光打印机都于 PCL 兼容。 如果不兼容,也可利用 NetPBM 等软件将图像转换成 PCL 格式。 最後一种办法就是使用 Ghostscript (见下节)。

打印图像的最好办法是安装 NetPBM 和 Ghostscript 等软件,然後安装 magic filter 自动处理图像档。 打印 PostScript 档

printing!Postscript files Postscript!printing 在有 PostScript 识别软件的打印机上打印 PostScript 档是件简单不过的事; 只需使用 lpr 指令,其他打印工作都会由打印机自动处理。如果打印机不具备处理 PostScript 的能力,那就得另想办法。幸好有软件可了解 PostScript 的打印需求,使多数打印机都能使用。 在这方面,最常用的软件可能就是 Ghostscript。

Ghostscript 的任务就是将 PostScript 档中的所有排版指令转换成打印机能够执行的指令。 利用 Ghostscript 打印 PostScript 档,可能需要利用下列指令: $ gs -dSAFER -dNOPAUSE -sDEVICE=deskjet -sOutputFile=\|lpr thesis.ps 注意上例中事实上利用导入( pipe )的方式将 Ghostscript 的转换结果利用 -lpr 打印。 利用 Ghostview 工具可在打印之前查看 X 视窗系统中利用 Ghostscript 打印 PostScript 档的情况。 Ghostview 和Ghostscript 可从网址 下载。 打印 PDF 档

printing!PDF files printing!Acrobat files PDF files!printing Acrobat files!printing Adobe 公司为 Linux 系统编制了 Acrobat 阅读器。这个阅读器可从 Adobe 公司主页 下载。同时也可使用这个阅读器的前一版本 xpdf。 这两个打印软件均可用于 postscript 打印机。 打印 TeX 档

printing!TeX files TeX files!printing 打印 TeX 档的最简便方法是将其转换成 PostScript 格式,然後用 Ghostscript 打印。 要利用这种方法打印,首先得将文档转换成一种称为 DVI (device-independent 的缩称)的格式。 这可利用 tex(1) 指令完成。然後利用 dvips 指令将 DVI 档转换成 PostScript 档。 指令的使用方式如下: $ tex thesis.tex $ dvips thesis.dvi 然後就可利用前面提到的指令打印最後生成的 PostScript 档。 打印 troff 格式的文档

printing!troff files troff files!printing $ groff -Tascii thesis.tr | lpr 或可用下列方式: $ groff thesis.tr > thesis.ps 然後利用上述指令打印生成的 PostScript 档。 打印 man 说明页

printing!man pages man pages!printing $ man man | col -b | lpr man 说明页都使用 troff 的格式,因此在打印时得首先删除粗体、底线等格式。 “col”软件可以完成这项工作,由于 pipe 生成的结果,因此不可用 more 指令。 杂项

此处讨论在他处没有论及的问题。 打印前排版

printing!formatting files before 由于多数纯文本格式的文档在打印时都没有排版格式,因此最好在打印前先行排版, 其中包括每页加附标题和页码、设定页边距、双倍行距、缩进和多栏排版等。 完成这项工作的一般方法是使用 pr 软件。 $ pr +4 -d -h"Ph.D. Thesis, 2nd Draft" -l60 thesis.txt | lpr 在上例中,pr 对预备打印的 thesis.txt 进行下列工作: 三页空白页(+4)、每页打印 60 行(-l60)、双倍行距(-d)并在每页顶端加印(-h) “Ph.D. Thesis, 2nd Draft”(译注:博士论文,第 2 稿)。lpr 将打印 pr 生成的文本。 pr 的用法可参阅联机说明。 打印机的环境参数

printing!PRINTER environment variable PRINTER environment variable 所有 Linux 打印系统的指令均接受 - 为了避免每次设定打印机,可事先设定打印机参数。每种系统使用的方法不同,以 bash 为例,可用下列指令: $ PRINTER="printer_name(译注:打印机名称)"; export PRINTER csh 中可用: % setenv PRINTER "printer_name(译注:打印机名称)" 这种指令可列入登录指令(bash 使用.profile;csh 使用.cshrc ) 或作为单独指令使用。(关於环境参数的进一步资料见 bash(1) 和 csh(1)) 常见问题 printing!frequently asked questions printing!FAQ FAQ!printing usage

Q1. 打印时如何消除“台阶”现象? printing!staircase effect

A1. 有些打印机得每行给结束符,否则就会出现打印的台阶现象。 打印机预期的结束符是回车/新行符(DOS 系统),而 UNIX 系统在结束一行时只加一个新行符。 解决这个问题的最简便办法是检查是否可用某种开关控制打印机,使其能在这两种打印之间转换, 有时可用一个 DIP 开关,或可在打印前先发送一个换码信号。如要采用第二种办法, 得先设立一个过滤器(见 Q2)。 最快的解决办法是在指令行使用过滤器。例如: $ cat thesis.txt | todos | lpr

Q2. 什麽是过滤器? printing!filter

A2. 过滤器是一套软件,它可从标准输入(stdin)读入资料,然後对读入的资料进行动作, 再以标准输出(stdout)写出。过滤器的用处□多,包括可用于文本处理。

Q3. 什麽是魔术过滤器(magic filter)? printing!magic filter

A3. 魔术过滤器是一种根据文档的种类采取行动的过滤器。例如,如果文档是没有排版格式的文本文档时, 则利用一般打印方式打印。如果文档是 PostScript 文档或其他格式文档,则用其他方式打印 ( ghostscript )。常用的魔术过滤器有 magicfilter 和 APSfilter。使用这类过滤器的一项要点是在安装过滤器之前必需先安装应用软件。

需要注意这项要点的理由是在安装 magicfilter 时,这个魔术过滤器会查询系统中装有何种打印程序 (例如 ghostscript,如果找到 ghostscript,则 magicfilter 就知道它能处理 PostScript 格式的文档),然後根据找到的打印程序作出相应的设定。如果系统要处理所有打印文档, 可能至少得安装下列程序: GhostScript TeX NetPBM jpeg utilities (译注:jpeg 工具软件) gzip

Q4. 何谓 Windows 打印系统(WPS)?Linux 能用这个打印系统吗? printing!Windows Printing System (WPS)

A4. 也许。只接受 WPS 指令的打印机无法用于 Linux 系统。接受 WPS 指令和其他打印指令的打印机 (如 Canon BJC 610 打印机)就可使用,只要将其设置成 WPS 格式以外的格式即可。其他打印机, 例如有些 HP DeskJet 820Cxi/Cse 打印机就*无法*用于 Linux。不过,尽管如此, Linux 可作为 Win95 机器的打印伺服器(见 Samba),因为 Win95 有这些打印机的驱动程序。

Q5. 这个系统怎麽这麽烂?只能打印 6 页,超过 6 页就显示“file too large (文档太长)”。 printing!file too large error

A5. 在 /etc/printcap 档中有一个参数与打印的文档长度有关。默认值是 1000 盘区(约 500 k)。 对 PostScript 这类文档而言,这大约是 7-8 页左右的长度。因此务必在打印机的设定中加入下列内容: mx=0 附加这个指令的主要原因是不使用假脱机。另一个完成这项工作的方法是用 lpr 在假脱机目录内对打印的文档生成软连接。务必记得每次均需在 lpr 指令中使用 -s 选项。

排除故障

printing!troubleshooting 本节说明在打印时最可能出错的问题。

如果打印机不打印: 打印其他文档吗? (应用软件的问题?) lpd 正在运行吗? (利用 lpc 进行检查) (打印控制程序有问题吗?) root 能直接发送指令给打印机吗? (打印服务有问题吗?) 能从 DOS 打印吗? (联线/打印机有问题吗?) 这些问题有助于找出打印故障的原因。 如有其他这方面的建议请寄 <markk@auratek.com>。 参考材料

printing!reference material 本节载列 Linux 打印系统的参考材料。我已尽力罗列与这份 HOWTO 有关的参考材料。 如发觉仍有重大遗漏,请与我随时联络。

在 USENET 上提问时,考虑下列问题: 打印机是否接受打印任务? (利用 lpc(8) 查核) 您的问题是否已在这份 HOWTO 或 Grant Taylor 编写的 Printing HOWTO 中提供了解决办法?

如果上述问题已有答案,那就最好不要在网上提问。如果仍要提问,应该列入与问题有关的资料。 如果提出“我的 lpr 有问题,请帮忙”这类问题,可能没人会理会。最好还要列入内核版本、 不打印的情况是如何发生的和尽可能提供系统显示的具体错误信息。 联机使用说明 printing!related man pages cat(1) 连接和打印文档 dvips(1) TeX DVI 文档转换成 PostScript 格式 ghostview(1) 利用 Ghostscript 查看 PostScript 文件 groff(1) groff 文件格式系统的前端处理软件 gs(1) Ghostscript 翻译器/阅读器 lpc(8) 列印打印机的控制程式 lpd(8) 列印打印机的假脱机监控程序 lpq(1) 假脱机列队检视程序 lpr(1) 脱机打印程序 lprm(1) 从列印打印机的假脱机列队删除打印任务 pr(1) 转换文本文件以便打印 tex(1) 文本排版和制版

USENET 新闻组 printing!relates newsgroups comp.os.linux.* 各式各样有关 Linux 系统的资料 comp.unix.* 与 UNIX 系统有关的讨论