The Linux Printing HOWTO 中文版 作者 : Grant Taylor [1] 译者 : 任恒宇 [2] v3.29, 9 March 1999 翻译日期 : 15 六月 1999 _________________________________________________________________ 这一篇是 Linux Printing HOWTO 的中译本, 内容包括了如何在 Linux 之下产 生, 预览,列印及传真任何文件的相关资讯 (基本上亦可适用於其他的 Unices). _________________________________________________________________ 1. 简介 * 1.1 历史 * 1.2 版权声明 2. 如何列印 3. 核心印表机装置 * 3.1 lp 装置 (核心版本 <=2.1.32) * 3.2 parport 装置 (核心版本 >= 2.1.33) * 3.3 序列装置(Serial devices) 4. 支援的印表机 * 4.1 Postscript * 4.2 Non-PostScript * 4.3 那些印表机可以用? 5. 印表连线作业软体(spooling software) 呢? 6. 基本运作方式 7. 基本系统设定 * 7.1 传统的 lpd 设定 * 7.2 档案权限 8. 取得列印软体 9. 厂商的解决方案 * 9.1 Red Hat * 9.2 Debian * 9.3 其它的发行版本(Other Distributions) 10. Ghostscript. * 10.1 启动 ghostscript * 10.2 调整 ghostscript 的输出结果 11. 如何列印到网路印表机 * 11.1 列印至 Unix/lpd * 11.2 列印到 Win95, WinNT, LanManager, 或 Samba 上的印表机 * 11.3 列印到 NetWare 上的印表机 * 11.4 列印到 EtherTalk (Apple) 上的印表机 * 11.5 列印到 HP 或其它的以太网路(ethernet) 印表机 * 11.6 替远端印表机执行 if * 11.7 从 Windows 列印 * 11.8 从 Apple 列印 * 11.9 从 Netware 列印 12. Windows 专用印表机 * 12.1 Ghostscript Windows 导向器(redirector) * 12.2 pbm2ppa 程式 * 12.3 pbm2l7k 程式 13. 如何列印到传真机 * 13.1 使用传真数据机(faxmodem) * 13.2 使用远端列印服务 14. 如何产生值得列印的东西 * 14.1 标示语言(Markup languages) * 14.2 所见即所得(WYSIWYG) 的文书处理器 15. 在萤幕上预览可列印的东西 * 15.1 PostScript * 15.2 TeX dvi * 15.3 Adobe PDF 16. 在 lpd 下使用序列式印表机 * 16.1 设定 printcap * 16.2 会掉字的旧型序列式印表机 17. 感谢 _________________________________________________________________ 1. 简介 这份 Printing HOWTO 应该包括了能帮助你在 Linux 平台上架设列印服务的所有 讯息. 这不像在 Microsoft 或 Apple 环境下用滑鼠点选那麽容易, 但一定比管 理一个大型的区域网路来得轻松. 这份文件的编排方式是希望能让大部份的使用者只须阅读前半段. 较难理解的个 案情况则摆在後半段, 而且你可以很容易地从目录中找到. 所以大部份人可能只 须看到第九或十节就可以了. 因为 3.x 版的文件重新写过, 前面版本中的许多内容已经拿掉了. 这是故意的, 因为前版的 HOWTOs 长达 60 多页, 而且编排方式并不是很理想. 如果你在这份 文件中找不到所需的答案, 你可以 a) 参阅位於 [3]Printing HOWTO Home Page 的旧版文件. 也可以 b) 告诉我缺少了什麽部份. 你可以在 [4]Printing HOWTO Home Page 找到这份文件的最新版本; 当然你也可 以在 Metalab (metalab.unc.edu) 和附近的 LDP mirror 站找到. 1.1 历史 这是第三代的 Printing HOWTO, 也就是第三次的完全改版, 以年份来看: 1. 我在 1992 年因为看到在 comp.os.linux 有很多关於列印的问题, 便写下并 发表了 printing-howto. 比 HOWTO 计画还早几个月, 同时也是第一份称为 `howto' 的常见问答集. 这一版是纯文字格式. 2. 加入了 HOWTO 计画後, Printing-HOWTO 和由 Brian McCauley 所写的 Lpd FAQ 合并; 我们继续合写 PHT 差 不多两年. 有些地方则纳入了 Karl Auer 的作 品. 这一版的 PHT 是以 TeXinfo 写成, 也提供了 PS, HTML, Ascii 和 Info 的版本. 3. 在 PHT 经过一年多的时间逐渐成熟以及一次尝试移转给别人维护的失败经验 後, 产生了这份重新改版. 这一版的 PHT 是用 LinuxDoc DTD 和 SGML-Tools-1 套件以 SGML 所写成的. 从 3.27 版开始, 纳入了一份支援印 表机资料库的摘要; 在 3.27 版之前, 这份 HOWTO 中从来没有一份相容印表 机清单 (!). 1.2 版权声明 这份文件的版权 (c) 1992-1999 为 Grant Taylor 所有. 你可以依照 GNU General Public License, revision 2 或之後版本中的条款自由地复制与散布. This document is Copyright (c) 1992-1999 by Grant Taylor. Feel free to copy and redistribute this document according to the terms of the GNU General Public License, revision 2 or later. 2. 如何列印 如果你或你的系统管理者或厂商已经设定好 lpd 的话, 你所需要做的便只是学习 如何使用 lpr 指令而已. [5]Printing Usage HOWTO 包含了这部份的资讯, 还有 一些你可能应该要知道的列印伫列处理指令. 如果你有一个全新系统或者新的印表机, 那你就必须在开始列印前先设定好列印 服务. 如果是这样, 请继续看下去! 3. 核心印表机装置 平行埠有两种完全不同的装置驱动程式; 你的核心版本决定了你用的是那一种. 驱动程式是在 Linux 2.1.33 版所做的改变. 两种驱动程式的型态仅在很少的一些细节上相同. 最值得注意的是, 许多人发现 Linux 不会侦测他们的平行埠除非他们在 PC BIOS 的设定中把 "Plug and Play" 关掉. (这一点也不令人惊讶; 过去的记录显示在 Windows 和其它地方对 非 PCI 装置的 PnP 已经成了某种灾难). 3.1 lp 装置 (核心版本 <=2.1.32) 假如你已经编译或载入了 lp 装置(如果载入了的话, cat /proc/devices 的结果 应该会看到 lp), Linux 核心 (<=2.1.32) 会提供一个或多个的 /dev/lp0, /dev/lp1, /dev/lp2 装置档案. 这些档案不是随意指定的, 相反的, 每一个档案 皆对应到一个特定的 I/O 位址. 这表示你的第一部印表机可能是 lp0 或 lp1, 完全视你的硬体情况而定. 两个都试试看吧! 有些使用者提到如果使用较旧的单向印表机连接线, 就无法侦测到他们的双向印 表机连接埠. 确定你使用了正确的连接线. 一个印表机埠不能同时载入 plip 和 lp 的驱动程式, 如果你用的是 2.x 或是 1.3.x 版以後的核心, 你可以用手动或核心的方式选择载入不同的驱动程式. 只 要小心的设定中断等设定, 你应该可以在一个埠上执行 plip, 而在另一个埠上载 入 lp 的驱动程式. 曾经有人修改驱动程式而成功; 我希望能早日听到有人以一 个简单的指令完成相同的事情. 有一个小程式 [6]tunelp, 如果你是 root, 可以用来设定 Linux 2.0 lp 装置使 用的中断 (interrupt), 轮询速率(polling rate) 和其它的项目. 若是核心编译时包括了 lp 驱动程式, 核心接受 lp= 参数设定中断及 IO 位址: 若将 lp 驱动程式编译入核心, 你可以用 LILO/LOADLIN 的命令列来指定使用的 IO 位址及中断. 语法: lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]] □例: lp=0x378,0 或 lp=0x278,5,0x378,7 ** 要注意的是假如你使用这个功能, 你必须指定 *所有* 要用的印表机埠, 系统不提供预设值. 你可以用 lp=0 来停用内建的驱动程式. 若是以载入模组的方式执行, 可以在 insmod 指令的命令列(或是在 /etc/conf.modules 来模拟核心模式) 以平常模组参数的语法来指定 IO 位址和 中断. 参数为 io=port0,port1,port2 和 irq=irq0,irq1,irq2. 请参考 [7]insmod 的线上手□以取得更进一步的资讯. **给那些当需要时却总是找不到标准印表机埠位址的人, 位址便如同第二个□例 中所示, 另一个印表机埠 (lp0) 则在 0x3bc. 我不知道一般所用的中断是那一 个. Linux 2.0 并列埠驱动程式的原始码在 /usr/src/linux/drivers/char/lp.c. 3.2 parport 装置 (核心版本 >= 2.1.33) 从 2.1.33 版本後的核心(2.0.30 版核心可取得修正档), lp 装置成为新增加的 parport 装置的客户端. 增加 parport 装置解决了许多困扰旧有 lp 装置驱动程 式的问题 - 像是可以和其它的驱动程式共用一个连接埠, 可以动态指定可用的并 列埠而不须将装置档对应到固定的 I/O 位址等等. parport 装置的出现使得很多新的并列埠设备, 像是 Zip 磁碟机, 可携式 CD-ROM 和磁碟机等等, 的驱动程式得以出现. 其中一些也有提供 2.0 核心可用 的版本, 到网路上找找看吧. 你会注意到的主要差异, 以目前列印来看, 是基於 parport 的核心会动态地指定 lp 装置给平行埠. 所以在 Linux 2.0 中的 lp1 在 Linux 2.2 中可能是 lp0. 如果你从使用 lp 驱动程式的核心升级到使用 parport 驱动程式的核心, 记得检 查这一点. 当我使用了 parport 驱动程式後, 我会更完整地探讨它. 目前你可以看一下核心 原始档中的 [8]Documentation/parport.txt. 或者你也可以到 [9]parport web site 看看. 3.3 序列装置(Serial devices) 序列装置在 Linux 中通常有个像 /dev/ttyS1 这类的名称. [10]stty 这个工具 程式可以让你查看及设定序列埠. [11]setserial 可以让你调整更多的属性及设 定使用非标准的 IRQ 及 I/O 位址的序列埠. [12]Serial-HOWTO 会对 Linux 下 的序列埠做更进一步的探讨. 如果你使用的是有流量控制的慢速序列印表机, 可能会发现有些报表被截断. 这 是因为系统预定在程式关闭序列埠 30 秒後, 所有在缓冲区内尚未传送的字元都 会被清除. 缓冲区内可容纳最多 4096 个字元, 假使你的印表机使用流量控制, 而且慢到无法在程式关闭序列埠後 30 秒内印出缓冲区内的所有字元, 那麽缓冲 区内最後的内容就会遗失. 如果 cat file > /dev/ttyS2 这个指令可以完整印出 较小的档案, 但会截断较长的档案时, 你可能就是遇到了这种情况. 30 秒的周期可以用 setserial (2.12 及以後的版本) 指令的 "closing_wait" 选项来调整. 一台机器通常是在 rc.serial 开机档中呼叫 setserial 来初始化 序列埠. 可以在这修改连接印表机的序列埠的 closing_wait 选项. 4. 支援的印表机 Linux 核心大致上支援所有能够接到序列或并列埠的印表机, 但还是有些要注意 的事项, 和一些虽然能与 Linux 沟通(就电子讯号而言) 却无法使用的印表机. 与 Linux 不相容的主要是那些被称为 "Windows" 或是 "GDI" 印表机的机种. 它 们之所以会被这样称呼是因为部份, 甚至全部的印表机控制语言和列印机制的设 计细节都缺乏说明文件. 通常这种厂商会提供 Windows 的驱动程式, 而且也很满 足於只卖给 Windows 的使用者; 这就是为什麽它们被称为 Winprinters. 某些时 候厂商也会提供 NT, OS/2 或其它作业系统的驱动程式. 许多这种印表机在 Linux 下不能用. 有少部份的可以, 也有一些只有部份功能可 用 (通常是由於有人针对写驱动程式所需的细节进行反向工程). 请参阅後面的印 表机支援清单取得特定机种的资讯. 有少数的印表机是介於中间的. 举例来说, 有些 NEC 的机种使用标准印表机语言 PCL 中较简单的功能, 让懂 PCL 的软体可以达到列印 300 dpi 的水准, 而只有 NEC 才知道如何让这些印表机发挥 600 dpi 的列印能力. 万一你已经有这种印表机, 仍然有变通之道, 只不过相当的笨拙, 所以我绝对不 会使用这种方式. 想更深入的□解 Windows-only 印表机请看第 12 节 4.1 Postscript 那些印表机一定可以用呢? 最好的选择就是买具备 PostScript 支援的印表机. 几乎所有的 Unix 软体都以 PostScript 来产生报表, 所以很明显的, 如果能有 一部直接支援 PostScript 的印表机的话是再好不过了! 不幸的是除了雷射印表 机外, 其它种类的印表机几乎都不支援 PostScript, 要不然就是相当昂贵的选购 配备. Unix 下的软体和一般印刷业之所以选择 PostScript 做为印表机控制语言的标准 是有原因的: 时机 PostScript 首次出现在 Apple Laserwriter 印表机中, Laserwriter 是 Macintosh 的一个完美搭挡, 而 Macintosh 系统则是导致 80 年代桌上 排版革命的主要原因. 它与装置无关(device-independant) PostScript 程式可以在画素萤幕, 向量萤幕, 传真机, 或是几乎任何一 种列印机制产生输出结果, 而不需要改变原来的程式. PostScript 在任 何 PostScript 装置下所产生的输出结果看起来都一样, 至少在装置的能 力限制之内是如此. 在 PDF 出现之前, 人们是以 PostScript 格式在线 上交换复杂的文件. 而这个标准没能全面成功的惟一原因就在於 Windows 机器上通常并没有安装 POstScript 预览器, 於是 Adobe 指定 了 PostScript 中的超连结(hyperlinks) 和压缩法(compression), 把结 果称之为 PDF, 并分送它的预览器, 也替他们的文件产生工具 (ghostscript 的 ps2pdf 和 pdf2ps 两个程式也提供了这些功能) 开发 出一个新的市场. 它是一个真正的程式语言 PostScript 是一个完整的程式语言; 你可以用它撰写软体来做大部份的 事情. 这让你可以在程式的开头定义副常式, 当你需要在文件中重复做些 复杂效果的时候, 像是在背景中放上商标图案或是一个大大的 "DRAFT" 字样的时候, 这个特点便很有用了. 它是开放的标准 PostScript 的完整规格都在一系列人人都可取得的书中 (你可以在随便 一家好的书店中找到). 虽然 Adobe 发明了它而且提供了主要的商业实 作, 其它的厂商像是 Aladdin 也可以做出自己独立开发的实作. 4.2 Non-PostScript 如果预算不允许买一部 PostScript 印表机, 你可以买任何 Ghostscript 支援的 印表机. GhostScript 是一个免费的 PostScript 解译器, 可以用来模拟实际的 印表机支援. [13]Ghostscript 的首页 中有支援的印表机清单, 以及新的和开发 中的驱动程式的最新消息. 注意一点就是这个网页列出的是最新版的 Ghostscript 所支援的印表机, 而大部份的 Linux 发行套件因为版权的关系只能 出货较旧的 Ghostscript 版本. 幸运的是在每一个发行套件的捐赠区(contrib area) 中通常都有先包装好的目前版本. 请你将成功或失败的经验如同网页中所 要求的告诉他们以帮忙改进这个网页. Adobe 公司有一种新的印表机语言叫做 "PrintGear". 我想它是具有 PostScript 观念但与其不相容的一种大幅简化的二进位语言. 而我也没听说 ghostscript 支援它. 但是有些 PrintGear 印表机似乎也支援其它语言如 PCL , 而这种印表机便可以在 Linux 下使用 (假如 PCL 是在印表机中实作而不是在 Windows 驱动程式中). 4.3 那些印表机可以用? 如果你打算买一部印表机, 你可以到一些地方去看看它是否被支援. 共同合作维 护的 Printing HOWTO 印表机 [14]资料库 就是希望能提供一个简单易懂的 Linux 印表机支援状态的列表. 简单地将之摘要如後; 切记到线上查询更多的细 节以及该使用那个驱动程式的资料. Ghostscript 的 [15]相容印表机网页 列出了一些支援的印表机, 同时也连结到 其它的网页. 另外 Dejanews 也有数百个"能用"和"不能用"的回报. 试试这三个 地方, 在你完成以後, 请确认在 [16]资料库 中有你印表机的正确资料, 以便以 後这份文件可以正确地列出你的印表机. 印表机相容性列表 这一节是线上版本的摘要. 线上版本包含了基本规格, 注意事项, 到驱动程式资 讯的连结, 使用者维护的文件, 制造商的网页, 诸如此类的资料. 这个列表的线 上版本还是互动式的; 人们可以随时增加印表机, 所以记得去查一下. 最後, 如 果你的印表机没有被列出来, 请把它加进去. 这□把印表机分为四类: 完美 这一类的印表机工作起来完美极了 - 你可以用到印表机所有的功能, 包 括颜色, 所有的解析度, 等等. 在少数的情况下, 印表机具有未公开的" 解析度加强"模式, 若是这种模式无法使用, 我们仍将它列为完美; 通常 这种列印品质的差别不大, 所以不需要担心. 良好 你可以列印, 各方面的情况都不错, 但是可能会有一些在列印或其它功能 上的小限制. 勉强 你可以列印, 但是没有办法做彩色列印或是只能用很差的解析度. 请参阅 线上列表的注意事项一栏以得知相关的限制. 悲惨 你根本没办法列印; 通常这是因为缺乏驱动程式, 而且/或者是缺乏如何 撰写驱动程式的文件 由於这儿的内容是由大家所提供的, 所以没法保证一定是正确的. 但是这应该很 容易由驱动程式网页和制造商的网站得到 corroborate. In all cases, since this information is provided by dozens of people, none of it is guaranteed to be correct. It should, however, be easy to corroborate from the driver web pages and manufacturer web sites. 废话不多说, 下面是印表机相容性列表: Brother 完美 HL-10V, HL-660, HL-720, HL-760. 良好 HL-1050. Canon 完美 BJ-10e, BJ-20, BJ-200, BJC-210, BJC-240, BJC-250, BJC-610, BJC-620, BJC-70, BJC-800, LBP-8II, LIPS-III. 良好 BJ-300, BJC-4000, BJC-4100, BJC-4200, BJC-4300, BJC-4400, BJC-7000, BJC-7004. 勉强 BJC-4550, MultiPASS C2500, MultiPASS C3500. 悲惨 BJC-5000, LBP-460, LBP-660. Epson 完美 ActionLaser 1100, LP 8000, LQ 850, Stylus Color, Stylus Color 400, Stylus Color 500, Stylus Color 600, Stylus Color 640, Stylus Color 850, Stylus Color II, Stylus Color IIs, Stylus Pro XL. 良好 Stylus Color 800, Stylus Photo 750. 勉强 Stylus Color 740. HP 完美 2000Cse, 2500C, DesignJet 650C, DeskJet 1200C, DeskJet 1600C, DeskJet 1600Cm, DeskJet 400, DeskJet 420C, DeskJet 500, DeskJet 550C, DeskJet 600, DeskJet 660Cse, DeskJet 690C, DeskJet 850C, DeskJet 855C, DeskJet 870, DeskJet 870Cxi, DeskJet 890, LaserJet 1100, LaserJet 2100, LaserJet 2100M, LaserJet 4000N, LaserJet 4L, LaserJet 5, LaserJet 5L, LaserJet 5MP, LaserJet 6L, LaserJet 6MP, LaserJet 8000, LaserJet 8100, Laserjet 5000, Mopier 320, PaintJet XL300. 良好 HP 660C. 勉强 DeskJet 1000C, DeskJet 670C, DeskJet 710, DeskJet 720C, DeskJet 722C, DeskJet 820C. 悲惨 LaserJet 3100. IBM 完美 Jetprinter 3852. Lexmark 完美 Optra Color 1200, Optra Color 1275, Optra Color 40, Optra Color 45, Optra E, Optra E+, Optra Ep, Optra S 1250. 勉强 1020 Business, 3000, 5700, 7000. 悲惨 1000, 1020, 1100, 2030, 2050, 2070, 5000, 7200, Winwriter 100, Winwriter 150c, Winwriter 200. Minolta 完美 PagePro 6, PagePro 8. NEC 完美 P2X. 勉强 SuperScript 100C, SuperScript 1260, SuperScript 150C, SuperScript 650C, SuperScript 750C, SuperScript 860, SuperScript 870. 悲惨 SuperScript 660i, SuperScript 660plus. Okidata 完美 OL 410e, OL 610e/PS, OL 810e/PS, Okipage 6e, Okipage 6ex, Okipage 8c. 良好 Okipage 4w. 悲惨 Okipage 8w, okijet 2010. Olivetti 完美 JP350S. Panasonic 完美 KX-P1123, KX-P4440, KX-P5400, KX-P8420, KX-P8475. 勉强 KX-P6500. 悲惨 KX-P6100, KX-P8410. QMS 完美 2425 Turbo EX. Ricoh 完美 4801, 6000. Xerox 完美 DocuPrint C55, DocuPrint N17, DocuPrint N32. 5. 印表连线作业软体(spooling software) 呢? 直到最近, Linux 的使用者的选择很简单 - 每个人跑的都是古老的从 BSD 的 Net-2 程式码移过来的 lpd. 即使在今天, 大部份厂商仍以这个软体出货. 但是 这个情况已经开始在改变. SVR4 一派的系统, 包括升阳的 Solaris 在内所附的 是个完全不同的印表机连线作业套件, 这个套件以 lpsched 为中心. 另外还有迹 象显示有些 Linux 厂商会改成提供新得多而且免费的 LPRng. LPRng 的程式码远 比旧有的 lpd 来的有规划, 在大量安装时(注: 超过一台印表机, 序列式印表 机, 或任何非 lpd 的网路印表机)也较为容易管理. 它甚至可以真的称得上安全 - 没有 SUID 的执行档, 还支援透过 PGP 或 Kerberos 做使用者验证. 虽然有这些新选择, 目前 lpd 对大部份的 Linux 使用者而言应该是足够了. 虽 然它不是最新潮的系统, 但只要设定好就没问题, 而且它广为人们所熟悉, 同时 很多的 Unix 书籍也提供了大量的说明文件. 如果你想知道更多有关 LPRng 的资讯, 请到 [17]LPRng 的网页. 在未来这份 HOWTO 中将会包含使用 LPRng 以及使用普通 lpd 的相关讯息. 6. 基本运作方式 为了让列印功能能够正常运作, 你需要了解 lpd 系统是如何运作的. Lpd 是 Line Printer Daemon 的缩写, 根据上下文指的可以是监控程式(the daemon) 本身或是执行印表机连线作业的全套程式. 包括了有: [18]lpd 印表机连线作业监控程式(The spooling daemon). 有一个负责控制所有 事情, 另外针对每一部列印中的印表机也会执行一份. [19]lpr 使用者的列印指令. Lpr 会联络 lpd 并将列印工作送进列印暂存器. [20]lpq 列出伫列中等待列印的工作. [21]lpc Lpd 系统控制指令. 你可以用 lpc 来控制伫列, 如停止, 开始, 调整顺 序等等. [22]lprm lprm 可以从伫列中移除一件列印工作. 那这一切是如何凑在一起的呢? 当系统开机时会执行 lpd. 它会检查 /etc/printcap 中有那些印表机要设立列印暂存器. 每当有使用者执行 lpr 时, lpr 会透过 /dev/printer 的插座(socket) 找到 lpd, 并将要列印的档案和一些 关於列印的人以及列印方法的资讯传送给 lpd. 然後 lpd 再将档案送到的适当印 表机. lp 系统设计的时候, 大部份的印表机都是列式印表机(line printer) - 也就是 说, 大部份的使用者是列印纯文字格式(plain ascii). 结果就是我们还得做一些 额外的命令稿处理(scripting) 才能使 lpd 适用於现今的列印工作, 通常是 PostScript, 或是文字格式, 或是 dvi, ... 7. 基本系统设定 7.1 传统的 lpd 设定 最基本的 lpd 设定只能让系统伫列档案然後列印, 而不管你的印表机能否认得这 些档案, 可能也无法让你产生吸引人的报表. 但无论如何, 这是跨向理解的第一 步. 所以让我们看下去. 基本上, 要增加一个列印伫列, 你必须在 /etc/printcap 中加一笔记录, 以及在 /var/spool/lpd 之下建立一个列印暂存器的工作目录(spool directory). /etc/printcap 中的记录看起来像这个样子: # LOCAL djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :sh: 这个例子定义了一个名为 lp, dj, 或是 deskjet 的列印暂存器, 暂存器的工作 目录在 /var/spool/lpd/dj, 没有单一工作大小的上限, 列印的装置是 /dev/lp0, 而且不会在每一个工作之前加上标题页 (有著列印人的姓名之类的资 料). 现在就去看看 [23]printcap. 的线上手□. 上面这个例子看起来非常简单, 但是有一个问题 - 除非 DeskJet 500 能看懂我 送出去的档案, 否则便会印出乱码. 举例来说, 假如送一个传统的 Unix 文字档 案给 deskjet 会导致新行字元(newline) 被逐字列印, 而得下面的结果: This is line one. This is line two. This is line three. 同样的, 列印一个 PostScript 档到这个列印暂存器会得到同样阶梯状的 PostScript 命令列表, 而不是我们需要的结果. 很显然我们还需要些什麽, 这就是 filtering 的目的. 看过 printcap 线上手□ 的比较细心的读者可能已经注意到 if 及 of 这两个属性. 其中的 if, input filter 就是我们现在所需要的. 假使我们写个短短的 shell script 叫 filter 使之在新行字元之前加上回车字 元(carriage return), 就可以消除阶梯状. 所以我们必须在前面的 printcap 的 记录中加上 if 这一行: lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :if=/var/spool/lpd/dj/filter:\ :sh: 这个短短的 filter script 可以是: #!perl # The above line should really have the whole path to perl # This script must be executable: chmod 755 filter while(){chop $_; print "$_\r\n";}; # You might also want to end with a form feed: print "\f"; 假如我们照上面的方法, 我们就会得到一个能正常印出普通 Unix 文字档的列印 暂存器. (还有其他四百万种更好的方法来写这个命令稿, 但是这个很适合举例, 你可以自己写一个更有效率的.) 剩下的唯一问题是只能印出纯文字档实在是不够好 - 如果能够印出 PostScript 或是其它格式化的或是图形输出就更棒了. 这可以做的到, 也很容易做到. 方法 就是延伸前面的 filter. 如果你写出一个能接受任意档案格式, 然後针对每种情 况都可以产生 DeskJet 所要的资料的 filter, 那你就有了一个智慧型的列印暂 存器. 这种 filter 称之为 magic filter. 你无需自己写一个, 除非你要印的东西很奇 怪. 网路上已经有很多写好的, APS Filter 就是非常棒的一个. 也说不定你的 Linux 发行版本(distribution) 已经包括了一个印表机设定工具使得这一切都很 容易. 7.2 档案权限 应大众要求, 我把我系统上一些相关档案的权限列出. 还有其它更好的设定方 法, 最好是只将执行档设为 SGID 而不要设为 SUID root, 但这是我系统预设的 设定, 而且运作正常.(老实说, 如果你的厂商连可以运作的 lpd 都无法提供, 你 就有苦头吃了.) -r-sr-sr-x 1 root lp /usr/bin/lpr* -r-sr-sr-x 1 root lp /usr/bin/lprm* -rwxr--r-- 1 root root /usr/sbin/lpd* -r-xr-sr-x 1 root lp /usr/sbin/lpc* drwxrwxr-x 4 root lp /var/spool/lpd/ drwxr-xr-x 2 root lp /var/spool/lpd/lp/ Lpd 目前必须以 root 身份执行才能连接到低号(连接埠号低於 1024)的 lp 服务 埠. 可能应该改成在连接後将使用者身份变成 lp 或其他身份, 但是我不认为现 在有这样做. 令人有些失望. 8. 取得列印软体 许多预先写好的 filter 套件 (以及其它与印表有关的软体) 在 [24]Metalab 都 有提供. 像是 psutils, a2ps, mpage, dvitodvi, flpr 等工具都可以在那儿找 得到. 有一阵子, 很多套件都想让设定印表机简单一点. 这些套件可能都还在, 但是其 中最新最好就属 Andreas Klemm 的 APS Filter 套件了. 这个套件提供了一个选 单式的 printcap 设定程式, 而且几乎可以处理任何你所能想到的输入格式. 假 使你的厂商并未提供一组好的印表机设定工具, 选 APS Filter 就对了. 9. 厂商的解决方案 理论上, 这一节是不完整的. 请别客气来告诉我你最喜好的发行版 本(distribution) 的相关细节. 9.1 Red Hat Red Hat 提供一个 GUI 界面的印表机管理程式 (在 control panel □), 可以让 你加上网路印表机或连接本地装置的印表机. 它让你选择 ghostscript 支援的印 表机种类和所使用的 Unix 装置档案, 然後会在 /etc/printcap 中设定列印伫 列, 再写入一个简短的利用 gs 和 [25]nenscript 以处理 PostScript 和 ascii 的 magic filter. 这个方法还不错, 对一般的情况而言, 也很容易设定. 但如果你的印表机不在 Red Hat 标准配备的 Ghostscript(GNU 版而不是 Aladdin, 支援的印表机种类较少) 支援之列就不太妙了. 假如你发现用 Red Hat 所附的软体无法正常列印的时候, 请参阅上面的印表机相容性列表 (或是到 [26]线上资料库). 如果 Red Hat 的工具不支援你的印表机的话, 你可能需要安 装免费版的 Aladdin Ghostscript, 如果你使用 apsfilter 套件可能会更好. apsfilter 套件能处理所有新近 Ghostscript 支援的印表机. 9.2 Debian Debian 让你选择普通 lpd 或 LPRng; LPRng 可能是比较好的选择. 我相信 Debian 也提供印表机设定工具的选择; apsfilter 5 或之後的版本应该是最适合 你的, 因为这一版增加了对 LPRng 和 Ghostscript 统一驱动程式(uniprint driver scheme) 的支援. 9.3 其它的发行版本(Other Distributions) 请将其它发行版本的处理方法的讯息寄给我! 10. Ghostscript. [27]Ghostscript 是个对 Linux 列印有著极大意义的程式. 大部份在 Unix 下列 印的程式都会产生 PostScript, 而印表机的 PostScript 处理能力通常是价值 100 美元的选购配备. 但是 ghostscript 却是免费的, 而且它能将 PostScript 转成你的印表机所用的语言. 当它和你的 lpd input filter 结合之後, 你就有 了一部虚拟的 PostScript 印表机, 而且能够大幅简化你的生活. Ghostscript 有两个版本. 商业版称为 Aladdin Ghostscript, 个人可以自由使 用, 但是不能随著商业用的 Linux 发行版本散布. Aladdin Ghostscript 通常比 免费的 ghostscript 领先一年左右; 举例来说, 它支援许多免费版尚未支援的彩 色喷墨机. 免费版的 ghostscript 为 GNU Ghostscript, 其实就是较旧版的 Aladdin Ghostscript. (Aladdin 的这种安排值得我们赞赏; 应该有更多无法完全以 GPL 来散布原始码的软体厂商以这种方式支持自由软体 (free software). 无论你用 [28]gs 做什麽, 记得不要让它能够存取档案 (用 -dSAFER 选项). PostScript 是个具有完整功能的语言, 而一个恶意的 PostScript 程式可以让你 吃足苦头. 再谈到 PDF, Adobe 的 Portable Document Format 实际上就是把 PostScript 更组织化, 加上一些扩充功能, 经过压缩的档案格式. Ghostscript 可以像处理 PostScript 般地处理 PDF. 所以你可能是你周遭第一个拥有具有处理 PDF 能力 的印表机的人. 10.1 启动 ghostscript 典型的作法是在你的 magic filter(假如你的厂商没有提供一个适合你用的, 我 建议 apsfilter) 中使用 ghostscript, 但是如果为了除错, 直接执行通常会比 较方便些. gs -help 会简短地列出有用的选项以及所提供的驱动程式. (注意这儿所列出的 仅是编译进去的驱动程式, 而并非所有的驱动程式). 你可以用下面的方式执行 gs 来测试: gs options -q -dSAFER -sOutputFile=/dev/lp1 test.ps. 10.2 调整 ghostscript 的输出结果 假如 gs 的输出不能让人满意, 还有一些办法.(事实上, 你可以做任何事, 因为 你可以取得原始码). 输出的位置及大小 位置, 大小, 还有影像在页面上的视觉比例是由 ghostscript 中的印表机驱动程 式所控制的. 如果你发现列印出来太短, 太长或是大了两倍, 你可能会想要看一 下驱动程式的原始模组并且调整任何所能想到的参数. 不幸的是每一个驱动程式 都有不同的方式, 所以我也无法告诉你如何调整, 还好大部份的驱动程式都有还 算清楚的注解. Gamma, dotsizes, 等等 大部份的非雷射印表机因为列印的点比较大, 故会导致印出来的图案太黑. 假使 你遇到这个问题, 你应该使用自己的转换函数. 只要在 ghostscript 的 lib-dir 下建立如下的档案, 并在呼叫 gs 的时候将这个档名加在要列印的档案 之前就可以了. 你可能会需要调整一下实际的值才能适合你的印表机. 较小的值 会导致较亮的列印效果. 特别是当你的印表机使用 Floyd-Steinberg 演算法来混 色 ( rasterize color ) 可能是比较好的选择. ---8<---- gamma.ps ----8<--- %! %transfer functions for cyan magenta yellow black {0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer ---8<------------------8<--- 你也可以调整这些值来补救印表机颜色上的问题. 假如你要这麽做, 建议你可以 用 ghostscript 内附的 colorcir.ps ( 在 examples/ 目录下 ) 做为测试页. 很多较新型的彩色喷墨印表机的驱动程式具备命令列选项, 或是有不同的 upp 驱 动程式档来实做 gamma 及其它改变以让印表机适应不同类型的纸张. 在你用 Postscript 来修正问题之前, 应该先从这方面著手. 11. 如何列印到网路印表机 Lpd 的一个特性便是可以透过网路将报表列印到实体连接在其它机器上的印表 机. 只要仔细地组合 filter 命令稿和相关的工具程式, 你就可以让 lpr 得以透 通地 (transparently) 列印到各种网路上的印表机. 11.1 列印至 Unix/lpd 要让远端的机器能够使用你的印表机列印, 你必须将远端机器列名在 /etc/hosts.equiv 或是 /etc/hosts.lpd 档案之中. (要注意 hosts.equiv 还有 其它很多作用; 如果你要将一部机器列在这儿, 请确定你知道你在做什麽). 你也 可以利用 rs 属性来限定其它机器上的某些特定使用者才能使用你的印表机. 请 看 [29]lpd 的线上手□以取得这方面的讯息. 用 lpd 要列印到另一部机器, 你要在 /etc/printcap 中加上这样的记录, # REMOTE djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :rm=machine.out.there.com:\ :rp=printername:\ :lp=/dev/null:\ :sh: 请注意在本地的机器还是要有一个由 lpd 管理的列印暂存器目录. 如果远端的机 器离线或是忙不过来, 列印工作会留在本地的暂存区中直到送出去为止. 用 rlpr 你也可以用 rlpr 将列印工作直接送到远端机器的伫列中, 省下设定 lpd 的麻 烦. 假如你偶尔才要列印到其它不同的印表机, 这个方法就最有用. 引一段 rlpr 的声明: rlpr 利用 TCP/IP 将列印工作送到网路上任何位置的 lpd 伺服器. 与 lpr 不同的是, 你列印来源端的机器 *不需要* 明确地知道远端的印表机, ( 例如透过 /etc/printcap) 因此有相当大的弹性, 管理的负担也比较轻. rlpr 可以用在任何使用传统 lpr 的地方, 而且和传统的 BSD lpr 相容. rlpr 最大的好处在於可以 *从任何地方列印到任何地方* 而不用管列印来源端的 系统设定. 它可以像传统的 lpr 做为一个 filter, 而让在远端机器上执行的客 户端像 netscape, xemacs 等能够轻易地列印报表到你本地的机器. 你可以在 [30]Metalab 找到 rlpr. 11.2 列印到 Win95, WinNT, LanManager, 或 Samba 上的印表机 在 Printing to Windows mini-HOWTO 中有比这儿更多的资讯. 透过 [31]smbclient 这个程式 (samba 套件的一部份) 可以将 lpd 伫列导向到 架构在 TCP/IP 之上的 SMB 列印服务. Samba 包含了一个命令稿 smbprint 来做 这件事. 简单地说, 替这样的印表机在列印暂存器工作目录 (spool directory) 中加上设定档, 然後将 if 设为 smbprint 命令稿. 在 /etc/printcap 中的记录看起来应该像这个样子: lp|remote-smbprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lp:\ :if=/usr/local/sbin/smbprint: 你应该阅读一下 smbprint 命令稿中的说明以得到更多相关的讯息. 你也可以不管 lpd, 直接用 smbclient 将档案送到 SMB 列印服务. 请参照线上 手□. 11.3 列印到 NetWare 上的印表机 ncpfs 套件中包含了一个名为 nprint 的工具程式, 它提供如同 smbprint 一般 的功能, 只不过适用的对象是 Netware. 你可以在 [32]Metalab 取得 ncpfs. 下 面是从 0.16 版的 LSM 中节录出来的: With ncpfs you can mount volumes of your netware server under Linux. You can also print to netware print queues and spool netware print queues to the Linux printing system. You need kernel 1.2.x or 1.3.54 and above. ncpfs does NOT work with any 1.3.x kernel below 1.3.54. 利用 ncpfs, 你可以在 Linux 下挂上你的 netware 伺服器上的目录. 你也可 以列印到 netware 的列印伫列以及将 netware 的列印伫列排存(spool) 到 Linux 的列印系统. 你需要 1.2.x 或 1.3.54 以上(含 1.3.54) 的核心. ncpfs 无法在 1.3.54 以前的任何一版 1.3.x 核心下运作. 要使 nprint 透过 lpd 运作, 你要写个小小的 shell script 将 stdin 列印到 Netware 上的印表机, 并设成 lpd 列印伫列的 if. 你可能会有: sub2|remote-NWprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/sub2:\ :if=/var/spool/lpd/nprint-script: nprint-script 看起来可能大致上像: #! /bin/sh # You should try the guest account with no password first! /usr/local/bin/nprint -S net -U name -P passwd -q printq-name - 11.4 列印到 EtherTalk (Apple) 上的印表机 netatalk 套件包含了像 nprint 和 smbclient 的东西. 其他人已经写下了使用 Apple 网路列印的程序, 远比我所能写的好得多; 请参阅 [33]Linux Netatalk-HOWTO. 11.5 列印到 HP 或其它的以太网路(ethernet) 印表机 有些 HP 和其它厂牌的印表机提供了可以直接用 lpd 列印的以太网路介面. 你应 该遵照印表机或其网路介面所附的指示, 但是通常这种印表机上 "跑" 的是 lpd, 而且提供一到多个你可以使用的伫列. 举例来说, 一部 HP 可能可以用这样 的 printcap: lj-5|remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :rm=printer.name.com:rp=raw: 具有 Jet Direct 介面的 HP Laserjet 印表机通常支援两个内建的 lpd 伫列 - "raw" 接受 PCL (可能也接受 Postscript), 以及 "text" 接受单纯的 ascii ( 而且会自动地克服阶梯效应). 如果你有的是 JetDirect Plus3 三埠的介面, 伫 列的名称则为 "raw1", "text2" 等等. 注意 ISS 公司己经找到某一类的过量攻击(denial of service attacks) 可以导 致 HP Jetdirect 界面当掉. 大部份是在 98 年的秋天开始被发现的. 在一个大型的环境, 特别是个有些印表机不支援 PostScript 的大型环境中, 架 设一部专门的列印伺服器, 让所有的机器都列印到这部伺服器并让所有的 ghostscript 工作都在这部伺服器上面执行可能会有用. 这样子也可以让你的 Linux 做为印表机的排存伺服器(spool server), 如此一来 你的网路使用者便可以快一点完成他们的列印工作然後继续手边的事情, 而不必 等待印表机印完先前别人所送出的报表. 如果你有无法调整的旧型 HP Laserjets; 也可以这样做以降低印表机壅塞的机率. 要这样做, 先在你的 linux 机器上设定一个列印伫列指到配有以太网路介面 HP LJ (如前所述). 现在将所有在你区域网路上的客户端设定指到这个 Linux 伫列 (如前面□例中的 lj-5). 有些 HP 网路印表机似乎不理会客户端送出的标题页(banner page) 设定. 你可 以关掉它们内部自行产生的标题页, 用 telnet 连接到印表机, 按两下 return 键, 打入 "banner: 0", 接著打入 "quit". 还有其它可以调整的设定也是用这个 方式; 打入 "?" 可以看到它们的表列. 你可以用 HP 的 [34]WebJet 软体来控制全部的设定. 这套软体是以 daemon 的 方式执行, 接受在指定埠号上的 http 连线需求(http request). 它提供 http 表格(form) 及 Java applets 来控制网路上的 HP 印表机. 理论上, 它也可以控 制 Unix 的印表机伫列, 但是这得使用极不安全的的 rexec 服务. 我不建议使用 这个功能. 列印到比较旧的 HP 印表机 有些印表机 (或是将印表机连上网路的装置) 只支援很阳春的 TCP 连线. 在这一 类中较著名的便是早期的 JetDirect (包括一些 JetDirectEx) 介面卡. 基本 上, 要列印到这类的印表机, 你必须建立到印表机上某个特定埠 (典型是在 9100, 或是三埠机种的 9100, 9101 和 9102) 的 TCP 连接, 然後将你的报表送 进去. LPRng (如果你正在读这一段, 你真的该改用它) 内建支援将列印工作送到 任意的 TCP 埠, 但是 BSD 的 lpd 就不是这麽简单了. 我们可以用 Perl 来实 做, 或是用其它的方式: #!/usr/bin/perl # Thanks to Dan McLaughlin for writing the original version of this # script (And to Jim W. Jones for sitting next to Dan when writing me # for help ;) $fileName = @ARGV[0]; open(IN,"$fileName") || die "Can't open file $fileName"; $dpi300 = "\x1B*t300R"; $dosCr = "\x1B&k3G"; $ends = "\x0A"; $port = 9100 unless $port; $them = "bach.sr.hp.com" unless $them; $AF_INET = 2; $SOCK_STREAM = 1; $SIG{'INT'} = 'dokill'; $sockaddr = 'S n a4 x8'; chop($hostname = `hostname`); ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+$/;; ($name,$aliases,$type,$len,$thisaddr) = gethostbyname($hostname); ($name,$aliases,$type,$len,$thataddr) = gethostbyname($them); $this = pack($sockaddr, $AF_INET, 0, $thisaddr); $that = pack($sockaddr, $AF_INET, $port, $thataddr); if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) { # print "socket ok\n"; } else { die $!; } # Give the socket an address. if (bind(S, $this)) { # print "bind ok\n"; } else { die $!; } # Call up the server. if (connect(S,$that)) { # print "connect ok\n"; } else { die $!; } # Set socket to be command buffered. select(S); $| = 1; select(STDOUT); # print S "@PJL ECHO Hi $hostname! $ends"; # print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends"; # print S $dpi300; # Avoid deadlock by forking. if($child = fork) { print S $dosCr; print S $TimesNewR; while () { print S; } sleep 3; do dokill(); } else { while() { print; } } sub dokill { kill 9,$child if $child; } 11.6 替远端印表机执行 if lpd 一个不寻常的地方在於如果是远端印表机, if 不会被执行. 如果你发现你需 要执行 if, 你可以设定双重伫列(double queue) 并重新伫列报表. 举个例子, 看一下这个 printcap: lj-5:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :if=/usr/lib/lpd/filter-lj-5: lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\ :rp=raw:sd=/var/spool/lpd/lj-5-raw: 和相关的 filter-lj-5 命令稿(script): #!/bin/sh gs -q -dSAFER -sOutputFile=- - | \ lpr -Plj-5-remote -U$5 只有在 lpr 以监控程式(daemon) 模式执行的时候, -U 选项才有作用, 这个选项 会正确地设定第二重伫列中的送件人姓名. 你可能应该用更可靠的方法取得送件 人姓名, 因为有些时候它并不是第五个参数. 请参照 [35]printcap 的线上手 □. 11.7 从 Windows 列印 利用 SAMBA 套件可以直接支援以 SMB 协定从 Windows (或许 OS/2) 客户端列印 到 Linux 伺服器, 这个套件同时也支援将你的 Linux 档案系统分享给 Windows 客户端. Samba 包含了相当完整的文件, 也有一份很不错的 Samba FAQ 涵盖到这方面的内 容. 你可以在 Linux 上设置 magic filter 然後以 PostScript 列印, 或是在每 一部 Windows 机器上安装印表机专用的驱动程式然後为他们设定一个不用任何 filter 的伫列. 使用 Windows 驱动程式有些时候会有比较好的输出, 但是如果 有很多部 Windows 机器, 管理者就比较麻烦. 所以先试试看 PostScript 吧! 11.8 从 Apple 列印 Netatalk 支援由 Apple 客户端透过 EtherTalk 列印. 请参照 [36]Netatalk HOWTO Page 以取得更进一步的资讯. 11.9 从 Netware 列印 ncpfs 套件含有一个叫作 pserver 的监控程式(daemon) 可以提供服务给 NetWare 的列印伫列. 据我所了解, 这个系统必须搭配 Bindery-based 的 NetWare, 像是 2.x, 3.x, 或是使用 bindery 存取的 4.x 版本. 要取得更进一步关於 ncpfs 和其 pserver 程式的资讯, 请参照 [37]ncpfs 的 FTP 站. 12. Windows 专用印表机 如同稍早之前我所讨论的, 有些印表机原本就不被支援, 因为它们并非使用一般 的印表机语言, 而是利用电脑的 CPU 来描绘出位元组列(bitmap), 然後再以固定 的速率将之导到(pipe to) 印表机. 少数这类的印表机也使用普通的印表机语 言, 像PCL, 但是通常都没有. 有些 (非常低阶的) 印表机甚至并非使用平行埠连 接, 而是靠厂商的驱动程式来模拟硬体的行为 (最重要的流量控制(flow control)). 假如你发现你陷在这种恶劣的情况, 无论如何, 总还有一些可能的解决之道. 12.1 Ghostscript Windows 导向器(redirector) 现在有一个 Windows 的印表机驱动程式可以用 (叫做 mswinpr2), 它可以在列印 出报表之前先将其送到 Ghostscript 处理. (有点像在 Unix LPD 中的 if filter). 也有一个新的 Ghostscript 驱动程式可以用 Windows GDI 呼叫来列 印. 把它们兜在一块儿, 这样应该可以让 Windows 机器用厂商的驱动程式列印 PostScript 到一部 Windows 专用的印表机. 如果你成功了, 你可以依照前面让 Linux 透过网路列印到 Windows 印表机的说 明, 让 Unix (以及其它的 Windows, Mac 等) 主机列印到你的印表机. 话虽如此, 我从来没试过, 因为我没有 Windows 专用的印表机, 所以你的评价可 能不同. 所有这儿所牵涉到的软体应该都可以从 Ghostscript 的首页 (请看这份 文件在 Ghostscript 一节中的连结) 找到. 12.2 pbm2ppa 程式 有些 HP 的印表机使用 "Printing Performance Architecture" ("我们太便宜 了, 所以没有 PCL" 的行销术语). 要支援这种印表机, 可以透过使用 Tim Norman 所写的 pbm2ppa 翻译器(translator) 的这种迂回的方式. 基本上, 你使 用 ghostscript 将 PostScript 描绘成 pbm 格式的位元组列图案(bitmapped image), 然後用 pbm2ppa 将其翻译成可以直接倾印(dump) 的印表机专属的 ppa 格式的位元组列(bitmap). 这个程式现在可能也以 ghostscript 驱动程式的型式 出现. ppa 软体可以由 [38]ppa 的首页 取得. pbm2ppa 支援 HP 720, 820, 和 1000 的一些机种; 请阅读套件中所附的文件以取得有关 ppa 印表机支援的更进一步资 讯. 12.3 pbm2l7k 程式 大部份便宜的 Lexmark 喷墨印表机使用一种专用的语言而成了 Windows 专用的 印表机. 还好, Henryk Paluch 写了一个程式可以在 Lexmark 7000 上做黑白列 印. 他有可能能够找出彩色列印的方法并且支援其它的 Lexmark 喷墨印表机. 请 参照 [39]这个网站以取得更多资讯. 13. 如何列印到传真机 13.1 使用传真数据机(faxmodem) 外面有很多的传真程式可以让你传真及接收文件. 最复杂的其中一个就是 Sam Leffler 的 HylaFax, 可以在 ftp.sgi.com 取得. 它有各式各样的功能, 从使用 多部数据机到广播传送(broadcasting). SuSE 出了一个 Java 版的 HylaFax 客户端应该可以在任何的 Java 平台上运作 (包括 Windows 和 Linux). 大部份的平台上也有非 Java 版的传真客户端; Linux 几乎可以完全地处理你的网路传真的需要. 对大部份的 Linux 机器而言, 还有一个较好的选择, 就是 [40]efax, 一个送传 真的简单程式. 而 getty 的程式 mgetty 则可以接收传真 (在有些数据机上甚至 可以接收语音邮件!). 13.2 使用远端列印服务 有人提供一种实验性的服务, 让你可以用电子邮件送出你想要列印的内容, 然後 从别处的传真机列印出来. 这个服务支援一些不错的格式, 像是 PostScript, 虽 然涵盖的区域不够广泛, 仍不失为一个很有用的服务. 想要知道更多有关於使用 远端列印服务的讯息, 请参照 [41]Remote Printing WWW Site. 14. 如何产生值得列印的东西 我们可以使用的软体真是又多又杂. 基本上, Linux 可以执行很多种的二进位 档, 相容(执行成功) 的程度各有不同: Linux/x86, Linux/Alpha, Linux/Sparc, Linux/foo, iBCS, Win16/Win32s (利用 dosemu, 或许将来用 Wine), Mac/68k (用 Executor), 和 Java. 我将只讨论原生的(native) Linux 和常见的 Unix 软体. 就 Linux 自身而言, 选择几乎仅限於那些 Unix 一般所能取得的: 14.1 标示语言(Markup languages) 大部份的标示语言(markup languages) 比较适合大型的或是重覆性的计画, 你可 以用电脑来控制文字的版面设计以取得一致性. nroff 这是 Unix 最早的标示语言之一. 最常见的□例 - 线上手册(man pages) - 便是用 *roff 巨集编排而成的; 许多人信赖 nroff, 但是它的 语法比所需要用到的更艰涩难懂(至少对我而言), 对新的工作而言, 它可 能并不是个好选择. 话虽如此, 知道你可以用 groff 将线上手册直接排 版成 PostScript 还是值得的. 用 man -t foo | lpr, 大部份的 man 指 令会替你做这件事. TeX TeX, 和巨集套件 LaTeX, 是 Unix 上最被广泛使用的标示语言之一. 技 术性的工作通常用 LaTeX 来撰写因为它能大幅地简化格式编排的问题, 而且仍然是少数能完整并良好地支援数学符号的文字处理器之一. TeX 的 输出格式为 dvi, 可以用 dvips 或 dvilj 将其转换为 PostScript 或是 Hewlett Packard 的 PCL. 如果你要安装 TeX 或 LaTeX, 安装整组 teTeX 套件; 它包含了所需的一切. SGML Unix 和 Linux 至少有一个免费的 sgml 语法解析程式(parser) 可用; 它是 Linuxdoc-SGML 产生的文件系统的基础. 它也可以支援其它的 DTD(文件型态定义). HTML 有人建议说对於比较简单的计画, 用 HTML 撰写, 然後用 Netscape 列印 可能就足够了. 我并不赞成, 但是你可能有不同的评价. 14.2 所见即所得(WYSIWYG) 的文书处理器 所见即所得的文书处理器再也不怕没有了. 有好几套办公室套装软体(office suite), 其中还有一套 (StarOffice) 可以让个人免费使用. StarOffice 一家德国公司在网路上免费散布 Linux 版本的 StarOffice. 这个全功能 的办公室套装软体有著所有你想要的功能, 而且你无法抗拒它的价格. 有 一份 mini-HOWTO 说明如何取得并安装它. 它产生 PostScript 和 PCL, 所以应该可以和大部份能在 Linux 上使用的印表机一起使用. 很明显 的, 它是一套 Office 的仿制品, 而且相当的庞大臃肿. WordPerfect Corel 免费发行了一套 Linux 版本上的 Word Perfect 8 简易版, 而且 己经暗示一旦移植的工作完成, 他们也会发行 Corel Draw 和 Quattro Pro. 如果你有一部使用 ARM 处理器的机器, 这可能是你最好的选择; Corel 开发出几款使用 ARM 处理器的 Netwinder Linux 主机, 而且可以 说是一定会提供 ARM Linux 版本的所有东东. 你也可以选择购买全功能 的版本及支援服务, 两者一起或是分别购买. [42]Linux WordPerfect 字 型与印表机首页有关於设定 WordPerfect 使用 Ghostscript 或是内建的 印表机驱动程式的资料. (内建的印表机驱动程式很明显地和 DOS 版 WordPerfect 的驱动程式一模一样, 万一你的印表机的驱动程式不在 WP8 的发行套件中的话, 可以试试.) Applix Applix 是由 Applix 公司销售的一个跨平台(如各种不同版本的 Unices, Windows 和其它)的办公室套装软体. Red Hat 和 SuSE 在它是 唯一选择的时候曾经销售过; 现在则将销售权交还给 Applix. LyX LyX 是个值得期待的 LaTeX 前端. 请看 [43]LyX 首页 以取得更进一步 的讯息. 有一个搭配 KDE 的 LyX 版本, 叫做 Klyx; LyX 的作者和整合 KDE 的人是同一个. Maxwell Maxwell 是个简单的使用 MS RTF 格式的文书处理器, 一开始是个商业产 品, 但现在则是采用 GPL 版权发行. The Andrew User Interface System AUIS 包括了 ez, 一个所见即所得风格的编辑器, 它有著大部份基本的文 书处理功能, HTML 的能力, 以及完全地支援 MIME 格式的电子邮件和新 闻群组. 不幸的是, 没人再继续维护 AUIS. Koffice KDE 计画正在朝向全套的办公室套装软体努力. 我不认为它已经准备好让 大众来使用. 它的文书处理器很明显的是 LyX 的後代. GNOME GNOME 计画也正在努力开发许多不同的 GNU 授权的办公室工具. 但是还 没一个可用. Jeff Phillips 使用 Caldera 的 Linux 版本的 WordPerfect 7(在 Slackware 上, 在所有的选择之中), 说一切运作正 常. 它似乎包含了内建的印表机支援, 如同一个人所会想要的. Caldera 应该会在 [44]http://www.caldera.com/ 上提供一些资讯. 你也可以直 接向 Corel 所选择的 Unix 移植公司购买较新版的 WordPerfect. 其它的厂商请别客气地告诉我你所提供的产品. 15. 在萤幕上预览可列印的东西 几乎任何你能列印的东西就可以在萤幕上观看. 15.1 PostScript Ghosrscript 有一个 X11 的驱动程式最好在 PostScript 的预览程式 [45]gv 的 管理下使用. 这些程式的最新版应该也可以看 PDF 档案. 要注意 gv 已经取代了 较旧的预览程式 "Ghostview"; 新的使用者介面要比 ghostview 平面老旧的 Athena 图形使用者介面漂亮的多, 功能也比较多. 15.2 TeX dvi TeX DeVice Independant 档案可以在 X11 下用 [46]xdvi 来预览. 现代版的 xdvi 会呼叫 ghostscript 来描绘 PostScript 的部份. 也有一个 VT100 的驱动程式, 叫做 dgvt. 假如你只能做到这样的话, Tmview 可 以搭配 Linux 和 svgalib 一起用. 15.3 Adobe PDF Adobe 的 Acrobat Reader 有提供 Linux 版; 只要从他们的网站 [47]http://www.adobe.com/ 下载就可以了. 你也可以用 xpdf, 它是个免费软体(freeware) 而且附原始码, 同时我想 Ghostview 现在应该已经支援在 X11 下用 gs 看 PDF 档案. 16. 在 lpd 下使用序列式印表机 16.1 设定 printcap Lpd 在 /etc/printcap 中提供了五个可以设定的属性, 让你用来控制印表机所连 接的序列埠的设定. 阅读 [48]printcap 的线上手□(man page), 并请注意 br#, fc#, xc#, fs# 和 xs# 的意义. 其中最後的四个属性是位元组 列(bitmap), 用来代表该序列埠的使用设定. 而 br# 属性只是单纯的鲍率(baud rate), 例如 `br#9600'. 要将 [49]stty 的设定转换为 printcap 的旗标设定(flag settings) 非常简 单. 假使你需要, 请现在就看看 stty 的线上手□. 你可以用 stty 来设定印表机埠, 以便让你可以将一个档案 cat 到该埠, 并且使 它正确地列印出来. 这儿是我的印表埠 `stty -a' 的结果: dina:/usr/users/andy/work/lpd/lpd# stty -a < /dev/ttyS2 speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; min = 1; time = 0; -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke 这□和开机时序列埠初始化的设定方式唯一的不同在於 -clocal, -crtscts, 和 ixon. 根据你的印表机的流量控制(flow control) 方式, 你的设定可能会不同. 实际上, 你是以特殊的方式使用 stty. 因为 stty 的对象是连接在标准输 入(standard input) 上的终端机装置, 你是用如上所示的 `<' 字元, 来使得 stty 处理所指定的序列埠. 只要你的 stty 设定正确, `cat file > /dev/ttyS2' (在我的例子中) 就可以将 档案送到印表机了, 请看一下这个档案 /usr/src/linux/include/asm-i386/termbits.h, 它包含了很多的 #define 和一 些 struct (你可能想把它 cat 到印表机 (已经可以用了吧, 对不对?), 然後把 它当做便条纸). 找到下面这一行: /* c_cflag bit meaning */ #define CBAUD 0000017 这一段列出了 fc# 和 fs# 位元的意义. 你会发现到那儿的名称 (在鲍率之後) 和 stty 输出的结果其中一行相符合, 我不是说这会很容易吗? 找到那些在你的 stty 结果中前面有减号(-) 的设定, 把那些数字(是八进位的) 加起来. 这代表了你要清除的位元, 结果就是你的 fc# 能力. 当然你也可以直接 用 `fc#0177777' (我就是), 因为你将会在清除之後立刻设定这些位元. 现在对那些在 stty 的结果中没有减号在前面的设定 (在这一段中所列出的) 做 同样的事. 在我的例子中, 重要的设定有 CS8 (0000060), HUPCL (0002000), 和 CREAD (0000200). 同时也找到代表你的鲍率的旗标 (我的是 0000015), 把它们 统统加起来, 在我的例子中会得到 0002275. 这就是你的 fs# 能力 (`fs#02275' 在我的例子中运作的很好). 用同样的方式针对这个标题档(include file) 中的下一段, "c_lflag bits", 做 设定和清除的动作. 在我的例子中我不需要设定任何东西, 所以只要用 `xc#0157777' 和 `xs#0' 就可以了. 16.2 会掉字的旧型序列式印表机 Jon Luckey 指出有些具有 ten-cent 序列介面和小缓冲区的旧型的序列式印表 机, 当使用流量控制时, 说停止就是真的表示停止. 他发现用 [50]setserial 停 用他的 Linux 机器的 16550 序列埠的 FIFO 功能後, 掉字的问题就解决了 (如 果你要这样做, 似乎只要将 uart 的种类指定为 8250 就可以了). 17. 感谢 smbprint 的资讯是从 Marcel Roelofs 的一篇文章来的. 有关使用 Netware 印表机的 nprint 的资讯是由 Michael Smith 所提供的. 在 lpd 下使用序列式印表机一节是由 Andrew Tefft 所提供. 有关 gs 和 gamma 的介绍是 Andreas 送来的. 有关序列埠的 30 秒 closing_waiting 的那两段是由 Chris Johnson 所贡献的. Robert Hart 送来一些极佳的片段, 是关於设定一部使用 HP 网路印表机的列印 伺服器, 我逐字照用. 还要特别谢谢你们之中的很多人, 那些历年来曾经指出文章中打字, url, 以及种 种错误的人, 谢谢. References 1. mailto:gtaylor+pht@picante.com 2. mailto:henryjen@mail.net.tw 3. http://www/picante.com/~gtaylor/pht/ 4. http://www.picante.com/~gtaylor/pht/ 5. http://metalab.unc.edu/LDP/HOWTO/Printing-Usage-HOWTO.html 6. http://www.picante.com/~gtaylor/pht/man/tunelp.8.html 7. http://www.picante.com/~gtaylor/pht/man/insmod.1.html 8. http://www.cyberelk.demon.co.uk/parport/parport.txt 9. http://www.cyberelk.demon.co.uk/parport.html 10. http://www.picante.com/~gtaylor/pht/man/stty.1.html 11. http://www.picante.com/~gtaylor/pht/man/setserial.8.html 12. http://metalab.unc.edu/mdw/HOWTO/Serial-HOWTO.html 13. http://www.cs.wisc.edu/~ghost/ 14. http://www.picante.com/~gtaylor/pht/printer_list.cgi 15. http://www.cs.wisc.edu/~ghost/printer.html 16. http://www.picante.com/~gtaylor/pht/printer_list.cgi 17. http://www.astart.com/lprng/LPRng.html 18. http://www.picante.com/~gtaylor/pht/man/lpd.8.html 19. http://www.picante.com/~gtaylor/pht/man/lpr.1.html 20. http://www.picante.com/~gtaylor/pht/man/lpq.1.html 21. http://www.picante.com/~gtaylor/pht/man/lpc.8.html 22. http://www.picante.com/~gtaylor/pht/man/lprm.1.html 23. http://www.picante.com/~gtaylor/pht/man/printcap.5.html 24. ftp://metalab.unc.edu/pub/Linux/system/printing/ 25. http://www.picante.com/~gtaylor/pht/man/nenscript.1.html 26. http://www.picante.com/~gtaylor/pht/printer_list.cgi 27. http://www.cs.wisc.edu/~ghost/ 28. http://www.picante.com/~gtaylor/pht/man/gs.1.html 29. http://www.picante.com/~gtaylor/pht/man/lpd.8.html 30. ftp://metalab.unc.edu/pub/Linux/system/printing/ 31. http://www.picante.com/~gtaylor/pht/man/smbclient.1.html 32. ftp://metalab.unc.edu/pub/Linux/system/filesystems/ncpfs/ 33. http://thehamptons.com/anders/netatalk/ 34. http://www.hp.com/go/webjetadmin 35. http://www.picante.com/~gtaylor/pht/man/printcap.5.html 36. http://thehamptons.com/anders/netatalk/ 37. ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/ 38. http://www.rpi.edu/~normat/technical/ppa/ 39. http://bimbo.fjfi.cvut.cz/~paluch/l7kdriver/ 40. http://www.picante.com/~gtaylor/pht/man/efax.1.html 41. http://www.tpc.int/ 42. http://www.channel1.com/users/rodsmith/wpfonts.html 43. http://www.lyx.org/ 44. http://www.caldera.com/ 45. http://www.picante.com/~gtaylor/pht/man/gv.1x.html 46. http://www.picante.com/~gtaylor/pht/man/xdvi.1.html 47. http://www.adobe.com/ 48. http://www.picante.com/~gtaylor/pht/man/printcap.5.html 49. http://www.picante.com/~gtaylor/pht/man/stty.1.html 50. http://www.picante.com/~gtaylor/pht/man/setserial.8.html