aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/handbook/printing
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2004-09-26 05:20:38 +0000
committerHiroki Sato <hrs@FreeBSD.org>2004-09-26 05:20:38 +0000
commit8f1c859fcb214c414fa6913292f585a4879d7655 (patch)
treec62e773df353dd15d663bcea872797a02a9c37cb /zh_CN.GB2312/books/handbook/printing
parent3e941311cb2ef8bb1151068e4f8f6ab382975287 (diff)
Notes
Diffstat (limited to 'zh_CN.GB2312/books/handbook/printing')
-rw-r--r--zh_CN.GB2312/books/handbook/printing/Makefile16
-rw-r--r--zh_CN.GB2312/books/handbook/printing/chapter.sgml1707
2 files changed, 1723 insertions, 0 deletions
diff --git a/zh_CN.GB2312/books/handbook/printing/Makefile b/zh_CN.GB2312/books/handbook/printing/Makefile
new file mode 100644
index 0000000000..80ce214947
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/printing/Makefile
@@ -0,0 +1,16 @@
+#
+# Build the Handbook with just the content from this chapter.
+#
+# Original Revision: 1.1
+# $FreeBSD$
+#
+
+CHAPTERS= printing/chapter.sgml
+
+VPATH= ..
+
+MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
+
+DOC_PREFIX?= ${.CURDIR}/../../../..
+
+.include "../Makefile"
diff --git a/zh_CN.GB2312/books/handbook/printing/chapter.sgml b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
new file mode 100644
index 0000000000..5f5917ba96
--- /dev/null
+++ b/zh_CN.GB2312/books/handbook/printing/chapter.sgml
@@ -0,0 +1,1707 @@
+<!--
+ The FreeBSD Documentation Project
+ The FreeBSD Simplified Chinese Project
+
+ Original Revision: 1.88
+ $FreeBSD$
+-->
+
+<chapter id="printing">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Sean</firstname>
+ <surname>Kelly</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ <!-- 30 Sept 1995 -->
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname>
+ <surname>Mock</surname>
+ <contrib>Restructured and updated by </contrib>
+ <!-- Mar 2000 -->
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>打印</title>
+
+ <sect1 id="printing-synopsis">
+ <title>概述</title>
+ <indexterm><primary>LPD spooling system</primary></indexterm>
+ <indexterm><primary>printing</primary></indexterm>
+
+ <para>FreeBSD 可以支持众多种类的打印机,
+ 从最古老的针式打印机到最新的激光打印机以及它们之间所有类型的打印机。
+ 您可以使运行的应用程序产生高质量的打印输出。</para>
+
+ <para>FreeBSD 也可以被设置成一个网络上的打印服务器。 它可以从包括
+ FreeBSD、 &windows; 及 &macos; 在内的多种其他主机上接收打印任务。
+ FreeBSD 将保证任务在某时被打印, 并且可以把哪台机器, 哪位用户打印的最多记录在统计表中,
+ 生成 <quote>横幅</quote> 页, 显示哪份打印输出的是哪位用户的等等。</para>
+
+ <para>在读完这章后,您将知道:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>怎样配置FreeBSD打印池。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样安装打印过滤器来对特殊的打印任务做特殊的处理,
+ 包括把传来的文档转换成打印机能理解的格式。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样在打印输出上开启报头或者横幅页功能。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样打印到连接在其他计算机上的打印机。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样打印到直接连接在网络上的打印机。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样控制打印机的限制, 包括限制打印任务的大小和阻止某些用户打印。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样记录打印机统计表和使用情况。</para>
+ </listitem>
+
+ <listitem>
+ <para>怎样解决打印故障。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>在读这章之前, 您应该:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>知道怎样配置并安装新内核
+ (<xref linkend="kernelconfig">)。 </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="printing-intro-spooler">
+ <title>介绍</title>
+
+ <para>为了在FreeBSD中使用打印机,
+ 您需要将伯克利行式打印机打印池系统即<application>LPD</application>
+ 打印池系统设置好。
+ 它是FreeBSD的标准打印控制系统。 这章介绍<application>LPD</application>
+ 打印池系统, 经常简称<application>LPD</application>,
+ 并且将指导您贯穿它的配置。</para>
+
+ <para>如果您已经熟悉了
+ <application>LPD</application>或者其他打印池系统, 您可以跳到<link
+ linkend="printing-intro-setup">设置打印池系统</link>这部分。</para>
+
+ <para><application>LPD</application>完全控制一台主机的打印机。
+ 它负责许多的事情:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>它控制本地和连接在网络上其他主机上的打印机的访问。</para>
+ </listitem>
+
+ <indexterm><primary>print jobs</primary></indexterm>
+ <listitem>
+ <para>它允许用户提交要打印的文件;
+ 这些通常被认为是<emphasis>任务</emphasis>。</para>
+ </listitem>
+
+ <listitem>
+ <para>它为每个打印机维护一个<emphasis>队列</emphasis>来防止多个用户在同一时刻访问一台打印机。</para>
+ </listitem>
+
+ <listitem>
+ <para>它可以打印<emphasis>报头</emphasis>(也叫做<emphasis>banner</emphasis>或者<emphasis>
+ burst</emphasis>页使用户可以轻松的从一堆打印输出中找到它们打印的任务。</para>
+ </listitem>
+
+ <listitem>
+ <para>它来设置连接在串口上的打印机的通讯参数。</para>
+ </listitem>
+
+ <listitem>
+ <para>它能通过网络将任务发送到另外一台主机的
+ <application>LPD</application>打印池中。</para>
+ </listitem>
+
+ <listitem>
+ <para>它可以根据不同种类的打印机语言和打印机的性能运行特殊的过滤器来格式化任务。</para>
+ </listitem>
+
+ <listitem>
+ <para>它记录打印机的使用情况。</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>通过配置文件
+ (<filename>/etc/printcap</filename>)和提供的特殊过滤程序,
+您可以使<application>LPD</application>
+ 系统在众多种类的打印机硬件上完成上面全部的或者一些子集的功能。</para>
+
+ <sect2 id="printing-intro-why">
+ <title>为什么要用打印池</title>
+
+ <para>如果您是系统唯一的用户, 您可能会奇怪为什么要在您不需要访问控制,
+ 报头页或者打印机使用统计时为打印池费心。
+ 它可以设置成允许直接访问打印机, 但您还是应该使用打印池, 因为:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><application>LPD</application>在后台打印任务; 您不用被迫等待数据被完全拷贝到打印机的时间。</para>
+ </listitem>
+
+ <indexterm><primary>&tex;</primary></indexterm>
+ <listitem>
+
+ <para><application>LPD</application>可以可以方便的通过过滤器给任务加上日期/
+ 时间的页眉或者把一种特殊的文件格式 (比如&tex; DVI 文件) 转换成一种打印机可以理解的格式。 您不必去手动做这些步骤。</para>
+ </listitem>
+
+ <listitem>
+ <para>许多提供打印功能的免费和商业程序想要和您系统上的打印池通讯。
+ 通过设置打印池系统, 您将更轻松的支持其他以后要添加的或者现有的软件。</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-intro-setup">
+ <title>基本设置</title>
+
+ <para>要想在<application>LPD</application>打印池
+ 系统上使用打印机, 您需要
+ 设置打印机硬件和
+ <application>LPD</application>软件。 这个
+ 文档描述了这两级设置: </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>参见<link linkend="printing-simple">简单打印机
+ 设置</link>来了解怎样连接一个打印机, 告诉
+ <application>LPD</application>怎样与
+ 它通讯, 并且打印纯文本到
+ 打印机。 </para>
+ </listitem>
+
+ <listitem>
+ <para>参见<link linkend="printing-advanced">高级
+ 打印机设置</link>来了解怎样打印多种
+ 特殊格式的文件, 怎样打印报头页, 怎样通过网络
+ 打印, 怎样控制打印机的访问权限, 并且学会为打印
+ 作业记帐统计。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <sect2 id="printing-simple">
+ <title>简单打印机设置</title>
+
+ <para>这部分讲解怎样配置打印机硬件和
+ <application>LPD</application>使之与打印机配合。
+ 讲解的基础知识有: </para>
+
+ <itemizedlist>
+ <listitem>
+ <para><link linkend="printing-hardware">硬件
+ 设置</link>部分将讲解怎样把一台打印机连接到
+ 您计算机的一个端口上。 </para>
+ </listitem>
+
+ <listitem>
+ <para><link linkend="printing-software">软件
+ 设置</link>部分将讲解怎样配置
+ <application>LPD</application>打印池的配置
+ 文件 (<filename>/etc/printcap</filename>)。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>如果您正在设置一台通过网络协议
+ 接收数据来打印而不是通过串行或者并行界面的打印机,
+ 参见<link linkend="printing-advanced-network-net-if">使用
+ 网络数据流界面的打印机</link>。 </para>
+
+ <para>尽管这部分叫<quote>简单打印机
+ 设置</quote>, 但还是相当复杂的。 使打印机
+ 配合和<application>LPD</application>
+ 打印池在计算机上正常运转是最难的
+ 部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐,
+ 是相当简单的。 </para>
+
+ <sect3 id="printing-hardware">
+ <title>硬件设置</title>
+
+ <para>这部分讲述了打印机连接到计算机的多种
+ 途径。 主要讨论了多种接口和
+ 连接线, 还有允许 FreeBSD 与打印机通讯所需的
+ 内核配置。 </para>
+
+ <para>如果您已经连接好了您的打印机而且已经
+ 用它在另外一个操作系统下成功的打印, 您
+ 或许可以跳到这个部分<link
+ linkend="printing-software">软件设置</link>。 </para>
+
+ <sect4 id="printing-ports">
+ <title>端口和连接电缆</title>
+
+ <para>现在所出售的在 PC 上使用的打印机通常至少有
+ 以下三种接口中的一个: </para>
+
+ <itemizedlist>
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>serial</secondary>
+ </indexterm>
+ <listitem>
+ <para><emphasis>串行</emphasis>接口, 也叫
+ RS232C, RS232D 或者 COM 口, 使用您计算机上的
+ 串口来发送数据到打印机。 串行
+ 接口在计算机上已经非常普遍, 而且电缆
+ 也非常容易买到且容易制作。 串行
+ 接口有时需要特殊的电缆, 而且可能需要
+ 您去配置稍微有点儿复杂的通讯
+ 选项。 大多数 PC 的串口的最高
+ 传输速度只有 115200&nbsp;bps, 这使得打印
+ 很大的图像需要的时间很长。 </para>
+ </listitem>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>parallel</secondary>
+ </indexterm>
+ <listitem>
+ <para><emphasis>并行</emphasis>界面使用
+ 计算机上的并口来发送数据到
+ 打印机。 并行接口在计算机上也已经非常普遍
+ 而且速度高于 RS232 串行界面。
+ 电缆非常容易买到, 但很难手工
+ 制作。 并行接口通常没有
+ 通讯选项, 这使得
+ 配置它相当简单。 </para>
+
+ <indexterm>
+ <primary>centronics</primary>
+ <see>parallel printers</see>
+ </indexterm>
+ <para>并口按打印机上的接头来命名也叫做
+ <quote>Centronics</quote>接口
+ 。 </para>
+ </listitem>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>USB</secondary>
+ </indexterm>
+ <listitem>
+ <para>USB 接口, 即通用串行
+ 总线, 可以达到比并口和串口
+ 高很多的速度。 而电缆简单又便宜。
+ USB 用来打印比串口和并口
+ 更有优势, 但是 &unix;
+ 系统不能很好的支持它。 避免这个问题的方法就是购买一台
+ 像大多数打印机一样的即有 USB 接口又有并口的
+ 打印机。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>一般来说并口只提供
+ 单向通讯( 计算机到打印机), 而串口
+ 和 USB 则可以提供双向通讯。 新的并口( EPP and
+ ECP) 和打印机
+ 在使用了 IEEE1284 标准的电缆之后, 可以在FreeBSD下
+ 双向通讯。 </para>
+
+ <indexterm><primary>PostScript</primary></indexterm>
+
+ <para>与打印机通过并口双向通讯
+ 通常由这两种方法中的一种来完成。 第一个方法是
+ 使用为 FreeBSD 编写的可以通过打印机使用的语言
+ 与打印机通讯的驱动程序。 这通常
+ 用在喷墨打印机上, 并且可以用来报告
+ 剩余墨水多少和其他状态信息。 第二种方法
+ 使用在支持
+ &postscript; 的打印机上。 </para>
+
+ <para>&postscript; 任务
+ 事实上由程序发送给打印机; 但它并不进行打印
+ 而是直接将结果返回给计算机。
+ &postscript; 也采取双向通讯来将打印中的问题
+ 报告给计算机, 比如 &postscript; 程序中的错误
+ 或者打印机卡纸。 这些信息对于用户来说也许是非常
+ 有价值的。 此外, 最好的在支持
+ &postscript; 的打印机上记帐的方法需要双向
+ 通讯: 询问打印机打印总页数 ( 打印机
+ 从出厂一共打印过多少页 ), 然后发送
+ 用户的任务, 之后再次查询总打印页数。 将打印前后得到
+ 的两个值相减就可以得到该用户要付多少
+ 纸钱。 </para>
+ </sect4>
+
+ <sect4 id="printing-parallel">
+ <title>并口</title>
+
+ <para>用并口连接打印机需要用
+ Centronics 电缆把打印机与计算机连接起来。
+ 具体说明指导应该在打印机, 计算机的说明书上有, 或者
+ 干脆两个上面都有。 </para>
+
+ <para>记住您用的计算机上的哪个并口。
+ 第一个并口在 FreeBSD 上叫 <filename>/dev/ppc0</filename>
+ ; 第二个叫 <filename>/dev/ppc1</filename>, 依此
+ 类推。 打印机设备也用同样的方法命名:
+ <filename>/dev/lpt0</filename> 是连接在第一个并口
+ 上的打印机, 依此类推。 </para>
+ </sect4>
+
+ <sect4 id="printing-serial">
+ <title>串口</title>
+
+ <para>用串口连接打印机需要用
+ 合适的串口电缆把打印机与计算机连接起来。 具体
+ 说明指导应该在打印机, 计算机的说明书上有, 或者
+ 同样干脆两个上面都有。 </para>
+
+ <para>如果您不确定什么样儿的电缆才是 <quote> 合适的串口
+ 电缆 </quote> , 您可以尝试以下几种不同的
+ 电缆: </para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>调制解调器</emphasis> 电缆每一端的
+ 每一根引脚都直接连接到另一端
+ 相应的引脚
+ 上。 这种电缆也叫做
+ <quote>DTE-to-DCE</quote> 电缆。 </para>
+ </listitem>
+
+ <indexterm><primary>null-modem cable</primary></indexterm>
+ <listitem>
+ <para><emphasis>非调制解调器</emphasis>电缆上每一端的有些引脚
+ 是与另一端相应引脚直接连接的, 而有一些则是交叉连接的 (比如, 发送数据引脚连接到
+ 接收数据引脚 ), 还有一些引脚直接在电缆连接头儿内
+ 短接。 这种电缆也叫做
+ <quote>DTE-to-DTE</quote> 电缆。 </para>
+ </listitem>
+
+ <listitem>
+ <para>一些特殊的打印机需要的<emphasis>串行打印机</emphasis> 电缆,
+ 是一种和非调制解调器电缆类似的电缆,
+ 只是一些信号还是送到了另一端, 而
+ 不是直接在连接头儿内短路。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <indexterm><primary>baud rate</primary></indexterm>
+ <indexterm><primary>parity</primary></indexterm>
+ <indexterm><primary>flow control protocol</primary></indexterm>
+ <para>当然, 您还得为打印机设置通讯参数。
+ 一般是通过打印机面板上的按钮或者 DIP
+ 开关进行设置。 在计算机和打印机上都选择它们所支持的最高
+ <literal>波特</literal> (每秒多少比特, 有时也叫
+ <emphasis>波特率</emphasis>) 的传输速率。
+ 选择7或者8个数据位; 选择不校验,
+ 偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量
+ 控制协议: 无, XON/XOFF (也叫做
+ <quote>in-band</quote> 或 <quote>软件</quote>) 流量控制。
+ 记住您的软件配置中的参数也要设成上面的
+ 数值。 </para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-software">
+ <title>软件设置</title>
+
+ <para>这部分描述了要使用FreeBSD系统中的
+ <application>LPD</application> 打印池进行打印所需的软件设置。
+ </para>
+
+ <para>包括这几个步骤: </para>
+
+ <procedure>
+ <step>
+ <para>在需要的时候配置内核来允许您连接
+ 打印机的端口; <link
+ linkend="printing-kernel">配置内核</link> 部分会告诉您
+ 需要做什么。 </para>
+ </step>
+
+ <step>
+ <para>如果您使用并口, 则需要设置一下
+ 并口的通讯模式; <link
+ linkend="printing-parallel-port-mode">设置
+ 并口通讯模式</link> 部分会告诉您具体的
+ 细节。 </para>
+ </step>
+
+ <step>
+ <para>测试操作系统是否能够发送数据到打印机。
+ <link linkend="printing-testing">检测打印机
+ 联机状况</link> 部分会告诉您要怎样
+ 做。 </para>
+ </step>
+
+ <step>
+ <para>为 <application>LPD</application> 设置与打印机匹配的参数则
+ 通过修改
+ <filename>/etc/printcap</filename> 这个文件来完成。 这章后面
+ 的部分将讲解如何来完成设置。 </para>
+ </step>
+ </procedure>
+
+ <sect4 id="printing-kernel">
+ <title>配置内核</title>
+
+ <para>操作系统的内核为了使某些特殊设备工作需要重新
+ 编译。 打印机所用的串口、
+ 并口就属于那些特殊设备。 因此, 可能需要
+ 添加对串口或并口的支持,
+ 如果内核并没有配置它们的话。 </para>
+
+ <para>要想知道您现在使用的内核是否支持串口,
+ 输入: </para>
+
+ <screen>&prompt.root; <userinput>grep sio<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen>
+
+ <para>其中 <replaceable>N</replaceable> 是串口的
+ 编号, 从0开始。 如果您看到
+ 类似下面的输出: </para>
+
+ <screen>sio2 at port 0x3e8-0x3ef irq 5 on isa
+sio2: type 16550A</screen>
+
+ <para>则说明您现在使用的内核支持串口。 </para>
+
+ <para>要想知道您现在使用的内核是否支持并口,
+ 输入: </para>
+
+ <screen>&prompt.root; <userinput>grep ppc<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen>
+
+ <para>其中 <replaceable>N</replaceable> 是并口的
+ 编号, 同样从0开始。 如果得到类似
+ 下面的输出: </para>
+
+ <screen>ppc0: &lt;Parallel port&gt; at port 0x378-0x37f irq 7 on isa0
+ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
+ppc0: FIFO with 16/16/8 bytes threshold</screen>
+
+ <para>那么您现在使用的内核支持并口。 </para>
+
+ <para>您可能必须为了使操作系统支持您打印机需要的串口或
+ 并口而
+ 重新配置内核。 </para>
+
+ <para>要增加对串口的支持, 参见
+ 内核配置这部分。 要增加对并口的支持, 除了参见
+ 上面提到的那部分之外, <emphasis>还要</emphasis> 参见下面的
+ 部分。 </para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-dev-ports">
+ <title>在 <filename>/dev</filename> 中为端口添加
+ 设备节点</title>
+
+ <note><para>FreeBSD&nbsp;5.0 支持 <literal>devfs</literal>
+ 这种在需要的时候自动添加设备节点
+ 的文件系统。 如果您正在使用的 FreeBSD 开启了
+ <literal>devfs</literal> 文件系统, 那么您可以安全的跳过
+ 这部分。 </para></note>
+
+ <para>尽管内核可能已经支持通过串口或者并口
+ 通讯, 但您还是需要一个软件接口
+ 来使您系统上的程序通过它发送和接收
+ 数据。 这也是
+ <filename>/dev</filename> 目录中那些设备节点的作用。 </para>
+
+ <para><emphasis>要在 <filename>/dev</filename> 中为端口添加
+ 一个设备节点: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>使用 &man.su.1; 命令切换到 <username>root</username> 帐号。
+ 在出现提示的时候输入 <username>root</username> 帐号的密码。 </para>
+ </step>
+
+ <step>
+ <para>将当前目录改变到 <filename>/dev</filename>
+ 目录: </para>
+
+ <screen>&prompt.root; <userinput>cd /dev</userinput></screen>
+ </step>
+
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>./MAKEDEV <replaceable>port</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>port</replaceable> 替换成
+ 您需要添加端口的节点名。 当打印机连接在第一个并口上时, 替换成
+ <literal>lpt0</literal> , 连接在第二个并口上时, 替换成
+ <literal>lpt1</literal> , 依此类推; 当打印机连接在第一个串口上时, 替换成
+ <literal>ttyd0</literal> , 连接在第二个串口上时, 替换成
+ <literal>ttyd1</literal> , 依此类推。 </para>
+ </step>
+
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>ls -l <replaceable>port</replaceable></userinput></screen>
+
+ <para>来检查设备节点是否正常建立。 </para>
+ </step>
+ </procedure>
+
+ <sect4 id="printing-parallel-port-mode">
+ <title>设置并口的通讯
+ 模式</title>
+
+ <para>在使用并口时, 您可以选择
+ 让 FreeBSD 用中断方式还是轮询方式来
+ 与打印机通讯。 在
+ FreeBSD&nbsp;4.X and 5.X 上, 通用的打印机驱动 (&man.lpt.4;)
+ 使用 &man.ppbus.4; 系统, 它由
+ &man.ppc.4; 驱动来控制端口芯片。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>中断</emphasis> 方式是
+ GENERIC 核心的默认方式。 在这种方式下,
+ 操作系统占用一条中断请求线来检测什么时候
+ 打印机做好接收数据的准备。 </para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>轮询</emphasis> 方式是
+ 操作系统反复不断的询问打印机是否做好
+ 接收数据的准备。 当它返回准备好时, 核心开始发送
+ 下面要发送的数据。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>中断方式速度通常会快一些,
+ 但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机
+ 不能正常的工作在中断模式下,
+ 是由于一些定时问题 (还没正确的理解)
+ 造成的。 这些打印机需要使用轮询方式。 您应该使用
+ 任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以
+ 工作, 但在中断模式下会慢的要命。 </para>
+
+ <para>您可以用以下两种方法设定通讯模式: 通过
+ 配置内核或者使用 &man.lptcontrol.8;
+ 这个程序。 </para>
+
+ <para><emphasis>要通过配置内核的方法设置
+ 通讯模式: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>修改内核配置文件。 找到
+ 一个叫 <literal>ppc0</literal> 的记录。 如果您想要设置的是
+ 第二个并口, 那么用 <literal>ppc1</literal>
+ 代替。 使用第三个并口的时候用 <literal>ppc2</literal> 代替,
+ 依此类推。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如果您想要使用中断方式, 在 FreeBSD&nbsp;4.X 下的方法是指定一个
+ <literal>irq</literal> : </para>
+
+ <programlisting>device ppc0 at isa? irq <replaceable>N</replaceable></programlisting>
+
+ <para>其中 <replaceable>N</replaceable> 是计算机并口
+ 的中断编号。 </para>
+
+ <para>在 FreeBSD&nbsp;5.X 下, 修改下面这一行: </para>
+
+ <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting>
+
+ <para>它在 <filename>/boot/device.hints</filename> 这个文件中,
+ 其中 <replaceable>N</replaceable> 用正确的中断
+ 编号代替。 同时, 核心配置文件也必须
+ 包括 &man.ppc.4; 的驱动: </para>
+
+ <screen>device ppc</screen>
+
+ </listitem>
+
+ <listitem>
+ <para>如果您想要使用轮询方式, 则不用指定
+ <literal>irq</literal> : </para>
+
+ <para>在 FreeBSD&nbsp;4.X 下, 在内核配置文件中使用下面
+ 这行: </para>
+
+ <programlisting>device ppc0 at isa?</programlisting>
+
+ <para>在 FreeBSD&nbsp;5.X 下, 只需要把
+ <filename>/boot/device.hints</filename> 这个文件中的下面这行
+ 删除掉: </para>
+
+ <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting>
+
+ <para>在
+ FreeBSD&nbsp;5.X 下, 有时上面的方法并不能使并口工作在轮询方式。 大多数
+ 情况是由于 &man.acpi.4; 驱动造成的, 它
+ 可以自动侦测到设备并将其挂载到系统上, 但也因此,
+ 它控制着打印机端口的访问模式. 您
+ 得检查 &man.acpi.4; 的配置来
+ 解决这个问题。 </para>
+ </listitem>
+ </itemizedlist>
+ </step>
+
+ <step>
+ <para>保存文件。 然后配置, 建立, 并安装刚配置的
+ 内核, 最后重新启动。 参见 <link
+ linkend="kernelconfig">内核配置</link> 这章来获得
+ 更多细节。 </para>
+ </step>
+ </procedure>
+
+ <para><emphasis>使用</emphasis>
+ &man.lptcontrol.8; <emphasis>设置通讯模式</emphasis> : </para>
+
+ <procedure>
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>lptcontrol -i -d /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>将
+ <literal>lpt<replaceable>N</replaceable></literal> 设置成中断方式。 </para>
+ </step>
+
+ <step>
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>lptcontrol -p -d /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>将
+ <literal>lpt<replaceable>N</replaceable></literal> 设置成轮询方式。 </para>
+ </step>
+ </procedure>
+
+ <para>您可以把这些命令加入到
+ <filename>/etc/rc.local</filename> 这个文件中, 这样每次启动系统
+ 时都会设置成您想要的方式。 参见 &man.lptcontrol.8; 来获得
+ 更多信息。 </para>
+ </sect4>
+
+ <sect4 id="printing-testing">
+ <title>检测打印机的通讯</title>
+
+ <para>在设置打印池系统之前, 您
+ 应该确保您的计算机可以把数据
+ 发送到打印机上。 分别独立调试打印机的通讯和打印池系统
+ 会更简单。 </para>
+
+ <para>我们为了测试打印机,将发送一些文本给它。 一个叫 &man.lptest.1;
+ 的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的
+ 字符: 它在每行打出
+ 可以打印的 96 个 ASCII 字符。 </para>
+
+ <indexterm><primary>PostScript</primary></indexterm>
+ <para>当我们使用的是一台 &postscript; ( 或者以其他语言为基础的 ) 打印机, 那么
+ 需要更仔细的检测。 一段小小的 &postscript;
+ 程序足以完成检测的任务, 比如下面这段程序: </para>
+
+ <programlisting>%!PS
+100 100 moveto 300 300 lineto stroke
+310 310 moveto /Helvetica findfont 12 scalefont setfont
+(Is this thing working?) show
+showpage</programlisting>
+
+ <para>可以把上面这段 &postscript; 代码写进一个文件里,
+ 并且像下面部分的例子里那样
+ 使用。 </para>
+
+ <indexterm><primary>PCL</primary></indexterm>
+ <note>
+ <para>上面的小程序是基于
+ &postscript; 写成的, 而不是惠普
+ 的 PCL 。 尽管 PCL 拥有强大的功能, 比如
+ 您可以在打印纯文本的同时夹带着特殊的命令。
+ &postscript; 不能直接打印纯文本, 所以
+ 这类打印机语言是我们要特殊照顾的
+ 对象。 </para>
+ </note>
+
+ <sect5 id="printing-checking-parallel">
+ <title>检测并口打印机</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>parallel</secondary>
+ </indexterm>
+ <para>这部分内容将指导您怎样检测FreeBSD是否
+ 可以与一台已经连接在并口上的打印机
+ 通讯。 </para>
+
+ <para><emphasis>要测试并口上的
+ 打印机: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>用 &man.su.1; 命令转换到 <username>root</username> 用户。 </para>
+ </step>
+
+ <step>
+ <para>发送数据到打印机。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如果打印机可以直接打印纯文本, 可以用
+ &man.lptest.1; 。 输入: </para>
+
+ <screen>&prompt.root; <userinput>lptest &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>N</replaceable> 是并口的
+ 编号, 从0开始。 </para>
+ </listitem>
+
+ <listitem>
+ <para>如果打印机支持 &postscript; 或者
+ 其他打印机语言, 可以发送一段小程序到
+ 打印机。 输入: </para>
+
+ <screen>&prompt.root; <userinput>cat &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>然后, 一行一行的 <emphasis>输入</emphasis> 输入
+ 这段程序。 因为在按下 <literal>换行</literal> 或者
+ <literal>回车</literal> 之后, 这一行就不能再修改了。
+ 当您输入完
+ 这段程序之后, 按
+ <literal>CONTROL+D</literal>, 或者其他
+ 表示文件结束的键。 </para>
+
+ <para>另外一种办法, 您可以把这段程序写在一个文件
+ 里并输入: </para>
+
+ <screen>&prompt.root; <userinput>cat <replaceable>file</replaceable> &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>file</replaceable> 是
+ 包含这您要发给打印机程序的
+ 文件名。 </para>
+ </listitem>
+ </itemizedlist>
+ </step>
+ </procedure>
+
+ <para>之后, 您应该看到打印出了一些东西。 如果打印出的东西
+ 看起来并不正确, 请不要着急; 我们将在后面指导您怎样
+ 解决这类问题。 </para>
+ </sect5>
+
+ <sect5 id="printing-checking-serial">
+ <title>检测串行打印机</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>serial</secondary>
+ </indexterm>
+ <para>这部分将告诉您如何检测FreeBSD是否可以与
+ 连接在串口上的打印机通讯。 </para>
+
+ <para><emphasis>要测试一个连接在串口上
+ 的打印机: </emphasis></para>
+
+ <procedure>
+ <step>
+ <para>通过 &man.su.1; 命令转换成 <username>root</username> 用户。 </para>
+ </step>
+
+ <step>
+ <para>修改 <filename>/etc/remote</filename> 这个文件。 增加
+ 下面这些内容: </para>
+
+ <programlisting>printer:dv=/dev/<replaceable>port</replaceable>:br#<replaceable>bps-rate</replaceable>:pa=<replaceable>parity</replaceable></programlisting>
+
+ <indexterm><primary>bits-per-second</primary></indexterm>
+ <indexterm><primary>serial port</primary></indexterm>
+ <indexterm><primary>parity</primary></indexterm>
+ <para>其中 <replaceable>port</replaceable> 是
+ 串口的设备节点 (<literal>ttyd0</literal>,
+ <literal>ttyd1</literal>, 等等。 ),
+ <replaceable>bps-rate</replaceable> 是
+ 与打印机通讯时使用的波特,
+ <replaceable>parity</replaceable> 是通讯时打印机要求
+ 的校验方法 (either <literal>even</literal>,
+ <literal>odd</literal>, <literal>none</literal>, or
+ <literal>zero</literal>)。 </para>
+
+ <para>这儿有一个串口打印机的例子,
+ 它连接在第三个串口上, 速度为 19200 &nbsp; 波特,
+ 不进行校验: </para>
+
+ <programlisting>printer:dv=/dev/ttyd2:br#19200:pa=none</programlisting>
+ </step>
+
+ <step>
+ <para>用 &man.tip.1; 连接打印机。
+ 输入: </para>
+
+ <screen>&prompt.root; <userinput>tip printer</userinput></screen>
+
+ <para>如果没能成功, 则要再次修改
+ <filename>/etc/remote</filename> 这个文件, 并且试试用
+ <filename>/dev/cuaa<replaceable>N</replaceable></filename>
+ 代替
+ <filename>/dev/ttyd<replaceable>N</replaceable></filename>。 </para>
+ </step>
+
+ <step>
+ <para>发送数据到打印机。 </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>如果打印机可以直接打印纯文本, 则用
+ &man.lptest.1; 。 输入: </para>
+
+ <screen>&prompt.user; <userinput>$lptest</userinput></screen>
+ </listitem>
+
+ <listitem>
+ <para>如果打印机支持 &postscript; 或者其他
+ 打印机语言, 则发送一段小程序到
+ 打印机。 一行一行的输入程序, 必须
+ <emphasis>非常仔细</emphasis> 因为像退格
+ 或者其他编辑键也许对打印机来说有它的
+ 意义。 您同样也需要按一个特殊的
+ 文件结束键, 让打印机知道它已经
+ 接收了整个程序。 对于 &postscript;
+ 打印机, 按 <literal>CONTROL+D</literal>。 </para>
+
+ <para>或者, 您同样也可以把程序存储在一个文件里
+ 并输入: </para>
+
+ <screen>&prompt.user; <userinput>&gt;<replaceable>file</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>file</replaceable> 是
+ 包含要发送程序的文件名。 在
+ &man.tip.1; 发送这个文件之后, 按代表
+ 文件结束的键。 </para>
+ </listitem>
+ </itemizedlist>
+ </step>
+ </procedure>
+
+ <para>您应该看到打印出了一些东西。 如果它们看起来
+ 并不正确也不要着急; 我们将在以后的部分中解决它。 </para>
+ </sect5>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-printcap">
+ <title>开启打印池: 文件 <filename>/etc/printcap</filename>
+ </title>
+
+ <para>目前, 您的打印机应该已经连好了线, 系统内核
+ 也为与打印机联机而重新配置好 ( 如果需要的话 ), 而且您也
+ 已经可以发送一些简单的数据到打印机。 现在, 我们要
+ 配置 <application>LPD</application> 来使其控制您的
+ 打印机。 </para>
+
+ <para>配置 <application>LPD</application> 要修改
+ <filename>/etc/printcap</filename> 这个文件。
+ <application>LPD</application> 打印池系统
+ 在每次打印池被使用的时候都会读取这个文件, 所以对这个文件
+ 的修改会立即生效。 </para>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>capabilities</secondary>
+ </indexterm>
+ <para> &man.printcap.5; 这个文件的格式很简单。
+ 您可以用您最喜欢的文本编辑器来修改
+ <filename>/etc/printcap</filename> 这个文件。 这种格式和其他的
+ 像
+ <filename>/usr/share/misc/termcap</filename> 和
+ <filename>/etc/remote</filename> 这类文件是一样的。 要得到完整的
+ 关于这种格式的信息, 参见 &man.cgetent.3; 。 </para>
+
+ <para>简单的打印池配置包括下面的几
+ 步: </para>
+
+ <procedure>
+ <step>
+ <para>为打印机起一个名字 ( 和一些方便的别名 )
+ , 然后把它们写进文件
+ <filename>/etc/printcap</filename> ; 参见
+ <link linkend="printing-naming">Naming the Printer</link>
+ 这章来得到更多的关于起名的帮助。 </para>
+ </step>
+
+ <indexterm><primary>header pages</primary></indexterm>
+ <step>
+ <para>关掉报头页 ( 它默认是打开的 ), 通过
+ 增加 <literal>sh</literal> 项目; 参见
+ <link linkend="printing-no-header-pages">Suppressing Header
+ Pages</link> 部分来得到更多信息。 </para>
+ </step>
+
+ <step>
+ <para>建立一个打印池缓冲的目录, 并且通过
+ <literal>sd</literal> 项目指定它的位置; 参见 <link
+ linkend="printing-spooldir">Making the Spooling
+ Directory</link> 部分来得到更多信息。 </para>
+ </step>
+
+ <step>
+ <para>在 <filename>/dev</filename> 下设置打印机设备
+ 节点, 并且在写在 <filename>/etc/printcap</filename>
+ 文件中 <literal>lp</literal> 项目里; 参见 <link
+ linkend="printing-device">识别打印机
+ 设备</link> 这部分得到更多信息。 还有, 如果打印机连接在
+ 串口上, 设置通讯参数要写在
+ <literal>ms#</literal> 项目中。 这些参数在 <link
+ linkend="printing-commparam">配置打印池
+ 通讯参数</link> 这部分已经讨论过。 </para>
+ </step>
+
+ <step>
+ <para>安装纯文本过滤器; 参见 <link
+ linkend="printing-textfilter">安装文本
+ 过滤器</link> 这章来得到细节。 </para>
+ </step>
+
+ <step>
+ <para>用
+ &man.lpr.1; 命令来测试设置。 想得到更多信息可以参见
+ <link linkend="printing-trying">测试</link> and
+ <link
+ linkend="printing-troubleshooting">疑难问题解答</link>
+ 部分。 </para>
+ </step>
+ </procedure>
+
+ <note>
+ <para>基于打印机语言的打印机, 比如 &postscript; 打印机,
+ 不能直接打印纯文本。 简单的设置方法在上面
+ 提到并且下面的部分也要讨论, 假如您正在
+ 安装这样一台只能打印它明白的文件的
+ 打印机。 </para>
+ </note>
+
+ <para>用户总是希望他们能在任何一个安装在他们系统的打印机上打印
+ 纯文本。 使用
+ <application>LPD</application> 接口的程序也通常这样
+ 希望。
+ 如果您正在安装这样一台打印机, 并且想要它能打印
+ 基于它支持的打印机语言的任务 <emphasis> 并且 </emphasis>
+ 还可以打印纯文本的任务, 那么强烈建议您在上面提到
+ 的简单设置的步骤上增加一步: 安装一个
+ 自动纯文本到 &postscript; ( 或者其他打印机语言 ) 的
+ 转化程序。 参见 <link
+ linkend="printing-advanced-if-conversion"> 在
+ &postscript; 打印机上打印纯文本 </link> 将得到
+ 更多有关信息。 </para>
+
+ <sect4 id="printing-naming">
+ <title>命名打印机</title>
+
+ <para>第一步 ( 简单 ) 就是给打印机起一个名字。
+ 您是按功能起名字还是干脆起个古怪的名字都没有关系,
+ 因为您可以给打印机设置许多的
+ 别名。 </para>
+
+ <para>在
+ <filename>/etc/printcap</filename> 里至少有一个打印机必须指定, 别名是
+ <literal>lp</literal>. 这是默认的打印机名。
+ 如果用户既没有 <envar>PRINTER</envar> 环境
+ 变量, 也没有在任何
+ <application>LPD</application> 命令的命令行中指定打印机名,
+ 则 <literal>lp</literal> 将是默认
+ 要使用的打印机。 </para>
+
+ <para>还有, 我们通常把最后一个别名设置成
+ 能完全描述打印机的名字, 包括厂家
+ 和型号。 </para>
+
+ <para>一旦您选好了名字或者一些别名, 把它们
+ 放进文件 <filename>/etc/printcap</filename> 里。 打印机的
+ 名字应该从最左边的一列写起。 用
+ 竖杠来隔开每个别名, 并且在最后一个别名后面
+ 加上一个冒号。 </para>
+
+ <para>在下面的例子中, 我们从一个基本的
+ <filename>/etc/printcap</filename> 开始, 它只定义了两台打印机
+ (一台 Diablo 630 行式打印机和一台 Panasonic KX-P4455 &postscript;
+ 激光打印机 ):</para>
+
+ <programlisting>#
+# /etc/printcap for host rose
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:</programlisting>
+
+ <para>在这个例子中, 第一台打印机被命名为
+ <literal>rattan</literal> 并且设置了
+ <literal>line</literal>, <literal>diablo</literal>,
+ <literal>lp</literal>, 和 <literal>Diablo 630 Line
+ Printer</literal> 这几个别名。 因为它被设置了
+ <literal>lp</literal> 这个别名, 所以它是默认打印机。 第二台
+ 被命名为 <literal>bamboo</literal>, 并且设置了
+ <literal>ps</literal>, <literal>PS</literal>,
+ <literal>S</literal>, <literal>panasonic</literal>, 和
+ <literal>Panasonic KX-P4455 PostScript v51.4</literal> 这几个别名。 </para>
+ </sect4>
+
+ <sect4 id="printing-no-header-pages">
+ <title>不打印报头页</title>
+ <indexterm>
+ <primary>printing</primary>
+ <secondary>header pages</secondary>
+ </indexterm>
+
+ <para> <application>LPD</application> 打印池系统默认
+ 会为每个任务打印
+ <emphasis>报头页</emphasis>。 报头页
+ 包含了发送这个任务的用户, 发送这个任务
+ 的主机, 任务的名字, 并用
+ 大字母打出。 但不幸的是, 所有这些额外的文本会妨碍
+ 在简单设置打印机时的除错, 所以我们将先
+ 不打印报头页。 </para>
+
+ <para>要暂停打印报头页, 为打印机的记录增加 <literal>sh</literal>
+ 标记, 在
+ <filename>/etc/printcap</filename> 文件中。 这儿有一个
+ <filename>/etc/printcap</filename> 文件中使用 <literal>sh</literal>
+ 的例子: </para>
+
+ <programlisting>#
+# /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:</programlisting>
+
+ <para>注意我们的正确格式: 第一行从
+ 最左边一列开始, 而后的每一行用
+ TAB 缩进一次。 一行写不下需要换行时, 在换行前打一个
+ 反斜杠。 </para>
+ </sect4>
+
+ <sect4 id="printing-spooldir">
+ <title>建立打印池目录</title>
+ <indexterm><primary>printer spool</primary></indexterm>
+ <indexterm><primary>print jobs</primary></indexterm>
+
+ <para>下一步设置就是要建立一个
+ <emphasis>打印池目录</emphasis>, 一个在任务被打印完
+ 之前存放任务的目录, 也有很多其他
+ 的打印池系统所用到的文件存在里面。 </para>
+
+ <para>由于打印池目录的变量本质, 通常
+ 把这些目录安排在
+ <filename>/var/spool</filename> 下。 您也没有必要去
+ 备份打印池目录里的内容。
+ 重新建立它们只要简单的使用 &man.mkdir.1; 命令。 </para>
+
+ <para>通常, 我们习惯将目录名起成和
+ 打印机一样的名字, 像下面
+ 这样: </para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/spool/<replaceable>printer-name</replaceable></userinput></screen>
+
+ <para>然而, 如果您有很多网络打印机,
+ 您可能想要把这些打印池目录放在一个单独的
+ 您专门为使用
+ <application>LPD</application> 打印而准备的目录里。 我们
+ 将用我们的两台打印机作为例子
+ <literal>rattan</literal> 和
+ <literal>bamboo</literal>:</para>
+
+ <screen>&prompt.root; <userinput>mkdir /var/spool/lpd</userinput>
+&prompt.root; <userinput>mkdir /var/spool/lpd/rattan</userinput>
+&prompt.root; <userinput>mkdir /var/spool/lpd/bamboo</userinput></screen>
+
+ <note>
+ <para>如果您在关心用户任务的保密
+ 性, 您可能想保护相应的打印池目录, 使它们
+ 不能被公开访问。 打印池
+ 目录应该被daemon用户拥有, 用户daemon和daemon组拥有读写和
+ 搜索的权限, 并且其他用户没有。
+ 我们将用我们的两台打印机作为例子:</para>
+
+ <screen>&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/rattan</userinput>
+&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/bamboo</userinput>
+&prompt.root; <userinput>chmod 770 /var/spool/lpd/rattan</userinput>
+&prompt.root; <userinput>chmod 770 /var/spool/lpd/bamboo</userinput></screen>
+ </note>
+
+ <para>最后, 您需要通过<filename>/etc/printcap</filename> 文件告诉 <application>LPD</application>
+ 这些
+ 目录。 您可以用 <literal>sd</literal> 标记来指定
+ 打印池目录的
+ 路径:</para>
+
+ <programlisting>#
+# /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:</programlisting>
+
+ <para>注意打印机的名字要从
+ 第1列开始, 其他记录每行都要
+ 用TAB键缩进一次, 写不开需要换行在最后加上反
+ 斜杠。 </para>
+
+ <para>如果您没用
+ <literal>sd</literal> 标记指定打印池目录, 打印池系统会将
+ <filename>/var/spool/lpd</filename> 目录作为默认目录。 </para>
+ </sect4>
+
+ <sect4 id="printing-device">
+ <title>识别打印机设备</title>
+
+ <para>在 <link linkend="printing-dev-ports">为端口在
+ <filename>/dev</filename> 目录下增加设备节点</link>
+ 章节中, 我们确定了使用
+ <filename>/dev</filename> 目录中的哪个节点来让 FreeBSD 与打印机
+ 通讯。 现在, 我们来告诉
+ <application>LPD</application> 这个
+ 信息。 当打印池系统有任务需要打印, 它
+ 将为过滤程序(负责传送数据到打印机)打开
+ 指定的设备。 </para>
+
+ <para>用 <literal>lp</literal> 标记在 <filename>/etc/printcap</filename> 里列出 <filename>/dev</filename>
+ 下的设备节点
+ 。</para>
+
+ <para>在我们的例子中, 假设打印机
+ <literal>rattan</literal> 在第一个并口上, 打印机
+ <literal>bamboo</literal> 在第六个串口上; 下面是
+ 要对 <filename>/etc/printcap</filename> 文件里增加的内容 :</para>
+
+ <programlisting>#
+# /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:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:</programlisting>
+
+ <para>如果您没在您的 <filename>/etc/printcap</filename> 文件中
+ 用 <literal>lp</literal> 标记指定设备节点,
+ <application>LPD</application> 将默认使用 <filename>/dev/lp</filename>
+ 。
+ <filename>/dev/lp</filename> 目前在
+ FreeBSD 中不存在。 </para>
+
+ <para>如果您正在安装的打印机是连接在
+ 并口上的, 请跳到 <link
+ linkend="printing-textfilter">安装文本
+ 过滤器</link> 这章。 如果不是的话, 还是最好按下面介绍的
+ 步骤做。 </para>
+ </sect4>
+
+ <sect4 id="printing-commparam">
+ <title>配置打印池通讯参数</title>
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>serial</secondary>
+ </indexterm>
+
+ <para>对于连在串口上的打印机, <application>LPD</application>
+ 可以为发送数据到打印机的过滤程序设置好波特率,
+ 校验, 和其他串口通讯参数
+ 。 这是有利的,
+ 因为:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>它可以让您只需简单的修改
+ <filename>/etc/printcap</filename> 就能尝试不同的通讯
+ 参数; 您并不需要去重新编译过滤器
+ 程序。 </para>
+ </listitem>
+
+ <listitem>
+ <para>它使得打印池系统可以在
+ 多台有不同串口通讯设置的打印机上使用
+ 相同的过滤器程序。 </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>下面这个 <filename>/etc/printcap</filename> 中
+ 用 <literal>lp</literal> 标记来控制列出设备的
+ 串口通讯参数 :</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><literal>br#<replaceable>bps-rate</replaceable></literal></term>
+
+ <listitem>
+ <para>设置设备的通讯速度为
+ <replaceable>bps-rate</replaceable>, 这里
+ <replaceable>bps-rate</replaceable> 可以为 50, 75, 110,
+ 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600,
+ 19200, 38400, 57600, or 115200 比特每秒.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ms#<replaceable>stty-mode</replaceable></literal></term>
+
+ <listitem>
+ <para>设置已打开的中端设备的选项
+ 。 &man.stty.1; 将详细
+ 讲述可用的选项。 </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>当 <application>LPD</application> 打开
+ 用 <literal>lp</literal> 指定的设备时, 它会
+ 将设备的特性设置成在
+ <literal>ms#</literal> 标记后指定的那样。 特别是
+ <literal>parenb</literal>,
+ <literal>parodd</literal>, <literal>cs5</literal>,
+ <literal>cs6</literal>, <literal>cs7</literal>,
+ <literal>cs8</literal>, <literal>cstopb</literal>,
+ <literal>crtscts</literal>, 和 <literal>ixon</literal>
+ 这些模式, 它们在 &man.stty.1;
+ 手册中有详细说明。 </para>
+
+ <para>我们举个例子来添加我们连在第6个串口上的
+ 打印机。 我们将设波特为38400。 至于模式,
+ 我们将用 <literal>-parenb</literal> 设置成不校验,
+ 用 <literal>cs8</literal> 设置成8位字符,
+ 用 <literal>clocal</literal> 设置成不要调制解调器控制,
+ 用 <literal>crtscts</literal> 设置成硬件流量控制: </para>
+
+ <programlisting>bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:</programlisting>
+ </sect4>
+
+ <sect4 id="printing-textfilter">
+ <title>安装文本过滤器</title>
+ <indexterm>
+ <primary>printing</primary>
+ <secondary>filters</secondary>
+ </indexterm>
+
+ <para>我们现在准备告诉 <application>LPD</application>
+ 使用什么文本过滤器
+ 给打印机发送任务。 <emphasis> 文本过滤器</emphasis>,
+ 也叫 <emphasis> 输入过滤器</emphasis>, 是一个
+ 在 <application>LPD</application> 有一个任务要发给
+ 打印机时运行的程序。 当 <application>LPD</application>
+ 为打印机运行文本过滤器时, 它设置过滤器的
+ 标准输入为要发给打印机的任务, 而标准输出为
+ 用 <literal>lp</literal> 标记指定的打印机
+ 。 过滤器先从标准输入读取
+ 任务, 为打印机进行一些转换
+ , 并将结果写到标准输出, 这些结果
+ 将被打印。 想得到更多关于文本过滤器的信息, 见
+ <link linkend="printing-advanced-filters">过滤器</link>
+ 这节。 </para>
+
+ <para>对于简单的打印机设置, 文本过滤器可以仅仅是一段
+ 执行 <command>/bin/cat</command> 的 shell 脚本来
+ 发送任务到打印机。
+ FreeBSD 还提供了一个叫做
+ <filename>lpf</filename> 的过滤器, 它可以处理退格和下划线来
+ 使那些可能不能很好处理这类字符流的打印机正常工作。
+ 而且, 当然, 您可以用任何其他的
+ 您想用的过滤程序。 <command>lpf</command> 过滤器在
+ <link
+ linkend="printing-advanced-lpf">lpf: 一个文本
+ 过滤器</link> 这节将有详细描述。 </para>
+
+ <para>首先, 我们来写一段叫做
+ <filename>/usr/local/libexec/if-simple</filename> 的简单
+ shell 脚本作为文本过滤器。 用您熟悉的文本编辑器将下面的内容放进
+ 这个文件: </para>
+
+ <programlisting>#!/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.
+
+/bin/cat &amp;&amp; exit 0
+exit 2</programlisting>
+
+ <para>使这个文件可以被执行: </para>
+
+ <screen>&prompt.root; <userinput>chmod 555 /usr/local/libexec/if-simple</userinput></screen>
+
+ <para>然后用
+ <literal>if</literal> 标记在
+ <filename>/etc/printcap</filename> 里告诉 LPD 使用这个脚本。 我们将仍然为
+ 一直作为例子的这两台打印机在
+ <filename>/etc/printcap</filename> 里增加这个标记: </para>
+
+ <programlisting>#
+# /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:ms#-parenb cs8 clocal crtscts:\
+ :if=/usr/local/libexec/if-simple:</programlisting>
+
+ <note>
+ <para>一份 <filename>if-simple</filename> 脚本
+ 的拷贝可以在 <filename
+ role="directory">/usr/share/examples/printing</filename>
+ 这个目录中找到。 </para>
+ </note>
+ </sect4>
+
+ <sect4>
+ <title>开启 <application>LPD</application></title>
+
+ <para>&man.lpd.8; 在 <filename>/etc/rc</filename> 中被运行,
+ 它是否被运行由 <literal>lpd_enable</literal> 这个变量控制。 这个
+ 变量默认是 <literal>NO</literal>。 如果您还没有修改
+ , 那么增加这行: </para>
+
+ <programlisting>lpd_enable="YES"</programlisting>
+
+ <para>到 <filename>/etc/rc.conf</filename> 文件当中, 然后既可以重启您的
+ 机器, 也可以直接运行 &man.lpd.8;。 </para>
+
+ <screen>&prompt.root; <userinput>lpd</userinput></screen>
+ </sect4>
+
+ <sect4 id="printing-trying">
+ <title>测试</title>
+
+ <para>现在已经基本完成了
+ <application>LPD</application> 的基本设置。
+ 但不幸的是, 还不是庆祝的时候,
+ 因为我们还需要测试设置并且修正所有的
+ 问题。 要测试设置, 尝试打印一些东西。 要
+ 用 <application>LPD</application> 系统打印, 您可以
+ 使用 &man.lpr.1; 命令,
+ 它可以提交一个任务来打印。 </para>
+
+ <para>您可以联合使用 &man.lpr.1; 和 the &man.lptest.1;
+ 程序, 在 <link
+ linkend="printing-testing">检查打印机
+ 通讯</link> 这节介绍怎样生成一些测试文本。 </para>
+
+ <para><emphasis>要测试简单 <application>LPD</application>
+ 设置: </emphasis></para>
+
+ <para>输入: </para>
+
+ <screen>&prompt.root; <userinput>lptest 20 5 | lpr -P<replaceable>printer-name</replaceable></userinput></screen>
+
+ <para>其中 <replaceable>printer-name</replaceable> 是
+ 在 <filename>/etc/printcap</filename> 中指定的打印机的一个名字 ( 或者一个别名)
+ 。 要测试默认
+ 打印机, 输入 &man.lpr.1; 不带任何 <option>-P</option>
+ 选项。 同样, 如果您正在测试一台使用
+ &postscript; 的打印机, 发送一个 &postscript; 程序到打印机而不是
+ 使用 &man.lptest.1;。 您可以把程序放在一个
+ 文件里, 然后输入: <command>lpr
+ <replaceable>file</replaceable></command>.</para>
+
+ <para>对于一台 &postscript; 打印机, 您应该得到那段程序的
+ 结果。 而如果您使用的 &man.lptest.1;, 则您得到的
+ 结果应该看起来像下面这样: </para>
+
+ <programlisting>!"#$%&amp;'()*+,-./01234
+"#$%&amp;'()*+,-./012345
+#$%&amp;'()*+,-./0123456
+$%&amp;'()*+,-./01234567
+%&amp;'()*+,-./012345678</programlisting>
+
+ <para>要更进一步的测试打印机, 尝试下载一些大的
+ 程序 (为基于特定语言的打印机 ) 或者运行
+ &man.lptest.1; 并使用不同的参数。 比如,
+ <command>lptest 80 60</command> 将生成 60 行 每行 80
+ 个字符。 </para>
+
+ <para>如果打印机不能工作, 参考 <link
+ linkend="printing-troubleshooting">故障排除</link>
+ 这节。 </para>
+ </sect4>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-advanced">
+ <title>Advanced Printer Setup ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect2 id="printing-advanced-filter-intro">
+ <title>Filters ** 翻译进行中 **</title>
+ <indexterm>
+ <primary>printing</primary>
+ <secondary>filters</secondary>
+ </indexterm>
+
+ <para></para>
+
+ <sect3 id="printing-advanced-filters">
+ <title>How Filters Work ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-if-conversion">
+ <title>Accommodating Plain Text Jobs on &postscript; Printers
+ ** 翻译进行中 **</title>
+ <indexterm><primary>print jobs</primary></indexterm>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-ps">
+ <title>Simulating &postscript; on Non &postscript; Printers ** 翻译进行中 **</title>
+ <indexterm>
+ <primary>PostScript</primary>
+ <secondary>emulating</secondary>
+ </indexterm>
+ <indexterm>
+ <primary>Ghostscript</primary></indexterm>
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-convfilters">
+ <title>Conversion Filters ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect4 id="printing-advanced-autoconv">
+ <title>Automated Conversion: an Alternative to Conversion
+ Filters ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect4>
+ </sect3>
+
+ <sect3 id="printing-advanced-of">
+ <title>Output Filters ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-lpf">
+ <title><command>lpf</command>: a Text Filter ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-header-pages">
+ <title>Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect3 id="printing-advanced-header-pages-enabling">
+ <title>Enabling Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-header-pages-controlling">
+ <title>Controlling Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-header-pages-accounting">
+ <title>Accounting for Header Pages ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-header-pages-ps">
+ <title>Header Pages on &postscript; Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-network-printers">
+ <title>Networked Printing ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>network</secondary>
+ </indexterm>
+ <indexterm><primary>network printing</primary></indexterm>
+ <para></para>
+
+ <sect3 id="printing-advanced-network-rm">
+ <title>Printers Installed on Remote Hosts ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-network-net-if">
+ <title>Printers with Networked Data Stream Interfaces ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-restricting">
+ <title>Restricting Printer Usage ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>restricting access to</secondary>
+ </indexterm>
+ <para></para>
+
+ <sect3 id="printing-advanced-restricting-copies">
+ <title>Restricting Multiple Copies ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-restricting-access">
+ <title>Restricting Access to Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-restricting-sizes">
+ <title>Controlling Sizes of Jobs Submitted ** 翻译进行中 **</title>
+
+ <indexterm><primary>print jobs</primary></indexterm>
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-advanced-restricting-remote">
+ <title>Restricting Jobs from Remote Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-advanced-acct">
+ <title>Accounting for Printer Usage ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>accounting</primary>
+ <secondary>printer</secondary>
+ </indexterm>
+ <para></para>
+
+ <sect3>
+ <title>Quick and Dirty Printer Accounting ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3>
+ <title>How Can You Count Pages Printed? ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-using">
+ <title>Using Printers ** 翻译进行中 **</title>
+
+ <indexterm>
+ <primary>printers</primary>
+ <secondary>usage</secondary>
+ </indexterm>
+ <para></para>
+
+ <sect2 id="printing-lpr">
+ <title>Printing Jobs ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="printing-lpq">
+ <title>Checking Jobs ** 翻译进行中 **</title>
+
+ <indexterm><primary>print jobs</primary></indexterm>
+ <para></para>
+ </sect2>
+
+ <sect2 id="printing-lprm">
+ <title>Removing Jobs ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="printing-lpr-options">
+ <title>Beyond Plain Text: Printing Options ** 翻译进行中 **</title>
+
+ <para></para>
+
+ <sect3 id="printing-lpr-options-format">
+ <title>Formatting and Conversion Options ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-lpr-options-job-handling">
+ <title>Job Handling Options ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+
+ <sect3 id="printing-lpr-options-misc">
+ <title>Header Page Options ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="printing-lpc">
+ <title>Administering Printers ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="printing-lpd-alternatives">
+ <title>Alternatives to the Standard Spooler ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect1>
+
+ <sect1 id="printing-troubleshooting">
+ <title>Troubleshooting ** 翻译进行中 **</title>
+
+ <para></para>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->