跳到网页内文区。

:::

如何在 Linux 下列印?

目录

前言

这是我自己写的「如何列印」,原本只是一篇小笔记,因为设定印表机的过程很累很复杂,为了怕我自己日久生疏,而写给自己看的。后来越写越长,写成了完整的 Linux 列印设定教学。

本文是采用 samba - LPRng - ifhp filter - ghostscript uniprint 驱动程式搭配的列印架构。如果你是用别的搭配方式,设定会有所不同。

本文作者是我一个人,未曾受过各个列印程式作者的授权,也未曾和各个作者讨论,内文所述不能代表各列印程式的正式文件。本文或有疏失、遗漏、偏颇、错误之处,还请不吝告知,谢谢。

零、最最快速的安装说明:

如果你只是要把印表机分享给 Windows 工作站用,或只是要设定一个 Windows 工作站用的 print server ,完全不要在 Linux 下印表,请依下列步骤。如果你真的是要「在 Linux 下设定印表机」,要在 Linux 下列印,或想更深入了解 Linux 下列印的架构,请跳过这一段。

  1. 接好印表机:

    把印表机接到 LPT1 ,做下述测试:

    % echo "Hello, world!" >> /dev/lp0
    

    如果印表机有反应,把整张纸退出,看看「 Hello, world! 」有没有印出来。如果一切正常,继续下一步。[1]

  2. 安装设定 LPRng :

    1. 下载最新版的 LPRng : http://www.lprng.com/
    2. 解压缩、编译安装 LPRng :
      % tar xzf LPRng-x.x.x.tgz
      % cd LPRng-3.x.x
      % ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --disable-setuid
      % make
      % make test
      % su
      $ make install
      
    3. 设定 /etc/printcap 如下:
      # 最简化的 printcap 设定,只给 samba 客户端列印使用
      lp:
      	:lp=/dev/lp0
      	:sd=/var/spool/lpd/%P
      
    4. 测试:
      $ checkpc -f
      $ echo "Hello, world!" | lpr
      
      这时印表机应该会有反应。把整张纸退出,看看「 Hello, world! 」有没有印出来。如果一切正常,继续下一步。[24]
  3. 安装设定 samba :

    1. 下载、安装 samba : http://www.samba.org/samba/samba.html 。(这不在本文的范围内,请自行参考 samba 的安装设定说明。)
    2. 设定列印分享:在 /etc/smb.conf (或 /usr/local/samba/lib/smb.conf ), [printers] 节中设定如下:
      [printers]
      	comment = Printers
      	printable = yes
      	browsable = no
      	public = no
      	valid users = @users
      
      	printing = lprng
      	path = /var/spool/lpd/samba
      	print command = /usr/bin/lpr -P%p -r %s
      	lpq command = /usr/bin/lpq -P%p
      	lprm command = /usr/bin/lprm -P%p %j
      	lppause command = /usr/sbin/lpc hold %p %j
      	lpresume command = /usr/sbin/lpc release %p %j
      	queuepause command = /usr/sbin/lpc -P%p stop
      	queueresume command = /usr/sbin/lpc -P%p start
      
      存档后,记得要开一个 /var/spool/lpd/samba 的目录,拥有者是 root ,权限是 1777 。
    3. 测试:用 testparm 检查 smb.conf ,
      $ /usr/local/samba/bin/testparm
      
      如果没有问题,重开 samba ,回到 Windows 工作站,从网路上的芳邻中重新整理,看看能不能看得到这台印表机。[26]
  4. 安装设定 Windows 下的网路印表机:

    这部份请参考 Windows 的说明,和印表机说明书的安装设定说明。记得要印一张测试页,测试看看。[27]

一、 Linux 列印基本概念

Linux 列印基本概念 style="float: right;" />

Linux 列印的基本做法如下:

  1. 依要列印的档案的类型,以各种不同的 xxx2ps PostScript 转换程式,统一转为列印专用的标准 PostScript 格式。
  2. 将转换后的 PostScript 格式资料传送给 PostScript 印表机模拟程式 Ghostscript 。 Ghostscript 配合印表机的驱动程式,将 PostScript 格式资料再转为低阶印表机指令,传送给印表机埠上的印表机。

二、实际列印流程

图中虚线为 Windows / samba 网路印表机列印资料传送流程。

