电脑技术学习

FreeBSD连载(30):配置打印机

dn001

配置打印机

  本地打印机通常连接到计算机的并口上,因此在安装打印机之前,首先要查看并口的状态是否正常。正常情况下,缺 省的硬件配置将能够自动侦测到计算机的并口,那么在启动时,系统将在控制台上显示下面的信息,如果由于滚屏太快而没有 看到这一行的话,可以使用dmesg命令进行查看:

$ dmesg | grep lpt

nlpt0: on ppbus 0
nlpt0: Interrupt-driven port

  在FreeBSD 3.0之前使用lpt作为打印机的驱动程序,这个老驱动程序对于现有具备多个模式的并口硬 件支持能力不足。3.1之后系统的并口驱动程序更新了,使用了nlpt作为新的驱动程序名字,但设备文件的名字仍然为 /dev/lpt0。以后当老版本的驱动程序彻底从FreeBSD中消失之后,驱动程序名字会恢复为lpt。

  通常不需任何配置,并口就能正常工作。此时就可以通过设备文件/dev/lpt0来直接访问并口(0表示第一 个并口,依次类推),如果并口和打印机的电缆连接也正常,就能测试打印机是否正常,此时需要root权限。

# lptest > /dev/lpt0

  如果对于普通行式打印机,这将打印出一页测试信息,但如果打印机是使用PostScript或其他页面描述语 言,打印机并不一定进行打印,但打印机的状态指示灯将闪烁。如果打印机是PostScript打印机,可以使用下面命 令来测试:

# lptest | a2ps -q -o - > /dev/lpt0

  这需要预先通过Packages Collection安装好a2ps软件,其中使用的-q参数表示不输出a2ps 的状态信息,-o -参数表示向标准输出输出转化后的PS数据,如果没有使用这个参数,则a2ps直接将PS数 据发送给lpr命令,由于此时打印系统还未设置完毕,因此需要直接输出到打印机端口上以进行测试。

  当这个测试正常之后,就可以尝试使用lpr命令来打印文档了。当然此时打印系统的设置还没有完成,缺省的设置 并不一定适合每个计算机。应该调整打印设置,使得打印系统适合本系统。

  • 打印机配置文件printcap

  当并口和打印机连接正确之后,可以进行下一步配置/etc/printcap文件了。在BSD打印系统中,使 用这个printcap文件来定义打印机,包括命名打印机、将打印缓冲区和具体的打印机相联系等。下面的例子中配置了 两个打印机,一个为本地的LaserJet 6P型打印机,另一个为远程FreeBSD计算机printersvr上 的打印机。

lp|lj|ps|HP LaserJet 6P:

:lp=/dev/lpt0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:sh:mx#0:
:if=/usr/local/libexec/lpfilter:

