驯服打印机和打印的恐怖,第 2 部分

作者 Marcel Gagné

哇!我无语了。从我对本系列上一篇文章收到的回应来看,打印确实像我上周描述的那样是一个邪恶的野兽。感谢大家的反馈。

这一次,我想继续深入探讨打印机管理的细节。我知道我承诺过会使用花哨、酷炫的 GUI 工具来完成其中一些事情,而且我保证我们最终会做到这一点。现在,我想再花一点时间来了解所有这些东西是如何在 底层 工作的。

稍后,我将直接深入介绍您的 Linux 工具,用于控制打印作业、队列等。在这样做之前,我想跟进上一篇文章中的一些内容:设置远程打印队列。具体来说,是设置连接到 HP JetDirect 适配器的打印队列。

惠普 JetDirect 打印机适配器是当今 IT 商店中越来越常见的功能。Windows 和 Novell 的连接性被大肆宣传,但真正的信徒们可以放心——让 Linux 系统打印到这些漂亮的小盒子之一根本没什么大不了的。上周,我给出了以下示例。它是一个本地称为 “faraway” 的打印机,用于访问名为 “lptest” 的远程队列。为了方便回顾,下面是它的样子。

   faraway:
        :sd=/var/spool/lpd/faraway:
        :mx#0:
        :sh:
        :rm=farlinux:
        :rp=lptest:

如果您使用的是 HP JetDirect 适配器,我假设您已经使用 IP 地址配置了打印机或独立服务器。这可以使用随附的 JetAdmin 软件(对于独立服务器)或从打印机的控制面板(对于内置 JetDirect 卡的打印机)完成。

接下来要做的是定义打印队列。假设我的适配器的 IP 地址为 192.168.1.225,主机名为 “hpjd1”。要在我的 Linux 系统上创建队列,我将使用以下 printcap 条目

   jdqueue1:
        :sd=/var/spool/lpd/jdqueue1:
        :mx#0:
        :sh:
        :rm=hpjd1:
        :rp=text:

对于纯文本打印,这就是全部内容。请注意,远程打印机名称为 “text”。JetDirect 卡和适配器有两个公认的打印机名称;另一个是 “raw”。如果您的输出始终是 PCL 或 Postscript,那么您应该使用 “raw” 作为远程打印机名称。

现在,假设您拥有其中一款新型、超酷的 3 端口 HP JetDirect 适配器;那又怎么样呢?很高兴您问了。这些卡识别六个不同的打印机名称。它们是 “text1”、“text2” 和 “text3”。对于原始或 postscript 输出,请尝试 “raw1”、“raw2” 和(您猜对了)“raw3”。

好的;现在您可以设置本地和远程打印机,并将作业发送到它们。现在我们将看看您可以做些什么来控制和影响这些作业。

打印机的主控制程序是 lpc,这是一个小型交互式命令行程序。在其最简单的形式中,您键入以下内容

   # lpc

系统会回复一个安静的小提示符

   lpc>

如果我在这里键入 status,我将获得该机器上配置的所有打印机的状态(非常奇怪)。以下是我的系统上的输出结果

   lpc> status
   lp:
        queuing is disabled
        printing is disabled
        no entries
        no daemon present
   colour:
        queuing is enabled
        printing is enabled
        no entries
        no daemon present
   lptest:
        queuing is enabled
        printing is enabled
        no entries
        no daemon present

现在,由于我不想深入探讨的原因,我的主打印机 “lp” 遇到了问题,而且我不想让系统在我想修复它时继续尝试打印到它。在 lpc> 提示符下,我键入以下内容。格式如下。

   down lp "You should not have bothered with this printer."

这将执行的操作是关闭打印机并阻止作业到达打印机。请注意 down lp 后面的消息。这将向任何从他们的计算机查询打印队列状态的人打印一条消息(我在这里假设是远程用户,但他们也可能是本地用户)。因此,在不知道我的系统管理员做了什么的情况下,我仍然将作业发送到打印机。然后我决定查看我的作业在队列中的位置,所以我使用 lpq 来查找。您可能已经猜到,lpq 报告排队作业的状态。您像这样调用它

   # lpq -Pprinter_name

还要记住,如果您指定了 PRINTER 环境变量(正如我上周提到的),您不必指定打印机。换句话说,PRINTER=lptest ; export PRINTER 意味着您只需键入 lpq 即可。以下是我在系统管理员(好吧,实际上是我)关闭打印机后检查我的作业状态时发生的情况

   mycomputer.salmar.com: waiting for queue to be enabled on scigate
   Rank   Owner      Job   Files                              Total Size
   1st    root       16    /etc/profile                       546 bytes
   Warning: lp is down: "You should not have bothered with this printer"
   Warning: lp queue is turned off
   no entries