Linux 列印流程
  1. 由 samba 列印分享送出资料。(可省略。)
  2. 由 LPRng 列印程式( lpr )列印档案,主要设定档为 /etc/printcap 。
  3. 由 ifhp 或其她列印滤镜( filter )配合 file ,判断档案类型后分别处理,设定档为 /etc/ifhp.conf 。
  4. 若不是 raw 或纯文字等可以直接列印的档案格式,则由各种 PostScript 转换程式统一转为 PostScript 格式。
  5. 由 Ghostscript (with uniprint) PostScript 印表机模拟器处理 PostScript 格式的资料,转为低阶印表指令印出。

三、设定指南

我们从最下层往上设定起:

  1. 接好印表机:

    把印表机接到 LPT1 ,做下述测试:

    % echo "Hello, world!" >> /dev/lp0
    

    如果印表机有反应,把整张纸退出,看看「 Hello, world! 」有没有印出来。如果一切正常,继续下一步。[1]

  2. 安装 PostScript 印表机模拟器 Ghostscript (with uniprint) :

    印表机硬体通讯传输一切正常,可以直接列印英文后,接下来我们要让她列印 PostScript 文件。如果你的印表机本身就是 PostScript 印表机,(那你一定非常有钱,不然就是在公司或学校电算中心,)可以直接列印 PostScript ,可以跳过这一段。

    PostScript 是列印专用的文件格式,是 1985 年由 Adobe 制定的。[2] 大多数雷射印表机都可以直接列印 PostScript 文件。不过我想你和我的便宜喷墨(或点矩阵)印表机,应该都办不到,所以我们继续往下看。

    Ghostscript 是 PostScript 印表机模拟程式,透过软体模拟,可以让非 PostScript 印表机,也能印出 PostScript 文件。如此一来,就可以把我们的廉价印表机,当成贵贵的 PostScript 印表机来用了。[3]

    Ghostscript 的工作是转译印表指令,将 PostScript 指令,转译成各种印表机专用的低阶列印指令,送印表机执行。因此, Ghostscript 需要知道各种印表机的指令语言。这就是所谓的「驱动程式」。有的印表机 Ghostscript 有随附驱动程式,有的没有。没有随附驱动程式的时候,你可以上 LinuxPrinting 印表机资料库找,有没有别人写过你印表机的 Ghostscript 驱动程式,下载来用。除非是 uniprint 驱动程式,否则下载后,要再重新编译 Ghostscript 。

    uniprint (Unified Printer Drivers) 原先是设计给 Epson Stylus Color 系列的一种 Ghostscript 驱动程式规格,下载后可以直接存档使用,不用重新编译 Ghostscript 。 uniprint 驱动程式的附档名是 .upp 。[4]

    1. 安装 Ghostscript 前要先安装 zliblibpngjpeg 。这些不在本文范围内,请参考各自的安装说明。
    2. 下载最新版的 Ghostscript :[5] 下载时,要连同 Ghostscript 字型一起下载安装: http://www.cs.wisc.edu/~ghost/doc/AFPL/get700.htm
    3. 解压缩、编译安装 Ghostscript :
      % tar xzf gnu-gs-6.52.tar.gz 或 ghostscript-x.xx.tar.gz
      % cd gsx.xx
      % ln -s src/unix-gcc.mak Makefile
      
      编辑 Makefile ,修改安装的位置:
      prefix = /usr
      
      接著安装:
      % make
      % make test
      % su
      $ make install
      
      然后,到 /usr/share/ghostscript/ 下,解压缩 Ghostscript 字型:
      $ cd /usr/share/ghostscript/
      $ tar xzf ghostscript-fonts-std-x.x.tar.gz
      $ tar xzf ghostscript-fonts-other-x.x.tar.gz
      
    4. 设定你的印表机型号和驱动程式。请查 Ghostscript 印表机说明,找到你印表机的代号,或是你印表机的 uniprint 驱动程式名称。如果没有,你可以上 LinuxPrinting 印表机资料库找别人写的驱动程式。[6] 下载驱动程式后,如果不是 uniprint ,你要重新编译 Ghostscript ;否则,只要存到 /usr/share/ghostscript/x.xx/ 下,和其她 .upp 驱动程式存在一起,就可以了。
    5. 测试: /usr/share/ghostscript/x.xx/examples/ 下有一些 PostScript 范例档,我们来印看看。如果你的印表机不是 uniprint 驱动程式,
      $ cd /usr/share/ghostscript/x.xx/examples/
      $ gs -sDEVICE=xxxxxxxx -sOutputFile=/dev/lp0 tiger.ps
      
      xxxxxxxx 是你印表机的代号;如果是 uniprint ,
      $ cd /usr/share/ghostscript/x.xx/examples/
      $ gs @xxxxxxxx.upp -sOutputFile=/dev/lp0 tiger.ps
      
      xxxxxxxx.upp 是 uniprint 驱动程式档名。如果 Ghostscript 可以顺利读到驱动程式,就会印出一只大老虎了。[7] 你可以把这一行设定成 alias ,加在 ~/.bashrc 下:
      alias gs="gs -sDEVICE=xxxxxxxx -sOutputFile=/dev/lp0"
      
  3. 安装各种 xxx2ps PostScript 转换程式:

    可以列印 PostScript 后,要印其她的档案,只要统一转为 PostScript ,就可以印了。 PostScript 的转换程式很多也很琐碎,安装设定都很简单,在这里就不详述了。以下列出几种常见的 xxx2ps PostScript 转换程式:

    安装完后,记得要测试转换后的 PostScript 档能不能印。

    $ echo "Hello, world" | a2ps -o - | gs -
    $ html2ps < /usr/local/apache/htdocs/index.html | gs -
    $ gs mypdf.pdf
    $ giftopnm < mygif.gif | pnmtops | gs -
    $ jpegtopnm < myjpeg.jpg | pnmtops | gs -
    $ pngtopnm < mypng.png | pnmtops | gs -
    $ bmptoppm < mybmp.bmp | pnmtops | gs -
    $ tifftopnm < mytiff.tif | pnmtops | gs -
    $ ...
    

    以后要列印,只要用 PostScript 转换程式转为 PostScript ,就一切 OK 罗。到此,我们已经可以「列印」了。不管要印什么,都通行无阻。

  4. 安装设定列印资料滤镜 ifhp filter :

    可以列印还不够。印不同的档案,要跑不同的转换程式,把档案格式转来转去。这样太麻烦了。我们需要一个智慧型程式,自动判断档案类型,呼叫要用的转换程式。这就是 filter 列印资料滤镜。 filter 的原理其实很简单,有兴趣的话,看完以下的说明,你也可以自己写一个试试看。

    现成的 filter 有很多,比较普遍的如 lpdomatic (LPD-O-Matic)[12]topsmagicfilter[13]apsfilter[14]rhs-printfilters[15] …等等。 ifhp 是 LPRng 同一个 team 写的 filter ,我自己用的是 ifhp ,所以以下以 ifhp 来说明:

    1. 下载最新版的 ifhp : http://www.lprng.com/
    2. 解压缩、编译安装 ifhp :
      % tar xzf ifhp-x.x.x.tgz
      % cd ifhp-x.x.x
      % ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man
      % make
      % make test
      % su
      $ make install
      
    3. 设定 /etc/ifhp.conf 档:
      1. 设定你的印表机那一节:打开 /etc/ifhp.conf 档,找找看有没有你的印表机那一节 [ xxxxxxxx ] , xxxxxxxx 是你的印表机的 Ghostscript 驱动程式名称。如果你是下载的驱动程式,那你要自己新增一节。以 uniprint 驱动程式为例:
        [ xxxxxxxx.upp ]
        status
        pjl@
        pcl@
        ps@
        text
        gs_converter=  \%s{gs_unidriver}
        gs_device=xxxxxxxx.upp
        
        xxxxxxxx.upp 是你下载的 uniprint 驱动程式档名。这样 ifhp 才能从你指定的印表机代号,找到你的印表机该如何设定。
      2. 设定档案类型的对应表:在你印表机的那一节最后面,加上以下file_output_match 的设定(或盖掉原来的 file_output_match 设定):
        file_output_match = [
        	*postscript*		raw	\%s{gs_converter}
        	*text*			text [16]
        	*01-*			text
        	*pcl*			filter	\%s{pcl_converter}
        	*pjl*			filter	\%s{pjl_converter}
        	*html*			filter	\%s{html_converter}
        	*pdf*			raw	\%s{pdf_converter}
        	*37)*			raw	\%s{pdf_converter}
        	*jpeg*			filter	\%s{jpeg_converter}
        	*gif*			filter	\%s{gif_converter}
        	*png*			filter	\%s{png_converter}
        	*pc_bitmap*		filter	\%s{bmp_converter}
        	*tiff*			filter	\%s{tiff_converter}
        	*gzip_compressed*	filter	\%s{gzip_decompress}
        	*data*			raw
        ]
        
        \%s{string} 会被代换为之前 string= 设定的字串。列印时, ifhp 会呼叫 /usr/bin/file 判断档案类型,从传回来的结果字串,和这些样式比对,如果符合,就执行后面设定的指令。[17] 如果后面没有指令了,就当成最终转换结果送出。例如:
        % file myphoto.jpg
        myphoto.jpg: JPEG image data, JFIF standard
        
        "JPEG image data, JFIF standard" 符合 *jpeg* (不分大小写),於是就执行 jpeg_converter 。你可以依 file 执行传回的结果字串,设计新样式。
      3. 设定转换程式(各种 xxx_converter ):找到 a2ps_converter= 那一行,在下面加上这几行:
        html_converter= /usr/bin/html2ps 2>/dev/null
        pdf_converter= \%s{gs_converter}
        jpeg_converter= /usr/bin/jpegtopnm | /usr/bin/pnmtops -noturn[18]
        gif_converter= /usr/bin/giftopnm | /usr/bin/pnmtops -noturn[19]
        png_converter= /usr/bin/pngtopnm | /usr/bin/pnmtops -noturn
        bmp_converter= /usr/bin/bmptoppm | /usr/bin/pnmtops -noturn
        tiff_converter= /usr/bin/tifftopnm | /usr/bin/pnmtops -noturn
        
        执行时, ifhp 会用 pipe 输出入重导 (|) ,从标准输入 stdin 传入原始档案,而从标准输出 stdout 取得转换结果。
    4. 测试:列印 /tmp/myfile ,
      $ /usr/libexec/filters/ifhp -Tdev=/dev/lp0,model=xxxxxxxx < /tmp/myfile
      
      如果印出来没问题, ifhp 就设定好了。[20] 到此,可以告一个段落,我们终於有了一个智慧型的列印程式,可以自动视情况列印各种档案了。你可以把上面那一行设定成 alias ,加在 ~/.bashrc 下:
      alias ifhp="/usr/libexec/filters/ifhp -Tdev=/dev/lp0,model=xxxxxxxx"
      
      然后喝杯咖啡,休息一下。 ^_*'
  5. 安装设定 LPRng :

    我们终於有了一个智慧型列印资料滤镜 ifhp ,可以自动视情况分配档案格式的转换工作,再把最终结果送到印表机。只要用 ifhp ,要印什么都可以印了。总算结束了吧?

    还没有。列印工作远比想像中复杂。不只要能印,还要能「管理」:同时要印好几个档案的时候,你要让档案排队列印,或是把重要的档案抽出来先印,还要把送错了的档案取消掉,或是在卡纸的时候,暂停列印。更何况, /dev/lp0 的权限是 660 ,我们不可能让每个人都有权限,直接写到 /dev/lp0 去。[21]

    所以我们需要列印管理程式 LPRng ,管理所有的列印工作。

    1. 下载最新版的 LPRng : http://www.lprng.com/
    2. 解压缩、编译安装 LPRng :
      % tar xzf LPRng-x.x.x.tgz
      % cd LPRng-x.x.x
      % ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --disable-setuid[22]
      % make
      % make test
      % su
      $ make install
      
    3. 设定 /etc/printcap 档:[23] 若是你乖乖照我说的,以 ifhp 配合 Ghostscript uniprint 的话,(你还真听话啊… ^^; ) /etc/printcap 设定如下:
      # 配合 ifhp filter 和 Ghostscript uniprint 驱动程式的 printcap
      lp:
      	:lp=/dev/lp0
      	:sd=/var/spool/lpd/%P
      	:ifhp=model=xxxxxxxx
      	:filter=/usr/libexec/filters/ifhp
      
      %P 是指印表机的名称,也就是第一行设定的 lp: 。你可以把印表机名称改成你比较好记的名字,如 HPDJ670C 。 :sd= 设定的是列印伫列存放的目录,如果还没有建好这个目录,要记得去 mkdir 。拥有者是 root ,权限最好和 /tmp 一样是 1777 。
    4. 设定 /etc/lpd.perm 档: /etc/lpd.perm 设定的是列印管理的权限。我们首先要限制 IP 或 domain name ,避免系统安全漏洞。(别忘记 lpd 的权限是 root 或 daemon !)在最前面加上:
      # 限制可连线的 IP ,格式是 IP 或 IP/子网路遮罩
      REJECT SERVICE=X NOT REMOTEIP=127.0.0.1,192.168.0.0/255.255.0.0
      # 限制可连线的网域。
      REJECT REMOTEHOST=X NOT REMOTEIP=localhost,*.your.domain
      
      如果使用者都是身边的熟人,把权限放松一点,给大家方便。把 "ACCEPT SERVICE=C LPC=lpd,status,printcap" 这一行去掉,改成:
      # 给大家方便,让大家自己暂停∕继续
      #ACCEPT SERVICE=C LPC=lpd,status,printcap
      ACCEPT SERVICE=C LPC=lpd,status,printcap,hold,release,stop,start REMOTEGROUP=users
      
      另外,要让管理者可以删掉印坏的文件。找到 "ACCEPT SERVICE=M SERVER REMOTEUSER=root" 那一行:
      # allow root on server to remove a job
      ACCEPT SERVICE=M SERVER REMOTEUSER=root
      ACCEPT SERVICE=M SERVER REMOTEGROUP=lp
      
    5. 测试:先测试 /etc/printcap 的设定有没有问题:
      $ checkpc -f
      
      checkpc -f 会检查 printcap 的设定,如果有什么问题,例如 :sd= 的目录不存在,会试著自动修正。检查过没问题后,重读 /etc/printcap 档:
      $ lpc reread
      
      这时再列印看看 /tmp/myfile :
      % lpr /tmp/myfile
      
      如果没有问题,一切就大功告成罗! ^_*'[24]

    关於如何利用 lpr 、 lprm 、 lpc 、 lpq …来管理列印工作,请参考 LPRng-HOWTO 的说明。

  6. 安装设定 samba :[25]

    如果你没有要把这台印表机分享其她 Windows 工作站来用,可以不必看这一段。

    1. 下载、安装 samba : http://www.samba.org/samba/samba.html 。(这不在本文的范围内,请自行参考 samba 的安装设定说明。)
    2. 设定列印分享:在 /etc/smb.conf (或 /usr/local/samba/lib/smb.conf ), [printers] 节中设定如下:
      [printers]
      	comment = Printers
      	printable = yes
      	browsable = no
      	public = no
      	valid users = @users
      
      	printing = lprng
      	path = /var/spool/lpd/samba
      	print command = /usr/bin/lpr -P%p -r %s
      	lpq command = /usr/bin/lpq -P%p
      	lprm command = /usr/bin/lprm -P%p %j
      	lppause command = /usr/sbin/lpc hold %p %j
      	lpresume command = /usr/sbin/lpc release %p %j
      	queuepause command = /usr/sbin/lpc -P%p stop
      	queueresume command = /usr/sbin/lpc -P%p start
      
      存档后,记得要开一个 /var/spool/lpd/samba 的目录,拥有者是 root ,权限是 1777 。
    3. 测试:用 testparm 检查 smb.conf 设定有没有问题,
      % /usr/local/samba/bin/testparm
      
      如果没有问题,重开 samba ,回到 Windows 工作站,从网路上的芳邻中重新整理,看看能不能看得到这台印表机。[26]
  7. 安装设定 Windows 下的网路印表机:

    这部份请参考 Windows 的说明,和印表机说明书的安装设定说明。记得要印一张测试页,测试看看。[27]

四、注释

  1. 如果连「 Hello, world 」都看不到,请依序检查下列事项:
    • 检查印表机没有坏掉,电源有没有接上,开关有没有打开,灯有没有亮,警告灯有没有在闪,墨水(或碳粉匣∕色带)是不是用完了,有没有放纸,有没有卡纸。
    • 检查印表机是不是接在 LPT1 ,排线有没有接好,有没有接触不良。如果印表机接在 LPT2 ,请改用 /dev/lp1 ,如果在 LPT3 ,请改用 /dev/lp2 ,以下类推。
    • 如果不知道印表机有没有坏,请重新接回 Windows 的电脑,试试看可不可以印。再不行,打电话给印表机厂商的客服专线。
    (回正文)
  2. 随著时代的转变, PostScript 成了 Unix 下列印的标准文件格式。那个时代的电脑和印表机都很贵。后来 Adobe 又制定了 PDF (Portable Document Format) 可携式文件格式。 (回正文)
  3. 用软体模拟,会吃 CPU 、硬碟和记忆体。不过现在的 CPU 都跑得很快,硬碟超便宜,记忆体的价格也还可以,除非你要跑 print server ,或需要大量列印,否则影响不会很大。不过,如果你真的需要大量列印,大到会影响整体系统效能,说实话,我觉得你应该买得起 PostScript 印表机了。 :p (回正文)
  4. 少部份 Canon 、 HP 、 NEC 印表机和 Sun raster 档案也使用 uniprint 。因为 uniprint 下载后不需重新编译 Ghostscript ,弹性大,成为 Ghostscript 小组推广的新标准。 (回正文)
  5. Ghostscript 原本采用 GNU 公共版权,允许有限度商业使用;自 5.50 版以后,改由 artofcode LLC 和 Artifex Software Inc. 负责维护,采 Aladdin 公共版权,禁止商业使用,故又称 Aladdin Ghostscript 。最近 artofcode LLC 和 Artifex Software Inc. 又开放出 6.52 版的 Ghostscript 版权。你可以视需要决定要用哪个版本的 Ghostscript 。新版 bug 比较少,不过我们应该支持开放的版本。如果你要商业使用,只能用 GNU Ghostscript 。也因为这个理由, Red Hat 和许多 Linux 只能搭配发行 GNU Ghostscript 6.52 。 (回正文)
  6. 如果找不到 Ghostscript 的驱动程式,那你可能得要自己写,不然只好死心了。 :p Ghostscript 的驱动程式规格请看 Ghostscript 说明(回正文)
  7. 如果有问题,请参考 Ghostscript 说明(回正文)
  8. 一般情况下,印表机大多可以直接列印英文纯文字,不需要特别麻烦 a2ps 转为 PostScript 。不过如果你要印中文,要用到中文字型,或是印表机无法直接列印英文纯文字(这…不大可能吧? ^^;),就要先以 a2ps 转成 PostScript ,才能列印。 (回正文)
  9. 而且 Ghostscript 本身可直接读取 PDF , PDF 可以比照 PostScript 直接交给 Ghostscript 列印。 (回正文)
  10. netpbm 前身是 PBMPLUS ,是一组转换图档的小程式,已经於 1991 年 12 月 10 日停止维护。 后来的人把原先的 PBMPLUS ,加上零零散散搜集来,许多人新写的转换程式,整理成 netpbm 。 PBMPLUS 和 netpbm 制定了图档转换专用的 PNM ( Portable aNyMap )中介格式,先把图档统一转成 PNM ,再转成想要的格式,这样只要写 2n 个转换程式,不必写 n2 个,大大节省写程式的力气。 (回正文)
  11. 你也可以分别用各种直接转换 PostScript 的程式,如附在 libungif 中的 gif2ps 、 jpg2psimgtops2 …等等,不过她们转换后的图案大小都有点问题,目前我还是建议使用netpbm 。因为萤幕和印表机的解析度不同,如果不做好比例微调,印出来的大小会有问题。 gif2ps 转换时会把图案调整到和纸张一样大,原图太大的时候很方便,但不算是很好的作法。 jpeg2ps 可以设定解析度,可是无法从标准输入 /dev/stdin 读取图案,无法和 filter 列印资料滤镜搭配。 imgtops2 其实是包装程式 wrapper ,利用 PostScript 第二版新增的 jpeg 功能,将图案资讯直接加上 PostScript 指令后输出,不算转换程式,优点是速度快,得到的档案比较小,可是解析度有问题,印出来很大。比较起来, netpbm 会自动调整解析度,是目前比较好的选择。(回正文)
  12. lpdomatic (LPD-O-Matic) 是设计来和早期的 lpd 搭配用的,很多人使用,程式很小很简单,只有一个 perl script 。 lpdomatic 需要自己的印表机驱动程式,你可以到 LinuxPrinting 印表机资料库寻找下载。 (回正文)
  13. 关於 magicfilter 我找到的文件不多,就目前的资料看来,是专为 Debian Linux 设计的 filter 。 (回正文)
  14. 很多人都用 apsfilter ,可以从选单选印表机,自动改相关的设定档,设定简单;不过我不喜欢,因为太自动化了,会自己去乱改 /etc/printcap ,说明又不够清楚,而且只能选 Ghostscript 随附的驱动程式,无法新增自己下载的驱动程式。如果你用 apsfilter ,要先装 LPRng ,才能装 apsfilter 。安装 apsfilter 很简单,把下载的 .tar.gz 档解压缩在 /usr/share/ ,进去执行 ./SETUP 就可以了。 (回正文)
  15. rhs-printfilters 是 Red Hat 写的,搭配 Red Hat Linux 发行,因此使用者也很多。 rhs-printfilters 只有 RPM 版,要用 printtool 来设定。 printtool 像 apsfilter 一样,会自动帮你改相关的设定档,不过只能在 X-Window 下执行,只能从选单中选印表机,还会乱改 /etc/printcap ,太自动化了,我也敬而远之。 :p 如果你用 rhs-printfilter ,要先装 LPRng ,再装 rhs-printfilter ,最后装 printtool ,然后进入 X 下,执行 printtool 选印表机。(回正文)
  16. 如果你要用 a2ps ,请改用以下的设定:
    	*text*			filter	\%s{a2ps_converter}
    
    (回正文)
  17. 如果找不到符合的, ifhp 就不会印了,传回错误后结束。 (回正文)
  18. 如果你要用 imgtops2 ,请改用以下的设定:
    jpeg_converter= /usr/bin/imgtops2
    
    (回正文)
  19. 如果你要用 gif2ps ,请改用以下的设定:
    gif_converter= /usr/bin/gif2ps; exit 0
    
    exit 0 是因为 gif2ps 会把不严重的警告也以错误值传回, ifhp 会误判为转换失败,就不会印了。 (回正文)
  20. 如果没有印出来,依下述方式侦错:写一个简单 script /tmp/send :
    #! /bin/sh
    file=/tmp/myfile
    ifhp=model=xxxxxxxx
    cat /dev/null >/tmp/t
    cat $file | /usr/libexec/filters/ifhp -Tdev=/tmp/t,trace,debug=2,${ifhp} 2> /tmp/trace
    
    执行:
    $ sh -x /tmp/send
    
    仔细看看 /tmp/trace ,找到问题的原因。你可以把 debug= 的值设大一点(如 debug=10 ),以得到更详细的侦错资讯。 (回正文)
  21. 为什么列印会这么复杂?因为印表机是外部装置。既然不在机壳里面,要靠线路连接,那要和主电脑通讯、执行工作,就会有伫列 spooling 的问题。伫列是一种排队,在工作因为各种不同的原因(如执行速度太慢、通讯速度太慢、通讯中断或不稳、记忆体不足…等),无法全部送到对方去执行时,就要先排队,等排到的时候再送过去执行。这时候,就要能管理、设定先后次序、暂停、甚至删除排队中的工作。传送 E-mail 因为牵涉到不同的主机之间讯息相互传递,也是一个需要伫列 spooling 的系统。其实机壳里面的各个部份(光碟机、软碟机、硬碟机、记忆体…等)之间也会有伫列的问题,不过几乎都自动处理掉了,所以我们感觉不到。 (回正文)
  22. 因为我们不能让每个人都有权限写入 /dev/lp0 ,所以我们要给 LPRng 特殊权限。一个方法是把 lpd 设成 setuid root ,不过会有安全的顾虑。另一个方法是让 lpd 执行 daemon 模式,以 root 的权限启动,转为 daemon ,等待 lpr 呼叫,再来列印。 daemon 的帐号一定要有权限写入 /dev/lp0 。 (回正文)
  23. 如果你是用「自动化」的 filter (如 apsfilter 或 rhs-printfilters ),现在可以安装设定 filter 了,跳过以下的设定。 (回正文)
  24. 如果 lpr 印不出来,你可以执行:
    % lpq -L
    
    检查列印记录。若还是不行,请参考 LPRng HOWTO 的说明。 (回正文)
  25. 由 Windows samba 客户端传来的资料,事先经过 Windows 驱动程式转为低阶印表指令,不需(也不可)再做资料转换,在 filter 中需设定以 raw 直接传送至印表机 /dev/lp0 。若印表机只给 Windows 客户端列印,则可完全不设 filter ,直接由 LPRng 转送给印表机,设定方式如最前面 所述。 (回正文)
  26. 如果从网路上的芳邻看有问题,请参考 samba 列印说明(回正文)
  27. 如果印不出来,请检查 lpq -L 的列印记录。 (回正文)

五、参考资料

更进一步的资料请参考下列网址:

依玛猫,初稿 2001-04-25 ,上次更新日期 2006-04-06