rlp|remote printer:
:rm=printersvr:rp=lp:sd=/var/spool/output/lpd/printersvr:lf=/var/log/lpd-errs:

  从上面的例子可以看出printcap文件的格式:

  printcap中的每行描述由多个部分组成,每个部分用 “:” 分隔;由于对打印机的描述一行写不下,必 须使用反斜杠 “” 分隔,这是Unix和C语言的标准做法。为了避免出现配置错误等问题,不要在同一个描述部分的 中间续行;

  每行中的第一个描述部分定义打印机的名字,通常可以用多个名字来称呼一个打印机,例如本例中第一个HP LaserJet 6P又有另外的名字lp、lj和ps,这些名字方便用户和不同的程序使用打印机。这些名字之间使用竖线 “|” 分隔,习惯上使用最后一个名字作为打印机的全名;

  每个打印机的各个定义部分定义了打印机的不同属性,定义方式就是上例中使用的方式,定义字符串使用 “=“ ,定义数值使用 “#” 。一个打印机应该具备下面的不同属性:

  lp(local printer)定义本地打印机使用的设备,通常为并口设备/dev/lpt0。

  rm(remote Machine)定义远程计算机的名字,这在使用远程打印机时有用。

  rp(remote printer)的值应该为rm定义的远程计算机上的一个打印机名。远程打印机不需要l p来定义打印机端口,但需要使用rm和rp定义,以将打印文件发送到远程计算机上的正确打印机中。这个打印机名应该在 远程计算机中/etc/printcap中进行了定义。如果没有使用rp定义而只使用了rm定义,则使用该计算机上的 缺省打印机。

  sd(spool Directory)定义这个打印机使用的缓冲区目录,这个目录一般放在/var/spo ol的下面,并拥有合适的权限设置,以使得打印系统能正确处理缓冲区。系统缺省使用/var/spool/lpd目录 来放置要打印的文件,不同的打印机应使用这个目录下的不同子目录,习惯上这个目录名与前面定义的打印机名字相一致。

  lf(log file)定义与这个打印机相联系的日志文件,记录出现的错误信息,习惯上放在/var/lo g目录下。

  mx(maximum size)定义缓冲区中打印文件的最大尺寸,单位为千字节,缺省值为0,表示不限制打 印文件的大小。

  if(input filter)定义一个输入打印过滤器,过滤器程序用于将用户打印作业的格式转变为打印机 能够识别的格式。

  of(output filter)定义输出过滤器,这也是一个打印过滤器,习惯上使用if的多些,使用of 的少些。如果if和of都没有定义,打印系统则使用缺省的过滤器/usr/libexec/lpr/lpf。

  sh(suppress header),不打印标题页。

  mc(maximum coyIEs)定义最大的打印份数,缺省为0不限制打印份数。

  br(baud rate)定义串口波特率,只有在使用串口打印机时才有用。

  当将prinrcap文件设置正确之后,就能够使用打印命令lpr来打印文本文件了,由于没有设置打印中文或 图形的过滤器,打印系统只能打印英文文件,它将处理过的文件直接发送到打印机上进行打印。

  • 在PostScript打印机上打印

  大多数打印机不但能打印字符,也能够打印图形,应用软件通过输出控制字符对打印机进行控制。这些控制字符就被 称为打印机控制语言。为了将字符和图形文件输出到打印机上,就需要过滤器将打印文件转化为打印机识别的打印语言。

  打印过滤器是打印程序的一个重要部分,使Unix的打印系统更为灵活,从而能适合各种不同的打印机。除了将文 档转换为打印机识别的语言之外,还可以对要打印的文件做其他处理,例如某些行式打印机需要文档同时使用回车和换行,而 Unix的文本文件只使用换行,此时直接打印文档就会造成行列不齐,这些情况下就需要一个过滤器进行转换。

  打印机控制语言可以分为两类,一种将操纵打印机进行绘图的命令及其他控制命令通过特殊字符(或特殊字符引导的 命令)来表示,对普通字符文件不作处理,直接发送到打印机。此时普通英文字符文件可以直接发送到打印机上打印,但要打 印包括图形在内的文件就是包括特殊控制字符的二进制文件,不能用文本方式进行查看。另一种为Postscript语言 ,它使用页面描述语言来描述要打印的内容,可以直接打印的文件就是一个符合一定语法规则的文本文件,因此对于一个Po stScript打印机来讲,一个普通文本文件只是一个不合乎语法的PostScript语言文件,不能被直接打印。

  因此如果要在仅支持PostScript的打印机上打印普通文档,也必须使用识别PostScript的过滤 器进行转换,首先将普通文本文件转换为PostScript语言,再发送给PostScript打印机进行打印。Fr eeBSD的Packages Collection中专门有一个类别print,提供了很多打印相关的软件包,其中 包括很多种将文本文件转换为PostScript文件的过滤器程序,如a2ps等。其中gb2ps能将GB编码的文本 转换未内嵌中文的PostScript文件,从而能在PostScript打印机上将中文文件打印出来。

  因此首先应该安装这些转换软件包,当安装了这些转换程序之后,最简单的使用方式是先使用他们将文档转换为Po stscript文件,再发送给打印命令lpr,这可以通过管道来实现。一些打印工具内部就包括了使用管道,自动将生 成的Postscript数据发送给lpr命令的指令,下面的a2ps指令就直接将PostScript文件发送给l pr命令。

  $ a2ps file

  或者可以在printcap文件中设置if参数,以自动使用这些过滤器,此时要设置过滤程序从标准输入上读入 数据,将PostScript数据从标准输出上输出。

   :if=/usr/local/bin/a2ps -q -o -:

  对于要使用gb2ps来打印中文文件的情况,由于gb2ps使用参数读入源文件、并输出PostScript 中文文件,不使用标准输入输出,因此不能直接使用gb2ps作过滤器程序,而需要自己使用临时文件保存中间结果,生成 PostSript文件之后再打印。此外,gb2ps输出的PostScript文件都包括一页gb2ps的版权信息 ,对于打印来讲没有必要每次都打印这个版权页,可以使用psutils中包括的psselect程序,从原有文件中去 除第一页,再进行打印。

  高级的过滤器程序应该能够识别各种不同格式的文档文件,并依据文档的格式,使用不同的过滤器功能来进行处理, 最后生成符合打印机描述语言的打印文件。

  • PostScript与Ghostscript

  PostScript使用命令来描述页面,虽然也是文本文件,但这里都是绘图指令,需要一个PostScript 语言解释器对文件中描述的指令进行解释操作,才能得到正确的结果。因此PostScript文件在普通打印机上只 能打印出源文件,同样普通文档在PostScript打印机上也不能正确解释、打印出来。下面是一个PostScript 文件的开始部分:

%!PS-Adobe-3.0

%%Creator: gb2ps
%%CreationDate: Fri Oct 31 18:36:45 1998
%%DocumentNeededResources: font Symbol
%%+ font Courier
%%+ font Times-Roman
%%DocumentSuppliedResources: file images/file.ps
%%Pages: 32
%%PageOrder: Ascend
%%Orientation: Portrait
%%EndComments
%%BeginProlog

  如果要查看PostScript的内容,则需要一个页面语言解释器。虽然存在不少商业PostScript解 释器,但大部分并不见得比Ghostscript好,虽然GhostScript只是一个免费的PostScript 解释器。GhostScript能在X Window下正确显示PostScript文件的内容,并能实现各种强大的 PostScript处理能力。Ghostscript是一个相当复杂的程序,如果仅仅是要查看Postscript 文件的内容,可以使用命令 “gs psfile.ps” ,退出时在Ghostscript提示下输入 “quit ” 即可。

$ gs psfile.ps

Aladdin Ghostscript 5.50 (1998-9-16)
Copyright (C) 1998 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS> quit

  另外,Ghostscript有一个前端程序Ghostview,能使用Ghostscript来浏览PostScript 文件,但使用了比较简单的图形操作方式。Ghostscirpt和Ghostview都可以通过Packages Collection 安装。

  • 在非PostScript打印机上打印

  通常非PostScript打印机使用特殊的ESC序列来表示命令,而对普通文本不做特殊处理,因此文本文件 仍然被看作文本文件,能够直接打印文本文件,因此这些非PostScript的打印机能够直接设置为普通的文本打印机 来使用。

  然而要想充分发挥打印机的能力,打印包括图形在内的文档,就必须有能理解这台非PostScirpt打印机使 用的控制语言的过滤器。这些过滤器就相当于Windows下的打印机驱动,应该由生产这台打印机的厂商提供。但是很多 低档打印机是专门为使用Dos或Windows的计算机生产的,没有为Unix配置过滤器,因此在这些打印机上打印图 形就遇到了困难。幸运的是,Ghostscript能够识别很多种打印机,并能将PostScript文件在指定的设 备上打印出来。

  因此在前面的操作中生成了Postscript文件之后,就可以使用Ghostscript在一台非Post Script打印机上打印PostScript文件,下面文件将在一台Laserjet4打印机上打印test.ps 文件。