哎呀!我想我必须使用另一台打印机。我也可以从队列中删除作业。您可以使用 lprm 命令来执行此操作。要摆脱这个作业,我将键入以下内容

   # lprm -Plptest 16

我反正也不想要那个作业。

让我们再谈谈过滤器。在我的办公室里,我有一台小型 HP LaserJet 5L。它是我一直用于所有这些示例的打印机。如果您在 Linux(或其他 Unix/Unixes)上花费过任何时间,您就会知道大多数应用程序都使用 postscript 格式进行打印。不幸的是,我的打印机无法打印 postscript。幸运的是,我的系统上碰巧有一个名为 ghostscript 的小软件包。

我不会花很长时间(至少今天不会)谈论 ghostscript,除了告诉你它是一个强大的工具,也是一个很棒的打印过滤器。如果我尝试将 postscript 文件打印到我的打印机,它会显示为奇怪的文本,而这恰好是一种代码——用 Postscript 语言编写的代码。查看我的系统上 postscript 文件的前 10 行,我看到的是这样的

   # head contact.ps
   %!PS-Adobe-PS
   %%BoundingBox: 54 72 558 720
   %%Creator: Mozilla (NetScape) HTML->PS
   %%DocumentData: Clean7Bit
   %%Orientation: Portrait
   %%Pages: 1
   %%PageOrder: Ascend
   %%Title: Registrant Name Change Agreement
   %%EndComments
   %%BeginProlog

如果我不使用某种可以解释 postscript 的过滤器直接将其发送到我的打印机,也会是这样的情况。不同的 Linux 发行版提供不同的替代过滤器,但所有发行版都应该有共同的 ghostscript。

这是一个例子。我将把我的 contact.ps 文件发送到打印机,但事先通过 ghostscript 过滤器。

   # cat contactm.ps | gs -q -dNOPAUSE -sDEVICE=ljet4 -r300  
             -sPAPERSIZE=letter -sOutputFile=- - | lpr

-q 表示 ghostscript 应该静默执行其工作。通常,ghostscript 会输出大量 “这是我当前正在做的事情” 信息,这不是我们打印作业所需要的。您看到的第一个 -dNOPAUSE> 告诉 ghostscript 处理所有页面,而无需暂停以请求指示。您看到的第一个 -s 标志指定打印机类型。ljet4 定义涵盖了可以实现 600 dpi 分辨率的各种 LaserJet 打印机。这使我们想到了 -r 标志,我在其中定义了 300 dpi 分辨率。这个 Netscape 生成的页面(请记住,使用 Netscape 时您可以打印到文件)不需要 600 dpi 分辨率。Ghostscript 还允许我指定纸张尺寸,这对于我们这些在北美坚定(如果不是明智地)坚持 8-1/2 x 11 英寸 letter 尺寸格式的人来说很重要。最后,我将标准输出指定为我的输出文件。请注意该行中的最后一个连字符。这意味着 ghostscript 正在通过其标准输入获取输入。我做的最后一件事是将其发送到打印机。

ghostscript 最棒的地方在于其广泛的打印机支持。如果您想查看最新和最全面的支持列表,请查看 Ghostscript 打印机支持页面。

   http://www.cs.wisc.edu/~ghost/

向下滚动列表,然后单击 “打印机兼容性”。

有了这个,我基本上可以使用相同的行来创建打印过滤器。始终牢记过滤器位于本地 printcap 定义中,而不是远程定义中。还记得我上周的 dosfilter 吗?这是一个回顾

   #!/bin/bash
   echo -ne \\033&k2G
   cat
   echo -ne \\f

(除了阶梯效应变化之外)只有一行真正的活动行,那就是一个简单的 cat。该行将是上面的 ghostscript 行,减去末尾的 | lpr

   #!/bin/bash
   gs -q -dNOPAUSE -sDEVICE=ljet4 -r300 -sPAPERSIZE=letter -sOutputFile=- -
   echo -ne \\f

非常酷且非常强大。作为额外的奖励,您甚至可以将 ghostscript 用作 postscript 文件和文档的桌面 X 查看器,只需键入 gs,后跟您要查看的文件即可。

   # gs contact.ps

就是这样。又一周我的长篇大论。我期待着下次在 Sysadmin 的角落与您相遇时探讨这个话题。在那之前,“轻装打印,携带大墨粉盒。”

电子邮件:ljeditors@ssc.com

加载 Disqus 评论