11 打印 11.1 概要 11.2 介绍 11.3 基本设置 ============================================================= 第11 章打印 ============================================================= (翻译中出现的任何问题或错误,请广大读者及时反馈给我:freebsdhandbook@163.com) 11.1 概要 FreeBSD 支持许多种类的打印机,从最老式的impact 打印机,到最新的激光打印机, 都可以让你通过相关的应用程序来提供高质量的打印效果。 FreeBSD 也可以通过网络来配置一个打印服务器。通过这种功能,FreeBSD 也可以从其 他的电脑上得到打印任务,包括其它的FreeBSD 电脑、windows 和MACos 主机。FreeBSD 能 够确保每个打印作业都能完成,并能够统计用户和机器的工作状况,以使它们能达到最佳的 打印效果。FreeBSD 也能生成“banner”页,来显示谁打了什么和打了多少。 阅读完这章,你将了解到: 如何配置FreeBSD 的打印机spooler。 如何安装打印机的过滤器,处理一些特殊的打印作业。包括转换打印文件的格式。 如何在打印输出文件中启用header 或banner 文件。 如何通过连接到其他电脑来打印到打印机。 如何直接连接到网络来打印到打印机。 如何管理打印机的限制,包括打印尺寸的大小,以及阻止某些用户的打印。 如何记录打印机的统计情况和用户使用打印机的情况。 如何处理打印机出现的问题。 在阅读这章之前,你应当先了解: 如何配置和安装一个新的内核(第9 章)。 11.2 介绍 第1 页FreeBSD 使用手册 要在FreeBSD 下使用打印机,你需要设置Berkeley line PRint spooling(打印池) 系统,也叫做LPD spooling 系统。这是FreeBSD 下控制打印机的标准。这一节将介绍LPD spooling 系统,以下将简称为LPD。 如果你已经熟悉LPD 或是其它的打印机spooling 系统,你可以先跳到设置spooling 系 统那一节。LPD 控制任何有关连接在本机上的打印机的事情,包括: 1. 控制本地打印机及网络上其它打印机的访问权限。 2. 接收使用者传送的文件来打印;这些要打印的要求称为工作。 3. 利用队列来防止多个使用者同时访问同一台打印机。 4. 在输出时打出header pages(也称做banner 或burst)。这样,使用者可以在厚厚 一打纸张中找出他们自己所打印的东西。 5. 为连接在串口上的打印机设置适当的通讯参数。 6. 通过网络将工作送给另一台机器上的LPD spooler。 7. 执行特定的过滤程序,让你的工作可以兼容于使用不同打印机语言的打印机。 8. 统计打印机的使用情况。 11.2.1 为什么要使用spooler 通过适当的设置并提供特别的过滤程序,你可以使LPD 系统在不同的打印机上拥有上述 全部或部分的功能。 如果你的系统只有自己一个人在用,那么你可能会觉得既不需要权限控制、header pages、或是统计打印机使用情况,为什么还要用spooler?如果可以直接访问打印机,那 么你仍然得使用spooler,因为: . LPD 在执行脱机打印的工作时,你不需要花时间等待资料传送到打印机。 . LPD 可以通过过滤程序,在你的文件上加上日期/时间等信息,或是转换特别的文件 格式(如Tex、DVI 的文件)使打印机能处理。你不需要手动转换。 . 很多免费及商业软件所提供的打印功能通常会需要用到你系统上的spooler。你只 要设置好spooling 系统,将来可以很容易的让其它的程序使用打印机。 . 统计打印机的使用情况。 第2 页FreeBSD 使用手册 11.3 基本设置 让LPD 可以配合打印机工作,你需要同时设置好你的打印机以及LPD。设置分为两大部 分: 1. 简单的打印机设置这一节将告诉你如何连接打印机,并设置LPD 打印纯文本的文 件。 2. 高级打印机设置这一节将告诉你如何让打印机打出各种不同格式的文件、header pages、通过网络打印、设置访问权限以及统计打印机的使用情况。 11.3.1 简单的打印机设置 这一节将说明如何连接打印机及设置LPD。包括: 硬件设置这一节说明如何将打印机接到计算机上的连接端口。 软件设置这一节说明如何撰写LPD spooler 的设置文件/etc/printcap 。 如果你要设置的是网络打印机,请参考使用网络数据传输接口的打印机这一节。 虽然这一节叫做“简单的打印机设置”,但其实是挺复杂的。让你的打印机可以配合 LPD spooler 是设置工作中最难的一部分。一旦你的打印机可以正常工作了,较高级的功能 如打印header pages 和打印机使用情况统计反而比较容易设置。 11.3.1.1 硬件设置 这一节说明有哪些方法可以将打印机连到我们的个人计算机上;有哪些通讯端口、连接 线以及kernel 的设置。如果你的打印机在你使用的计算机上可以通过其它操作系统来打印, 你也许可以跳过这一节直接到软件设置那一节。 11.3.1.1.1 端口和线缆 几乎所有可以和PC 连接的打印机都能支持下列两种或是其中一种接口: 第3 页FreeBSD 使用手册 1. 串行打印机通过串口和计算机传输资料。串行接口的配备及连接线可以容易的取得 及安装。但是串行接口有时需要较特别的连接线及较复杂的设置。 2. 并行打印机通过并口和计算机传输资料。并口在市场上很普遍,连接线也很容易找 得到,但是不容易自己制作。利用并口连接打印机十分的容易,通常不需要设置额 外的通讯参数。 并口有时也称做“Centronics”接口,这是根据打印机上面的接头来命名的。 通常,只有使用PostScript 的打印机才需要用到双向传输。PostScript 打印机可以说 是十分复杂。事实上,PostScript 的打印工作常常是由程序将工作送到打印机处理后,并 不打出来,而是将结果再传回计算机。PostScript 也使用双向传输将错误传回计算机。比 如说PostScript 程序有问题或是打印机卡纸。机器上的使用者可能会需要这些信息。更进 一步的,PostScript 打印机统计打印情况最好的方式就是使用双向传输。比如说:你可先 询问打印机启动以来一共打过几张,然后送出使用者要打的东西,打完后再询问一共打了几 张,由此就可得知得向使用者收多少纸张的钱。 那么,你该选择哪一种接口呢? 1. 如果你需要双向传输,那么就选择使用串口。FreeBSD 目前并不支持并口上的双向 传输。 2. 如果你不需要双向传输,那么,你只要选择你的打印机支持的接口即可,当然最好 是可以用并行端口,而将串行端口留作其它的用途—比如连接终端机或调制解调器 —通常并口传输比较快,设置起来也较容易。 3. 最后,如果还是不知道怎么选的话,就看哪个能用就接哪个吧。 11.3.1.1.2 并行口 用Centronics 连接线通过并口连接打印机和计算机。打印机的手册、计算机的手册这 两者都可以给你足够的安装说明。记住你所使用的并行口。在FreeBSD 里,第一个并行口是 /dev/lpt0;第二个则是/dev/lpt1,依此类推。 11.3.1.1.3 串行口 第4 页FreeBSD 使用手册 用适当的连接线通过串行口连接打印机和计算机。打印机的手册、计算机的手册这两者 都可以给你足够的安装说明。如果你不确定你的连线是否为“合适的串行口连接线”,你可 以试试下面几种不同用途的线: 1. 连接调制解调器的线。这种线是一个接脚对一个接脚直接对接的。这种线也叫做 “DTE-to-DCE”连接线。 2. Null-modem 连接线大部分是一个接脚对一个接脚直接对接,而有少部分接脚相互 交换(如send data 和receive data);有少部分接脚则是两端都是短路。这种线 也叫做“DTE-to-DTE”连接线。 3. 并行打印机连接线,某些不常见的打印机需要这种线。这种线类似null-modem 连 接线,但是有些信号是送到相对应的接脚而不是两端短路。 你应当为打印机设置通讯参数,通常可以利用打印机上的控制面板或是DIP 开关设置。 选择你的计算机和打印机同时支持的最高传输速率(单位为bps,bits per second,也称做 baud rate)。选择7 或8 的数据位;无、奇数或偶数的同位检查;1 或2 停止位。同时也选 择流量控制的方式:无、XON/XOFF (也称做“in-band”或“软件”)流量控制。记住你的软 件设置也要使用同样的值。 11.3.1.2 软件设置 这节说明如何设置FreeBSD 下的LPD spooling 系统,使其能打印。 下列是所需的步骤: 1. 如果需要的话,设置你的kernel,使该连接端口可被打印机使用。设置Kernel 这 一节将告诉你需要做些什么。 2. 如果你使用的是并行口,那么你得设置并口的通讯模式。设置并列端口的通讯模式 这一节有详细的说明。 3. 测试操作系统是否可以将资料送给打印机。检查打印机连接状况这节将给你一些关 于这一方面的建议。 4. 修改/etc/printcap 以正确设置LPD。/etc/printcap 设置文件将告诉你如何做。 第5 页FreeBSD 使用手册 11.3.1.2.1 内核配置 操作系统的kernel 为了能配合某些设备需要重新编译。而串口和并口就是这些设备之 一。如果你的kernel 目前并不支持你想用的串口或并口,那么你可能需要将它们加入你的 kernel 设置并重新编译。如果要检查你的kernel 目前是否支持串口,你可以用这个命令: # dmesg | grep sioN 其中N 是串口的编号,从0 开始计算。如果你得到的结果类似下面这个样子: sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A 表示你的kernel 支持这个通讯端口。 如果要检查你的kernel 目前是否支持并行口,你可以用这个命令: # dmesg | grep lptN 其中N 是并行口的编号,从0 开始计算。如果你得到的结果类似 lpt0 at 0x378-0x37f on isa 表示你的kernel 支持这个通讯端口。 你可能会需要重新设置你的kernel 使得操作系统可以辨认并使用你连接打印机的并口 或串口。 如果要让你的kernel 支持串口,请参考关于重新编译kernel 的那一节。如果要让你的 kernel 支持并口,请参考关于重新编译kernel 的那一节以及下一节。 11.3.1.3 为端口新增/dev 下的设备文件 既然kernel 已经支持你所需的并口或串口,你仍然需要一个程序接口在系统里协助传 送和接收资料。这也是/dev 里设备文件存在的目的。 第6 页FreeBSD 使用手册 如果要在/dev 目录下为你的通讯端口建立相对应的设备文件: 1. 用su 命令切换成root。 2. 更改当前的目录到/dev 下: # cd /dev 3. 输入: # ./MAKEDEV port 其中port 是你想要建立的设备文件名称。如果是第一个并口,你可以用lpt0;如 果是第二个并口,你可以用lpt1,依此类推。如果是第一个串口,你可以用ttyd0 如果是第二的串口,而用ttyd1;依此类推。 4. 输入: # ls -l port 以确定你刚刚是否建立成功。 11.3.1.3.1 为并口设置通讯模式 当你决定要用并口时,在FreeBSD 下你可以决定要用中断驱动(interrupt-driven)或是 轮询(polled)的方式与打印机沟通。 1. 中断驱动是GENERIC kernel 里默认的方式。如果选择这个方式,操作系统将利用 IRQ 来判断打印机是否已经准备好接收资料。 2. 而轮询的方式则是由操作系统一直重复地去询问打印机是否已经准备好可以接收 资料。如果打印机已经准备好了,那么kernel 再将要打印的资料送过去。 中断驱动的方式较快但是要占用一个IRQ。你可以从上述两者任选一个可以正常工作的 来使用。设置通讯模式有两种方式:设置kernel 或是使用lptcontrol 这个程序。 如果要从kernel 里设置: 第7 页FreeBSD 使用手册 1. 编辑你的kernel 设置文件。找出或是自行加入lpt0 这一项。如果你要设置使用第 二个并口,那就加入lpt1 这项。如果是第三个并口就用lpt2,依此类推。 如果你要设置使用中断驱动模式,那么要指定irq: device lpt0 at isa? port? tty irq N vector lptintr 其中N 是你并口所使用的IRQ 编号。 如果你要用轮询模式,那么就不要指定irq: device lpt0 at isa? port? tty vector lptintr 2. 将设置文件存储好后,重新编译、安装kernel 并重新启动。你可以参考内核配置那 一节里更详细的说明。 如果你想用lptcontrol 来设置通讯模式: 1. 输入: # lptcontrol -i -u N 将lptN 设置为中断驱动模式。 2. 输入: # lptcontrol -p -u N 将lptN 设置为轮询模式。 你可以把上述的命令加到你的/etc/rc.local 文件里使得每次启动时都可以自动设置。 你可以查看lptcontrol 以得到更多有关的信息。 11.3.1.3.2 检查打印机的通讯状况 在设置spooling 系统前,你应该先确定你的操作系统可以成功地将资料送到你的打印 机。将打印机的连接和spooling 系统分开来测试会较容易。 你可以送一些文字来测试你的打印机。打印机应该会马上将它们收到的资料打出来。 lptest 这个程序会送96 行每行96 个ASCII 文字的资料给你的打印机以协助测试。 第8 页FreeBSD 使用手册 使用PostScript(或是其它语言)的打印机测试起来较复杂。我们得先写一个较小的测 试程序,像下面这样: %!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Is this thing working?) show showpage 注意:上面这个小程序是给使用PostScript 的打印机用的,不能给比如说Hewlett Packard 公司的PCL 语言使用。PCL 语言可以让你打印纯文本,同时里面夹杂PCL 特别的命 令。PostScript 不能直接打印纯文本,因此对于这样的打印机,我们必需做一些特别的设 置。 11.3.1.3.2.1 检查一下并口打印机 这节将告诉你如何检查FreeBSD 是否可以使用接在并口的打印机。 测试并口上的打印机: 1. 用su 命令切换成root。 2. 将资料传送给打印机。 如果这个打印机可以直接打印纯文本,请使用lptest。输入: # lptest > /dev/lptN 其中N 是你打印机所连接的并列端口。从0 开始计算。 如果这个打印机使用PostScript 或其它的打印机语言,那么送一个小小的测试程序给 打印机。输入: # cat > /dev/lptN 然后,一行接着一行,小心的把你的命令打进去,因为你按下ENTER 后,就无法再修改 了。当你输入完毕后,按CONTROL+D 或是其它产生文件结尾字符的按键。或者是你可以将你 的测试程序放在一个文件里并输入: # cat file > /dev/lptN 第9 页FreeBSD 使用手册 其中file 就是存储你测试程序的文件名。 你应该可以看到有一些东西打出来了。如果打出来的资料看起来不大正确,别担心,我 们等一会就修正它们。 11.3.1.3.2.2 检查一下串口打印机 这节将告诉你如何检查FreeBSD 是否可以使用接在串口的打印机。 测试串口上的打印机: 1. 用su 命令切换成root。 2. 编辑/etc/remote 这个文件,并加入下列几行: printer:dv=/dev/port:br#bps-rate:pa=parity 其中port 指的是哪一个串口(ttyd0、ttyd1、等等),bps-rate 指的是该串口的传 输速度,而parity 是设置打印机是否需要同位检查(这个值可以是even、odd、none 或zero)。 下面这个例子是一台连接在串行端口上以19200 bps 传输的,同时不使用同位检查 的打印机设置方式: printer:dv=/dev/ttyd2:br#19200:pa=none 3. 用tip 命令连上打印机。输入: # tip printer 如果失败的话,再次编辑/etc/remote 这个文件同时以/dev/cuaaN 取代/dev/ttydN。 4. 将资料传送给打印机。 如果这个打印机可以直接打印纯文本,请使用lptest。输入: ~$lptest 如果这个打印机使用PostScript 或其它的打印机语言, 那么送一个小小的测试程序给 打印机。一行接着一行,非常小心地将程序输入,因为退格键或是其它编辑时常用的按键, 第10 页FreeBSD 使用手册 对打印机可能有特殊的意义。最后你可能要打一个给打印机的文件结尾的字符,让它知道程 序结束了。对PostScript 的打印机来说,是用CONTROL+D 键。 或者是你可以将你的测试程序放在一个文件里并输入: ~>file 其中file 就是存储你测试程序的文件名。用tip 将这个文件送给打印机后,而按文件 结尾字符。 你应该可以看到有一些东西打出来了。如果打出来的资料看起来不大正确,别担心,我 们稍待一会就修正它们。 11.3.1.4 启用spooler:编辑/etc/printcap 文件 到目前为止,你的打印机应该已经连接好了,你的kernel 应该也设置无误了,而且你 也可以传送资料给打印机了。现在,我们应该可以开始设置LPD 来控制打印机了。 LPD 的设置文件是/etc/printcap。每当spooler 被使用时,LPD spooling 系统就会来读这 个文件,所以只要这个文件一被修改,马上就会生效。 编辑printcap 这个设置文件是很简单的。用你喜欢的编辑器对/etc/printcap 这个设 置文件做修改就可以了。这个文件的格式写法和其它的设置文件如 /usr/share/misc/termcap 和/etc/remote 是相同的。关于这些设置文件的格式,请参考 cgetent。 要建立一个简单的spooler 设置,请按照下列步骤: 1. 为你的打印机选择一个名字(以及一些方便的别名),并把它们放在/etc/printcap 这个文件里。请阅读为打印机取名这一节。 2. 用sh 关键词关闭打印header pages 的功能(默认是打开此功能)。请阅读不打印 Header Pages 这一节。 3. 用sd 关键词指定一个目录给spooler 用。请阅读建立Spooling 目录这一节。 4. 在/etc/printcap 设置文件里用lp 关键词指定打印机连接端口在/dev 下使用的设备 文件。请阅读辨认打印机设备这一节。如果你的打印机是接在串口,那么你可以用 fs、fc、xs 以及xc 等关键词来设置通讯参数。请阅读设置Spooler 的通讯参数。 5. 安装输入文字过滤程序;请参考安装文字过滤程序这一节。 第11 页FreeBSD 使用手册 6. 利用lpr 命令打印以测试设置是否正确;请阅读测试及疑难解答这两节。 注意: 使用特定语言的打印机,比如说PostScrit 打印机,无法直接打印纯文本。上述 以及下面要介绍的方法将假设你所要打印的文件都是不需要转换就能让打印机直接了解 的。 使用者通常会期望它们可以直接将纯文本的资料直接由打印机输出,而使用LPD 打印的 程序通常也是这么假设的。如果你的打印机使用某个特定的打印机语言,且你希望可以同时 处理特定打印机语言的资料以及纯文本的资料,那么你应该要另外再多安装一项以前没有提 到的东西:纯文本转成PostScript(或其它打印机语言)的自动转换程序。在PostScript 打 印机上打印纯文本这一节将告诉你要怎么做。 11.3.1.4.1 为打印机命名 第一就是为你的打印机取一个名字。此外,你也可为你的打印机取很多别名,因此,你 要取符合功能的名字或是古怪的名字都可以。 在/etc/printcap 里定义的打印机,至少要有一台取lp 别名。这是默认的打印机名称。 如果使用者没有环境变量PRINTER 设置打印机的名称,且在LPD 的命令也没有指定任何打印 机的话,那么别名为lp 的打印机就会被视为默认的打印机。 通常,我们会将一台打印机的最后一别名取为它的全名,包括制造商以及型号。 当你将打印机的名称及别名设置在/etc/printcap 文件里时,打印机的名称一定要放 在最左边的字段。其它的别名则以垂直的线(|)分开,而在最后一个别名之后加一个冒号(:)。 在下面的例子里,我们大略描述一下/etc/printcap 的骨干。这个例子里定义了两台打印机。 (Diablo 630 以及Panasonic KX-P4455 PostScript 激光打印机。): # # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4: 在这个例子里,第一台打印机取名为rattan 而它的别名有line、diablo、lp 以及Diablo 630 Line Printer。这台打印机有lp 这个别名,因此它也是默认的打印机。第二台取名为 bamboo,而它的别名有ps、PS、S、panasonic 以及Panasonic KX-P4455 PostScript v51.4。 11.3.1.4.2 不打印头文件 第12 页FreeBSD 使用手册 LPD spooling 系统默认是为每个打印工作打印header page 的。Header page 包括了送 出打印工作的使用者名称、送出工作的机器名称以及工作的名称。不幸的是,这些额外的信 息可能会妨碍我们做简单的打印机设置测试,因此我们想不要打印header pager。 在/etc/printcap 用sh 关键词为特定的打印机设置不打印header pages。这里有一个 在/etc/printcap 里使用sh 的例子: # # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh: 注意:我们使用的正确格式:打印机定义的第一行得从第一个字开始写的,而其后的每 一行用TAB 键往内缩一格。而一行如果写不完需要接到下一行时,则以反斜线字符结尾。 11.3.1.4.3 建立spooling 目录 下一步就是建立一个spooling 目录,一个在打印时会用到以及存放一些spooler 需要 的文件的地方。 通常我们会将spooling 目录指定在/var/spool 目录下。你不需要备份spooling 目录, 而建立它也只要以mkdir 命令即可。 通常我们会将spooling 目录以打印机的名称建立,如下所示: # mkdir /var/spool/printer-name 然而,如果在你的网络中有很多打印机的话,你也许会希望将所有的spooling 目录放 在一个LPD 专用的目录下。以我们的打印机rattan 和bamboo 为例: # mkdir /var/spool/lpd # mkdir /var/spool/lpd/rattan # mkdir /var/spool/lpd/bamboo 注意: 如果你关心的是使用者打印资料的隐私,那么你应该要将spooling 目录的权限 做适当的设置。Spooling 目录应该要属于daemon 这个使用者同时并允许它读、写及搜索, 而其它人都无法访问此目录。因此,我们应该要这样设置: 第13 页FreeBSD 使用手册 # chown daemon.daemon /var/spool/lpd/rattan # chown daemon.daemon /var/spool/lpd/bamboo # chmod 770 /var/spool/lpd/rattan # chmod 770 /var/spool/lpd/bamboo 最后,在/etc/printcap 文件里,你可以用sd 关键词来指定spooling 的目录: # # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo: 注意:打印机的名字一定是在定义第一行的第一个字,而其它行都要以TAB 缩进。如果 需要换行则需要在行末加上反斜线字符。 如果你没有用sd 指定spooling 目录,那么系统默认的spooling 目录将会是 /var/spool/lpd 。 11.3.1.4.4 识别打印机设备 在为通讯端口新增/dev 目录下的设备文件这一节里,我们在/dev 目录下选定了要给 FreeBSD 使用与打印机通讯的连接端口。现在我们要告诉LPD 这个信息。当spooling 系统 有工作要打印时,它将会告诉过滤程序(负责送资料给打印机)使用指定的设备。 在/etc/printcap 用lp 关键词指定使用/dev 下的设备名称。 在我们的例子中,我们设置rattan 使用第一个并口,而bamboo 使用第六个串口。因此 在/etc/printcap 中我们设置: # # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0: 第14 页FreeBSD 使用手册 bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5: 如果你在/etc/printcap 里没有用lp 关键词指定要使用哪个通讯端口,LPD 将会使用 /dev/lp 为默认的通讯端口。/dev/lp 目前在FreeBSD 中并不存在。 如果你现在安装的打印机是连接在并口上,那么请跳至安装文字过滤程序这一节,否 则,请按照下面这一节继续设置。 11.3.1.4.5 配置spooler 通讯参数 对于连接在串口上的打印机,LPD 设置的传输速率、同位检查、以及其它的通讯参数, 使得过滤程序能送资料到打印机上。这是较有利的。因为: 1. 你只要编辑/etc/printcap 就可以使用不同的通讯参数。不需要去重新编译你的过 滤程序。 2. 允许spooling 系统在多台打印机、多种不同通讯参数设置的情况下用同一个过滤 程序。 在/etc/printcap 设置文件里,下列关键词控制lp 所指定的通讯端口: br#bps-rate 设置通讯端口传输速度为bps-rate 其中bps-rate 可以是50、75、110 、134、150、 200、300、600、1200、1800、2400、4800、9600、19200 或是38400 bit-per-second。 fc#clear-bits 打开通讯端口后,清除sgttyb 结构里的标记位clear-bits。 fs#set-bits 设置sgttyb 结构里的标记位set-bits。 xc#clear-bits 打开通讯端口后,清除local 模式位clear-bits。 xs#set-bits 设置local 模式位set-bits。 第15 页FreeBSD 使用手册 关于fc、fs、xc 以及xs 关键词各个bit 的说明,请参考 /usr/include/sys/ioctl_compat.h。当LPD 打开由lp 所指定的通讯端口时,会先读取 sgttyb 这个结构,然后清掉fc 关键词所指定的位再设置由fs 关键词所指定的位。设置完 成后,才开始使用这个结构。同样的,对local 模式位设置也是以一样方式的处理。 让我们在我们的例子里为第六个串行端口设置这些位。我们会将传输速率设置成38400 bps。 而在标记位方面,我们会设置TANDEM、ANYP、LITOUT、FLUSHO 以及PASS8 这些位。而local 模式位,我们将设置LITOUT 以及PASS8 位: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000c1:xs#0x820: 11.3.1.4.6 安装文本过滤器 现在可以开始设置LPD 用什么文字过滤程序送工作给打印机。一个文字过滤程序也叫做 输入用过滤程序,当LPD 有东西要打印时,它就会执行这个程序。当LPD 运行这个程序时, 它会将过滤程序的标准输入设为要打印工作的标准输入,而过滤程序的标准输出则送给以 lp 关键词指定的通讯端口。因此过滤程序必需要能从标准输入读入要打印的东西,做适当 的处理后,将结果从标准输出送出。而这些输出就会被打出来。请参考过滤程序的运作方式 这一节以更进一步的了解过滤程序。 在我们的打印机设置里,文字过滤程序可能只是一个执行/bin/cat 命令的shell script 将工作送给打印机。FreeBSD 里有一个叫做lpf 的过滤程序能处理倒退、底线等打印机可能 无法正确处理的资料。当然,你也可以用任何你想用的过滤程序。关于lpf 这个过滤程序在 文字过滤程序:lpf 这一节里有更详细的说明。 首先, 让我们做一个简单的shell script 文字过滤程序, /usr/local/libexec/if-simple。用你熟悉的编辑器编辑这个文件: #!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. 第16 页FreeBSD 使用手册 /bin/cat && exit 0 exit 2 然后要让这个文件可执行: # chmod 555 /usr/local/libexec/if-simple 同时,在/etc/printcap 设置文件里用if 关键词告诉LPD 来使用这个过滤程序。在下面 的例子里,我们在/etc/printcap 中为两台打印机都指定了过滤程序: # # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\ :if=/usr/local/libexec/if-simple: 11.3.1.4.7 打开LPD lpd 从/etc/rc 运行,通过使用lpd_enable 来控制。默认是NO。如果你还没有启用它, 可以加入下面这行到/etc/rc.conf,然后重新启动电脑或只运行lpd: lpd_enable="YES" # lpd 11.3.1.4.8 测试 你已经把LDP 需要的设置都完成了。不过,我们需要测试看看这些设置是否可以正确地 工作。测试的方法就是打出一些东西。如果要用LPD 系统来打印,我们可以使用lpr 这个命 令来送出一些打印工作。 你可以使用检查打印机连接状况这一节里介绍的lpr 及lptest 来产生一些测试文字。 测试LPD 设置: 第17 页FreeBSD 使用手册 输入: # lptest 20 5 | lpr -Pprinter-name 其中printer-name 是/etc/printcap 里的某一台打印机名称或别名。如果要测试默认 的打印机,那么在执行lpr 命令时不要指定-P 这个参数。再一次的提醒,如果你要测试的 是PostScript 打印机,那么请传送PostScript 程序给打印机,而不要用lptest。你可以 将程序放在一个文件里然后输入lpr file。 如果是PostScript 打印机,你应该会得到程序输出的结果。如果你是用lptest 的话, 那么你的结果看起来应该是下面这个样子: !”#$%&’()*+,-./01234 “#$%&’()*+,-./012345 #$%&’()*+,-./0123456 $%&’()*+,-./01234567 %&’()*+,-./012345678 如果要做更进一步的测试,你可以下载更大的程序(给某个特定打印机语言的打印机使 用)或是在执行lptest 时加一些额外的参数。例如lptest 80 60 将会产生60 行每行80 个 字符的测试数据。 如果打印机并没有反应,请参考疑难解答这一节。 11.3.1.4.9 疑难解答 用lptest 做过简单的测试后,你可能会遇到下列的问题。打印机打了一阵子,但是并 没有输出任何结果。 打印机打出上面所列的东西,但是没多久就停了。这时,你可能需要按打印机上的PRINT REMAINING 或FORM FEED 钮才看得到输出的结果。 如果是这种情况的话,打印机在打印前可能在等待是否还有更多的资料要打印。要解决 这个问题,你可以让你的文字过滤程序送出FORM FEED 字符(或是其它需要的字符)给打印机。 这个动作让打印机打出目前打印机缓存区里的资料。同时也确定每个工作的最后一页可以完 整的输出,使得下个工作不会从前一个工作的最后一页中间输出。 下面这个shell script 取代/usr/local/libexec/if-simple。将工作送给打印机后, 会再送出一个form feed 字符: #!/bin/sh 第18 页FreeBSD 使用手册 # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. # Writes a form feed character (\f) after printing job. /bin/cat && printf “\f” && exit 0 exit 2 打出了“阶梯效应”。 你的结果可能是这个样子: !”#$%&’()*+,-./01234 “#$%&’()*+,-./012345 #$%&’()*+,-./0123456 这时你已经成为因为换行字符冲突而产生的阶梯效应受害者。UNIX 风格的操作系统只 使用ASCII 码10,line feed (LF) 作为换行字符。MS-DOS、OS/2 以及其它的操作系统使用 两个字符ASCII 码10 以及ASCII 码13 (称做carriage return 或CR)。很多打印机使用MS-DOS 的表示法来代表换行字符。 当你用FreeBSD 打印时,你的文件只用line feed 字符换行。当打印机看到一个line feed 字符时,将纸卷了一行,仍然从同一个位置继续往后打印。这就是为什么要用carriage return 字符的原因:将下一个字的打印位置移到纸张的最左边。 FreeBSD 希望你的打印机可以: 打印机收到CR 打印机打印CR 打印机收到LF 打印机打印CR + LF 有一些方法可以达到这个目地: 1. 用打印机上的开关或控制面板设置这些字符的处理方式。请查阅你的打印机手册并做正 确的设置。 注意: 如果你的计算机安装了除了FreeBSD 外的操作系统,你也许得常常重新 设置打印机处理CR 和LF 的设置。因此,你可能会希望使用下面其中之一的方 第19 页FreeBSD 使用手册 法: 2. 让FreeBSD 的串口驱动程序自动将LF 转换成CR+LF。当然,你的打印机只能在串行口 上。如果要打开这个功能,只要在/etc/printcap 设置文件里为你的打印机用fs 关键词设 置CRMOD 这个位即可。 3. 送一个句柄给打印机告诉它暂时把LF 字符做额外的处理。请参阅你的打印机手册以了 解你的打印机是否支持此功能。如果你找到适用的句柄,修改你的文字过滤程序先送出这些 句柄,再送出要打印的工作。 下面这个文字过滤程序的例子是使用Hewlett-Packard PCL 句柄。先让打印机将LF 视 为LF 和CR 处理,再送出工作。最后,再送出将整页送出的句柄。这个过滤程序应该可以应 付大部分Hewlett-Packard 的打印机。 #!/bin/sh # # hpif - Simple text input filter for lpd for HP-PCL based printers # Installed in /usr/local/libexec/hpif # # Simply copies stdin to stdout. Ignores all filter arguments. # Tells printer to treat LF as CR+LF. Ejects the page when done. printf “\033&k2G” && cat && printf “\033&l0H” && exit 0 exit 2 而下面这个/etc/printcap 的例子是设置一台叫做orchid 计算机。它在第一个并口连 接了一台叫做teak 的Hewlett-Packard LaserJet 3Si 打印机。同时,它使用了上述的script 作为它的文字过滤程序: # # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\ :if=/usr/local/libexec/hpif: 第20 页每一行都重迭在一起 打印机从不换行,把每一行都印在同一行上。这个问题和上述的阶梯效应“相反”。而 且也较罕见。FreeBSD 用来换行的LF 字符被当成CR 字符使得打印机一直回到纸张的最左边 开始打印但却不换行。使用打印机上的设置开关或是控制面板设置使LF 和CR 字符这样被处 理: 打印机会少打某些字 打印时,打印机在一行之中会少打某些字。这个情况在打印时可能会变得愈来愈严重, 有愈来愈多的字打不出来。这是因为打印机接收资料的速度无法跟上计算机通过串行端口送 资料的速度(这个问题在并列端口打印机上应该不会发生)。有两种方式可以解决这个问题: 1. 如果打印机支持XON/XOFF 流量控制,在FreeBSD 里可以用fs 关键词来设置TANDEM 位。 2. 如果打印机支持carrier 流量控制,用fs 关键词来设置MDMBUF 位。确定连接打印机及 计算机的连接线可以配合carrier 流量控制使用。 3. 如果打印机不支持任何一种流量控制,那么在fs 关键词里试着设置NLDELAY、TBDELAY、 CRDELAY、VTDELAY 以及BSDELAY 等位的组合以适当的延迟资料送到打印机。 打出乱码 打印机打出看不懂的符号,而不是我们期望中的数据。这通常是因为序列打印机的通讯 参数设置不正确而造成的。再检查一次br 关键词所设置的传输速率、fs 及fc 关键词所设置 的同位检查。同时也检查打印机是否也使用与/etc/printcap 文件里相同的设置。 没有任何动作发生 如果没有任何反应,那么可能是FreeBSD 的问题而不是硬件的问题。为你的打印机在 /etc/printcap 设置文件里设置记录文件(使用lf 关键词)。下面的例子是用lf 为rattan 这台打 印机设置记录文件: rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ FreeBSD 使用手册 打印机打印打印机收到 CR CR CR + LF LF 第21 页FreeBSD 使用手册 :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple:\ :lf=/var/log/rattan.log 然后试着再打印一次,并检查记录文件(在我们的例子里,是/var/log/rattan.log 这个文 件)里是否有出现错误信息。然后根据错误信息来解决你的问题。 如果你没有用lf 指定记录文件,LPD 默认是/dev/console 将错误信息输出。 |
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.