# gs -sDEVICE=ljet4 -sOutput=/dev/lpt0  test.ps

使用gs -help能列出一系列Ghostscrit支持的设备文件,有些是打印机设备,有些是代表不同的图形格式的伪设备。
$ gs -help
Aladdin Ghostscript 5.50 (1998-9-16)
Copyright (C) 1998 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
Usage: gs [switches] [file1.ps file2.ps ...]
Most frequently used switches: (you can use # in place of =)
-dNOPAUSE no pause after page | -q `quiet', fewer messages
-gx page size in pixels | -r pixels/inch resolution
-sDEVICE= select device | -dBATCH exit after last file
-sOutputFile= select output file: - for stdout, |command for pipe,
embed %d or %ld for page #
Input formats: PostScript PostScriptLevel1 PostScriptLevel2 PDF
Available devices:
appledmp iwhi iwlo iwlq hl7x0 bj10e bj200 bjc600 bjc800 lbp8 lips3 m8510
uniprint la50 la70 la75 la75plus lj250 declj250 ln03 ap3250 epson eps9mid
eps9high lp8000 lq850 epsonc st800 stcolor lp2563 dnj650c deskjet djet500
cdeskjet djet500c cdjcolor cdjmono cdj500 cdj550 cdj670 cdj850 cdj890
cdj1600 laserjet ljetplus ljet2p ljet3 ljet3d ljet4 lj4dith cljet5
lj5mono lj5gray pj pjetxl pjxl paintjet pjxl300 pxlmono bbox pxlcolor
ibmpro jetp3852 imagen cp50 necp6 oce9050 oki182 okiibm r4081 sj48 xes
bmpmono bmp16 bmp256 bmp16m ccr cgmmono cgm8 cgm24 sxlcrt dfaxhigh
dfaxlow faxg3 faxg32d faxg4 bit bitrgb bitcmyk cif miff24 inferno jpeg
jpeggray mgrmono mgrgray2 mgrgray4 mgrgray8 mgr4 mgr8 pcxmono pcxgray
pcx16 pcx256 pcx24b pcxcmyk pdfwrite plan9bm pbm pbmraw pgm pgmraw pgnm
pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw pngmono pnggray png16 png256
png16m psmono psgray psrgb pswrite epswrite sgirgb t4693d2 t4693d4
t4693d8 tek4696 tiffcrle tiffg3 tiffg32d tiffg4 tiff12nc tiff24nc tifflzw
tiffpack x11 x11alpha x11cmyk x11cmyk2 x11cmyk4 x11cmyk8 x11gray2
x11gray4 x11mono nullpage
Search path:
. : /usr/local/share/ghostscript/5.50 :
/usr/local/share/ghostscript/fonts
For more information, see /usr/local/share/ghostscript/5.50/doc/Use.htm.
Report bugs to ghost@aladdin.com, using the form in Bug-form.htm.

  从这些简单的名字中很难判断那个设备对应于自己的打印机型号,为了找出正确的设备文件名,需要阅读Ghost script的文档device.txt,或者选择相近的设备名并反复尝试。如果万一找不到自己的文件名,也许要升级 Ghostscript的版本,或者更新自己Ghostscript的设备驱动之后再重新安装Ghostscript 。

  当能够使用Ghostscript打印文档之后,就需要将它和FreeBSD的打印过滤器集成在一起了,因此 首先要将打印的文档转换为PS文档,然后将PS文档转换为打印机支持的格式,因此就需要更改过滤程序。例如在一个EP SON行式打印机上输出文档,使用的标准过滤应该是,最后两个短横线表示标准输出和标准输入:

#! /bin/sh

a2ps -q -o - |
gs -sDevice=epson -sOutfile=- -

  • 使用apsfilter配置打印机
  • 设置打印机要手工编辑/etc/printcap文件,安装并配置各种过滤器,安装Ghostscript等。这些操作都非常烦琐,幸好FreeBSD通过Ports Collection提供了一种自动配置打印机的apsfilter程序。

    Ports Collection的机制、用法将在后面讨论。

    为了使用apsfilter设置打印机并配置过滤器,就需要执行下列命令:

    # cd /usr/ports/print/apsfilter/
    
    # make install

      然后,系统将自动下载、编译安装必要的过滤器软件,此后将自动启动一个设置程序,通过菜单提示让用户选择打印 机的各种属性,包括打印机的类型、端口、分辨率、纸张大小等等。最后将自动生成合适的printcap文件和各种过滤 器。这些过滤器能分辨要打印文件的类型,进行正确的处理。

      apsfilter生成的过滤器是调用包括ghostscript在内的大量其他软件,因此上面的make过 程就需要从网络上下载必要软件包,可以通过预先安装相应的Packages以减少下载任务。如果网络太慢,下载过程可 能会出现问题导致软件安装问题,后面会讲到如何为Ports Collection手工下载必要的软件包。

    • 使用和控制打印机

      当一切都配置正确之后,使用打印机就非常简单了。为了自动启动lpd守护进程,需要将/etc/rc.con f文件中的lpd_enable项设置为lpd_enable=”Yes”,FreeBSD在下次系统启动时会自动启 动lpd。当lpd没有启动时,也不需要重起计算机,简单使用root身份执行lpd就可以启动这个守护进程。有了l pd守护进程,打印系统就能正常进行打印工作,并能针对整个网络上的用户,提供打印服务了。

      使用者可以直接使用lpr命令打印文件,或者通过管道来使用lpr命令。

    $ lpr hello.c
    
    $ ls | lpr

      如果系统中某个打印机没有配置打印过滤器,用户可以直接使用自己的打印过滤器,通过管道将输出送到lpr中。 这提供了一种较灵活的配置方式,使得用户不需要root权限,也能使用合适的打印机过滤器。下面是一个使用gs打印文 件的例子:

    $ gs -dNOPAUSE -q -sljet4 -sOutputFile=|lpr -- tt.ps

      注意这个例子中使用反斜线取消竖线的特殊含义,将其和紧随其后的lpr一起作为参数发送给gs,gs再将其解 释为管道操作。可以将上面的文件编制成shell程序,这样每次就能更方便的使用。

      当使用lpr将打印作业放入打印缓冲区之后,就能使用lpq命令来查看打印队列的内容:

    $ lpq
    
    waiting for lp to become ready (offline ?)
    Rank Owner Job Files Total Size
    1st user 1 hello.c 151 bytes
    2nd user 2 (standard input) 3359 bytes
    3nd user 3 (standard input) 43765 bytes

      在这个例子中,由于打印机lp没有被正常连接到系统上,因此lpq在第一行提醒使用者当前打印机不正常。由于 这台打印机工作不正常,因此用户可能不想使用这个打印机进行打印了,而想通过其他打印机进行打印。为了避免在这台打印 机正常之后,仍然打印这个作业,需要将这个打印作业删去。这可以通过命令lprm加上作业序号(显示在lpq中第三列 )来完成:

    $ lprm 1
    
    dfA001freebsd.domain dequeued
    cfA001freebsd.domain dequeued

      或者使用all作参数,这将删除该用户的所有打印作业。用户只能删除自己的打印作业,只有root才能删除其 他用户的作业。如果root使用all参数,那么将会将这个打印机缓冲区中的所有打印作业全部清空。

      作为系统管理员,需要进一步的能力来管理打印守护程序。BSD风格的打印系统使用lpc来执行这个功能,以 root身份启动lpc,则进入lpc的交互模式,然后使用help命令可以得到管理命令的列表。一般可以使用start all 命令来启动所有的打印机,或者使用stop lp命令来停止一台名为lp的打印机。

    # lpc
    
    lpc > start all

      也可以用命令行的方式使用lpc,例如重新启动所有的打印机,使用带参数的lpc发出以下命令:

    # lpc restart all

    未完,待续。。。  

    标签: