当前位置:Linux教程 - Linux - The Linux Printing HOWTO 中文版

The Linux Printing HOWTO 中文版



        
    作者 : Grant Taylor [email protected]>
    译者 : 任恒宇 <[email protected]>
    v3.17, 6 June 1998 翻译日期 : 15 December 1998


    -----------------------------------------------------------------
    这一篇是 Linux Printing HOWTO 的中译本, 内容包括了如何在 Linux 之下产生, 预览,列印及传真任何文件的相关资讯 (基本上亦可适用於其他的 Unices).
    ----------------------------------------------------------------


    1. 简介
    1.1 历史
    1.2 版权声明

    2. 如何列印

    3. 核心印表机装置
    3.1 lp 装置
    3.2 parport 装置 (核心版本 >= 2.1.33)
    3.3 序列装置(Serial devices)

    4. 支援的印表机
    4.1 特定印表机的注意事项

    5. 印表连线作业软体(spooling software) 呢?

    6. 基本运作方式

    7. 基本系统设定
    7.1 传统的 lpd 设定
    7.2 档案权限

    8. 取得列印软体

    9. 厂商的解决方案
    9.1 Red Hat
    9.2 其它的发行版本(Other Distributions)

    10. Ghostscript.
    10.1 启动 ghostscript
    10.2 调整 ghostscript 的输出结果

    11. 如何列印到网路印表机
    11.1 列印至 Unix/lpd
    11.2 列印到 Win95, WinNT, LanManager, 或 Samba 上的印表机
    11.3 列印到 NetWare 上的印表机
    11.4 列印到 EtherTalk (Apple) 上的印表机
    11.5 列印到 HP 或其它的以太网路(ethernet) 印表机
    11.6 替远端印表机执行 if
    11.7 从 Windows 列印
    11.8 从 Apple 列印
    11.9 从 Netware 列印

    12. Windows 专用印表机
    12.1 Ghostscript Windows 导向器(redirector)
    12.2 pbm2ppa 程式

    13. 如何列印到传真机
    13.1 使用传真数据机(faxmodem)
    13.2 使用远端列印服务

    14. 如何产生值得列印的东西
    14.1 标示语言(Markup languages)
    14.2 所见即所得(WYSIWYG) 的文书处理器

    15. 在萤幕上预览可列印的东西
    15.1 PostScript
    15.2 TeX dvi
    15.3 Adobe PDF

    16. 在 lpd 下使用序列式印表机
    16.1 设定 printcap
    16.2 会掉字的旧型序列式印表机

    17. 感谢

    1. 简介



    这份 Printing HOWTO 应该包括了能帮助你在 Linux 平台上架设列印服务的所有讯息.
    这不像在 Microsoft 或 Apple 环境下用滑鼠点选那麽容易,
    但一定比管理一个大型的区域网路来得轻松.

    这份文件的编排方式是希望能让大部份的使用者只须阅读前半段.
    较难理解的个案情况则摆在後半段, 而且你可以很容易地从目录中找到.
    所以大部份人可能只须看到第九或十节就可以了.

    因为 3.x 版的文件重新写过, 前面版本中的许多内容已经拿掉了.
    这是故意的, 因为前版的 HOWTOs 长达 60 多页, 而且编排方式并不是很理想.
    如果你在这份文件中找不到所需的答案, 你可以 a) 参阅位於
    Printing HOWTO Home Page
    的旧版文件. 也可以 b) 告诉我缺少了什麽部份.

    你可以在
    Printing HOWTO Home Page 找到这份文件的最新版本; 当然你也可以在
    SunSite (sunsite.unc.edu) 和附近的 LDP mirror 站找到.


    1.1 历史



    这是第三代的 Printing HOWTO, 也就是第三次的完全改版, 以年份来看:


    1. 我在 1992 年因为看到在 comp.os.linux 有很多关於列印的问题,
      便写下并发表了 printing-howto. 比 HOWTO 计画还早几个月, 同时也是第一份称为
      `howto\ 的常见问答集. 这一版是纯文字格式.

    2. 加入了 HOWTO 计画後, Printing-HOWTO 和由 Brian McCauley
      <[email protected]> 所写的 Lpd FAQ 合并; 我们继续合写 PHT
      差不多两年. 有些地方则纳入了 Karl Auer <[email protected]> 的作品.
      这一版的 PHT 是以 TeXinfo 写成, 也提供了 PS, HTML, Ascii 和 Info 的版本.

    3. 在 PHT 经过一年多的时间逐渐成熟以及一次尝试移转给别人维护的失败经验後,
      产生了这份重新改版. 这一版的 PHT 是以 Linuxdoc-SGML (现在称为 Sgml-tools 套件)所
      写成的.


    1.2 版权声明



    这份文件的版权为 Grant Taylor 所有 (c) 1997. 请广为复制及散布,
    但请别修改内文或省略作者的名字.

    This document is Copyright (c) 1997 by Grant Taylor. Please copy and
    distribute it widely, but do not modify the text or omit my name.

    2. 如何列印



    如果你或你的系统管理者或厂商已经设定好 lpd 的话, 你所需要做的便只是学习如何使用
    lpr 指令而已.
    Printing Usage HOWTO
    包含了这部份的资讯, 还有一些你可能应该要知道的列印伫列处理指令.

    如果你有一个全新系统或者新的印表机, 那你就必须在开始列印前先设定好列印服务.
    如果是这样, 请继续看下去!

    3. 核心印表机装置



    3.1 lp 装置



    假如你已经编译或载入了 lp 装置(cat /proc/devices 的结果可以看到 lp),
    Linux 核心 (<=2.1.32) 会提供一个或多个的 /dev/lp0,
    /dev/lp1, /dev/lp2 装置档案.
    这些档案不是随意指定的, 相反的, 每一个档案皆对应到一个特定的 I/O 位址.
    这表示你的第一部印表机可能是 lp0lp1, 完全视你的硬体情况而定.
    两个都试试看吧!

    有些使用者提到如果使用较旧的单向印表机连接线,
    就无法侦测到他们的双向印表机连接埠. 确定你使用了正确的连接线.

    一个印表机埠不能同时载入 plip 和 lp 的驱动程式, 如果你用的是 2.x 或是 1.3.x
    版以後的核心, 你可以用手动或核心的方式选择载入不同的驱动程式.
    只要小心的设定中断等设定, 你应该可以在一个埠上执行 plip, 而在另一个埠上载入
    lp 的驱动程式. 曾经有人修改驱动程式而成功;
    我希望能早日听到有人以一个简单的指令完成相同的事情.

    有一个小程式
    tunelp
    , 如果你是 root, 可以用来设定 Linux lp 装置使用的中断
    (interrupt), 轮询速率(polling rate) 和其它的项目.

    若是 1.3.x 版以後的核心编译时包括了 lp 驱动程式, 核心接受 lp=
    参数设定中断及 IO 位址:



    若将 lp 驱动程式编译入核心, 你可以用 LILO/LOADLIN 的命令列来指定使用的
    IO 位址及中断.

    语法: lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]

    □例: lp=0x378,0 或 lp=0x278,5,0x378,7 **

    要注意的是假如你使用这个功能, 你必须指定 *所有* 要用的印表机埠,
    系统不提供预设值. 你可以用 lp=0 来停用内建的驱动程式.


    若是在第二版或是晚期 1.3.x 版的核心以载入模组的方式执行, 可以在 insmod
    指令的命令列(或是在 /etc/conf.modules 来模拟核心模式)
    以平常的语法来指定 IO 位址和中断. 参数为 io=port0,port1,port2
    irq=irq0,irq1,irq2. 请参考
    insmod
    的线上手□以取得更进一步的资讯.


    **给那些当需要时却总是找不到标准印表机埠位址的人, 位址便如同第二个□例中所示,
    另一个印表机埠 (lp0) 则在 0x3bc. 我不知道一般所用的中断是那一个.


    Linux 并列埠驱动程式的原始码在 /usr/src/linux/drivers/char/lp.c.


    3.2 parport 装置 (核心版本 >= 2.1.33)



    从 2.1.33 版本後的核心(2.0.30 版核心可取得修正档), lp
    装置成为新增加的 parport 装置的客户端. 增加 parport
    装置解决了许多困扰旧有 lp 装置驱动程式的问题 -
    像是可以和其它的驱动程式共用一个连接埠,
    可以动态指定可用的并列埠而不须将装置档对应到固定的 I/O
    位址等等.

    parport 装置的出现使得很多新的并列埠设备, 像是 Zip 磁碟机,
    可携式 CD-ROM 和磁碟机等等, 的驱动程式得以出现.
    其中一些也有提供 2.0.x 核心可用的版本, 到网路上找找看吧.


    当我使用了 parport 驱动程式後, 我会更完整地探讨它.
    目前你可以看一下核心原始档中的
    Documentation/parport.txt. 或者你也可以到
    parport web site 看看.


    3.3 序列装置(Serial devices)



    序列装置在 Linux 中通常有个像 /dev/ttyS1 这类的名称.
    stty
    这个工具程式可以让你查看及设定序列埠.

    setserial

    可以让你调整更多的属性及设定使用非标准的 IRQ 及 I/O 位址的序列埠.
    Serial-HOWTO
    会对 Linux 下的序列埠做更进一步的探讨.


    如果你使用的是有流量控制的慢速序列印表机, 可能会发现有些报表被截断.
    这是因为系统预定在程式关闭序列埠 30 秒後,
    所有在缓冲区内尚未传送的字元都会被清除. 缓冲区内可容纳最多 4096
    个字元, 假使你的印表机使用流量控制, 而且慢到无法在程式关闭序列埠後 30
    秒内印出缓冲区内的所有字元, 那麽缓冲区内最後的内容就会遗失. 如果
    cat file > /dev/ttyS2
    这个指令可以完整印出较小的档案, 但会截断较长的档案时,
    你可能就是遇到了这种情况.


    30 秒的周期可以用 setserial (2.12 及以後的版本) 指令的 \"closing_wait\"
    选项来调整. 一台机器通常是在 rc.serial 开机档中呼叫 setserial
    来初始化序列埠. 可以在这修改连接印表机的序列埠的 closing_wait 选项.

    4. 支援的印表机



    Linux 核心大致上支援所有能够接到序列或并列埠的印表机,
    但还是有些要注意的事项, 和一些虽然能与 Linux 沟通(就电子讯号而言)
    却无法使用的印表机.
    与 Linux 不相容的主要是那些靠 \"Windows 列印系统\" 的印表机.
    (通常会模糊地标示著 \"for Windows\" 或是称为 \"GDI\" 印表机).
    Linux 不能使用这种印表机. 这种印表机完全没有 \"智慧\",
    它们必须依赖电脑的 CPU 来处理传统上由印表机的 CPU 所做的工作.
    不幸的是, 这些工作只能靠厂商所提供的驱动程式来完成, 而且通常只有
    Windows 的版本. 所以最好别购买这种印表机给 Linux 使用.
    (万一你已经有这种印表机, 仍然有变通之道, 只不过相当的笨拙,
    所以我绝对不会使用这种方式. 想更深入的□解 Windows-only 印表机请看第 12 节)


    那些印表机一定可以用呢? 最好的选择就是买具备 PostScript
    支援的印表机. 几乎所有的 Unix 软体都以 PostScript 来产生报表,
    所以很明显的, 如果能有一部直接支援 PostScript 的印表机的话是再好不过了!
    不幸的是除了雷射印表机外, 其它种类的印表机几乎都不支援 PostScript,
    要不然就是相当昂贵的选购配备.


    如果预算不允许买一部 PostScript 印表机, 你可以买任何 Ghostscript
    支援的印表机. GhostScript 是一个免费的 PostScript 解译器,
    可以用来模拟实际的印表机支援.
    Ghostscript 的首页
    中有支援的印表机清单, 以及新的和开发中的驱动程式的最新消息.
    也请你将成功或失败的经验如同网页中所要求的告诉他们以帮忙改进这个网页.



    Adobe 公司有一种新的印表机语言叫做 \"PrintGear\". 我想它是具有 PostScript
    观念但与其不相容的一种大幅简化的二进位语言. 而我也没听说 ghostscript
    支援它. 但是有些 PrintGear 印表机似乎也支援其它语言如 PCL ,
    而这种印表机便可以在 Linux 下使用.


    4.1 特定印表机的注意事项



    这一小节永远也不会完整. 但是我放在这□的资料应该是正确的:



    Canon BJ-10ex

    有人建议 Canon 在 Epson LQ 模式下运作比较好. (可以用
    dip switch 设定). 在 Canon 模式下的列印结果似乎会时好时坏或是完全失败.
    但另一方面, Ghostscript 很明确地支援许多 Canon 的印表机,
    所以这很可能只是个特例.


    Lexmark

    Lexmark (原来是 IBM 的一份子) 生产很多种印表机. 其中有一部份是
    Windows 专用的.


    • Color Jetprinter 1000

    • Color Jetprinter 1020 (non Business Edition)

    • Color Jetprinter 2030

    • Color Jetprinter 2050

    • Color Jetprinter 2070

    • Color Jetprinter 7000

    • Color Jetprinter 7200

    • Winwriter 100

    • Winwriter 150c

    • Winwriter 200




    5. 印表连线作业软体(spooling software) 呢?



    直到最近, Linux 的使用者的选择很简单 - 每个人跑的都是古老的从 BSD 的 Net-2
    程式码移过来的 lpd. 即使在今天, 大部份厂商仍以这个软体出货.
    但是这个情况已经开始在改变. SVR4 一派的系统, 包括升阳的 Solaris
    在内所附的是个完全不同的印表机连线作业套件, 这个套件以 lpsched 为中心.
    另外还有迹象显示有些 Linux 厂商会改成提供新得多而且免费的 LPRng.
    LPRng 的程式码远比旧有的 lpd 来的有规划, 在大量安装时也较为容易管理□
    它甚至可以真的称得上安全 - 没有 SUID 的执行档, 还支援透过 PGP 或
    Kerberos 做使用者验证.


    虽然有这些新选择, 目前 lpd 对大部份的 Linux 使用者而言应该是足够了.
    虽然它不是最新潮的系统, 但只要设定好就没问题, 而且它广为人们所熟悉,
    同时很多的 Unix 书籍也提供了大量的说明文件.


    如果你想知道更多有关 LPRng 的资讯, 请到
    LPRng 的网页. 在未来这份 HOWTO
    中将会包含使用 LPRng 以及使用普通 lpd 的相关讯息.

    6. 基本运作方式




    为了让列印功能能够正常运作, 你需要了解 lpd 系统是如何运作的.

    Lpd 是 Line Printer Daemon 的缩写, 根据上下文指的可以是监控程式(the daemon)
    本身或是执行印表机连线作业的全套程式. 包括了有:




    lpd

    印表机连线作业监控程式(The spooling daemon). 有一个负责控制所有事情,
    另外针对每一部列印中的印表机也会执行一份.


    lpr

    使用者的列印指令. Lpr 会联络 lpd 并将列印工作送进列印暂存器.


    lpq

    列出伫列中等待列印的工作.


    lpc

    Lpd 系统控制指令. 你可以用 lpc 来控制伫列, 如停止, 开始, 调整顺序等等.


    lprm

    lprm 可以从伫列中移除一件列印工作.


    那这一切是如何凑在一起的呢? 当系统开机时会执行 lpd. 它会检查 /etc/printcap 中有那些印表机要设立列印暂存器. 每当有使用者执行 lpr 时, lpr 会透过
    /dev/printer 的插座(socket) 找到 lpd,
    并将要列印的档案和一些关於列印的人以及列印方法的资讯传送给 lpd.
    然後 lpd 再将档案送到的适当印表机.

    lp 系统设计的时候, 大部份的印表机都是列式印表机(line printer) - 也就是说,
    大部份的使用者是列印纯文字格式(plain ascii).
    结果就是我们还得做一些额外的命令稿处理(scripting) 才能使 lpd
    适用於现今的列印工作, 通常是 PostScript, 或是文字格式, 或是 dvi, ...

    7. 基本系统设定



    7.1 传统的 lpd 设定



    最基本的 lpd 设定只能让系统伫列档案然後列印, 而不管你的印表机能否认得这些档案,
    可能也无法让你产生吸引人的报表. 但无论如何, 这是跨向理解的第一步.
    所以让我们看下去.

    基本上, 要增加一个列印伫列, 你必须在 /etc/printcap 中加一笔记录,
    以及在 /var/spool/lpd 之下建立一个列印暂存器的工作目录(spool
    directory).

    /etc/printcap 中的记录看起来像这个样子:



    # LOCAL djet500
    lp|dj|deskjet:\\
    :sd=/var/spool/lpd/dj:\\
    :mx#0:\\
    :lp=/dev/lp0:\\
    :sh:



    这个例子定义了一个名为 lp, dj, 或是 deskjet 的列印暂存器,
    暂存器的工作目录在 /var/spool/lpd/dj, 没有单一工作大小的上限,
    列印的装置是 /dev/lp0, 而且不会在每一个工作之前加上标题页
    (有著列印人的姓名之类的资料).

    现在就去看看
    printcap
    .
    的线上手□.

    上面这个例子看起来非常简单, 但是有一个问题 - 除非 DeskJet 500
    能看懂我送出去的档案, 否则便会印出乱码. 举例来说,
    假如送一个传统的 Unix 文字档案给 deskjet 会导致新行字元(newline)
    被逐字列印, 而得下面的结果:



    This is line one.
    This is line two.
    This is line three.



    同样的, 列印一个 PostScript 档到这个列印暂存器会得到同样阶梯状的
    PostScript 命令列表, 而不是我们需要的结果.

    很显然我们还需要些什麽, 这就是 filtering 的目的. 看过 printcap
    线上手□的比较细心的读者可能已经注意到 ifof
    这两个属性. 其中的 if, input filter 就是我们现在所需要的.

    假使我们写个短短的 shell script 叫 filter
    使之在新行字元之前加上回车字元(carriage return), 就可以消除阶梯状.
    所以我们必须在前面的 printcap 的记录中加上 if 这一行:



    lp|dj|deskjet:\\
    :sd=/var/spool/lpd/dj:\\
    :mx#0:\\
    :lp=/dev/lp0:\\
    :if=/var/spool/lpd/dj/filter:\\
    :sh:



    这个短短的 filter script 可以是:


    #!perl
    # The above line should really have the whole path to perl
    # This script must be executable: chmod 755 filter
    while(<STDIN>){chop $_; print \"$_\\r\\n\";};
    # You might also want to end with a form feed: print \"\\f\";



    假如我们照上面的方法, 我们就会得到一个能正常印出普通 Unix 文字档的列印暂存器.
    (还有其他四百万种更好的方法来写这个命令稿, 但是这个很适合举例,
    你可以自己写一个更有效率的.)

    剩下的唯一问题是只能印出纯文字档实在是不够好 - 如果能够印出 PostScript
    或是其它格式化的或是图形输出就更棒了. 这可以做的到, 也很容易做到.
    方法就是延伸前面的 filter. 如果你写出一个能接受任意档案格式,
    然後针对每种情况都可以产生 DeskJet 所要的资料的 filter,
    那你就有了一个智慧型的列印暂存器.

    这种 filter 称之为 magic filter. 你无需自己写一个, 除非你要印的东西很奇怪.
    网路上已经有很多写好的, APS Filter 就是非常棒的一个. 也说不定你的 Linux
    发行版本(distribution) 已经包括了一个印表机设定工具使得这一切都很容易.


    7.2 档案权限



    应大众要求, 我把我系统上一些相关档案的权限列出. 还有其它更好的设定方法,
    最好是只将执行档设为 SGID 而不要设为 SUID root, 但这是我系统预设的设定,
    而且运作正常.(老实说, 如果你的厂商连可以运作的 lpd 都无法提供, 你就有苦头吃了.)



    -r-sr-sr-x 1 root lp /usr/bin/lpr*
    -r-sr-sr-x 1 root lp /usr/bin/lprm*
    -rwxr--r-- 1 root root /usr/sbin/lpd*
    -r-xr-sr-x 1 root lp /usr/sbin/lpc*
    drwxrwxr-x 4 root lp /var/spool/lpd/
    drwxr-xr-x 2 root lp /var/spool/lpd/lp/


    Lpd 目前必须以 root 身份执行才能连接到低号(连接埠号低於 1024)的 lp 服务埠.
    可能应该改成在连接後将使用者身份变成 lp 或其他身份, 但是我不认为现在有这样做.
    令人有些失望.

    8. 取得列印软体



    许多预先写好的 filter 套件 (以及其它与印表有关的软体) 在
    SunSite
    都有提供. 像是 psutils, a2ps, mpage, dvitodvi, flpr
    等工具都可以在那儿找得到.


    有一阵子, 很多套件都想让设定印表机简单一点. 这些套件可能都还在,
    但是其中最新最好就属 Andreas Klemm 的 APS Filter 套件了.
    这个套件提供了一个选单式的 printcap 设定程式,
    而且几乎可以处理任何你所能想到的输入格式.
    假使你的厂商并未提供一组好的印表机设定工具, 选 APS Filter 就对了.

    9. 厂商的解决方案



    理论上, 这一节是不完整的. 请别客气来告诉我你最喜好的发行版本(distribution)
    的相关细节.


    9.1 Red Hat



    Red Hat 提供一个 GUI 界面的印表机管理程式 (在 control panel □),
    可以让你加上网路印表机或连接本地装置的印表机. 它让你选择 ghostscript
    支援的印表机种类和所使用的 Unix 装置档案, 然後会在 /etc/printcap
    中设定列印伫列, 再写入一个简短的利用 gs
    nenscript

    以处理 PostScript 和 ascii 的 magic filter. 这个方法还不错,
    对一般的情况而言, 也很容易设定.


    9.2 其它的发行版本(Other Distributions)



    请将其它发行版本的处理方法的讯息寄给我!

    10. Ghostscript.




    Ghostscript
    是个对 Linux 列印有著极大意义的程式. 大部份在 Unix 下列印的程式都会产生
    PostScript, 而印表机的 PostScript 处理能力通常是价值 100 美元的选购配备.
    但是 ghostscript 却是免费的, 而且它能将 PostScript 转成你的印表机所用的语言.
    当它和你的 lpd input filter 结合之後, 你就有了一部虚拟的 PostScript
    印表机, 而且能够大幅简化你的生活.

    Ghostscript 有两个版本. 商业版称为 Aladdin Ghostscript, 个人可以自由使用,
    但是不能随著商业用的 Linux 发行版本散布. Aladdin Ghostscript 通常比免费的
    ghostscript 领先一年左右; 举例来说,它支援 Adobe Acrobat 的 Portable Document
    Format, 但是免费版的就还没有.

    免费版的 ghostscript 为 GNU Ghostscript, 其实就是较旧版的 Aladdin Ghostscript.
    (Aladdin 的这种安排值得我们赞赏; 应该有更多的软体厂商以这种方式支持自由软体
    (free software)).

    无论你用
    gs
    做什麽,
    记得不要让它能够存取档案 (用 -dSAFER 选项). PostScript
    是个具有完整功能的语言, 而一个恶意的 PostScript 程式可以让你吃足苦头.

    再谈到 PDF, Adobe 的 Portable Document Format 实际上就是把 PostScript
    更组织化, 加上一些扩充功能, 经过压缩的档案格式. Ghostscript 可以像处理
    PostScript 般地处理 PDF. 所以你可能是你周遭第一个拥有具有处理 PDF
    能力的印表机的人.

    10.1 启动 ghostscript



    典型的作法是在你的 magic filter 中使用 ghostscript, 但是如果为了除错,
    直接执行通常会比较方便些.

    gs -help 会简短地列出有用的选项以及所提供的驱动程式.
    (注意这儿所列出的仅是编译进去的驱动程式, 而并非所有的驱动程式).

    你可以用下面的方式执行 gs 来测试:
    gs options -q -dSAFER -sOutputFile=/dev/lp1 test.ps.


    10.2 调整 ghostscript 的输出结果



    假如 gs 的输出不能让人满意, 还有一些办法.(事实上, 你可以做任何事,
    因为你可以取得原始码).


    输出的位置及大小



    位置, 大小, 还有影像在页面上的视觉比例是由 ghostscript
    中的印表机驱动程式所控制的. 如果你发现列印出来太短, 太长或是大了两倍,
    你可能会想要看一下驱动程式的原始模组并且调整任何所能想到的参数.
    不幸的是每一个驱动程式都有不同的方式, 所以我也无法告诉你如何调整,
    还好大部份的驱动程式都有还算清楚的注解.


    Gamma, dotsizes, 等等



    大部份的非雷射印表机因为列印的点比较大, 故会导致印出来的图案太黑.
    假使你遇到这个问题, 你应该使用自己的转换函数. 只要在 ghostscript
    的 lib-dir 下建立如下的档案, 并在呼叫 gs
    的时候将这个档名加在要列印的档案之前就可以了.
    你可能会需要调整一下实际的值才能适合你的印表机. 较小的值会导致较亮的列印效果.
    特别是当你的印表机使用 Floyd-Steinberg 演算法来混色 ( rasterize color )
    可能是比较好的选择.




    ---8<---- gamma.ps ----8<---
    %!
    %transfer functions for cyan magenta yellow black
    {0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer
    ---8<------------------8<---



    你也可以调整这些值来补救印表机颜色上的问题. 假如你要这麽做, 建议你可以用
    ghostscript 内附的 colorcir.ps ( 在 examples/ 目录下 ) 做为测试页.

    11. 如何列印到网路印表机



    Lpd 的一个特性便是可以透过网路将报表列印到实体连接在其它机器上的印表机.
    只要仔细地组合 filter 命令稿和相关的工具程式, 你就可以让 lpr 得以透通地
    (transparently) 列印到各种网路上的印表机.


    11.1 列印至 Unix/lpd



    要让远端的机器能够使用你的印表机列印, 你必须将远端机器列名在
    /etc/hosts.equiv 或是 /etc/hosts.lpd 档案之中.
    (要注意 hosts.equiv 还有其它很多作用; 如果你要将一部机器列在这儿,
    请确定你知道你在做什麽). 你也可以利用 rs
    属性来限定其它机器上的某些特定使用者才能使用你的印表机. 请看
    lpd
    的线上手□以取得这方面的讯息.


    lpd



    要列印到另一部机器, 你要在 /etc/printcap 中加上这样的记录,



    # REMOTE djet500
    lp|dj|deskjet:\\
    :sd=/var/spool/lpd/dj:\\
    :rm=machine.out.there.com:\\
    :rp=printername:\\
    :lp=/dev/null:\\
    :sh:



    请注意在本地的机器还是要有一个由 lpd 管理的列印暂存器目录.
    如果远端的机器离线或是忙不过来,
    列印工作会留在本地的暂存区中直到送出去为止.


    rlpr



    你也可以用 rlpr 将列印工作直接送到远端机器的伫列中,
    省下设定 lpd 的麻烦. 假如你偶尔才要列印到其它不同的印表机,
    这个方法就最有用. 引一段 rlpr 的声明:


    rlpr 利用 TCP/IP 将列印工作送到网路上任何位置的 lpd 伺服器.


    与 lpr 不同的是, 你列印来源端的机器 *不需要* 明确地知道远端的印表机,
    (例如透过 /etc/printcap) 因此有相当大的弹性,
    管理的负担也比较轻.



    rlpr 可以用在任何使用传统 lpr 的地方, 而且和传统的 BSD lpr 相容.


    rlpr 最大的好处在於可以 *从任何地方列印到任何地方*
    而不用管列印来源端的系统设定. 它可以像传统的 lpr 做为一个 filter,
    而让在远端机器上执行的客户端像 netscape, xemacs
    等能够轻易地列印报表到你本地的机器.


    你可以在
    SunSite
    找到 rlpr.


    11.2 列印到 Win95, WinNT, LanManager, 或 Samba 上的印表机



    在 Printing to Windows mini-HOWTO 中有比这儿更多的资讯.

    透过
    smbclient

    这个程式 (samba 套件的一部份) 可以将 lpd 伫列导向到架构在 TCP/IP
    之上的 SMB 列印服务. Samba 包含了一个命令稿 smbprint 来做这件事.
    简单地说, 替这样的印表机在列印暂存器工作目录 (spool directory) 中加上设定档,
    然後将 if 设为 smbprint 命令稿.

    /etc/printcap 中的记录看起来应该像这个样子:



    lp|remote-smbprinter:\\
    :lp=/dev/null:sh:\\
    :sd=/var/spool/lpd/lp:\\
    :if=/usr/local/sbin/smbprint:


    你应该阅读一下 smbprint 命令稿中的说明以得到更多相关的讯息.

    你也可以不管 lpd, 直接用 smbclient 将档案送到 SMB
    列印服务. 请参照线上手□.


    11.3 列印到 NetWare 上的印表机



    ncpfs 套件中包含了一个名为 nprint 的工具程式, 它提供如同 smbprint
    一般的功能, 只不过适用的对象是 Netware. 你可以在
    SunSite 取得 ncpfs.
    下面是从 0.16 版的 LSM 中节录出来的:


    With ncpfs you can mount volumes of your netware server under
    Linux. You can also print to netware print queues and spool netware
    print queues to the Linux printing system. You need kernel 1.2.x or
    1.3.54 and above. ncpfs does NOT work with any 1.3.x kernel below
    1.3.54.

    利用 ncpfs, 你可以在 Linux 下挂上你的 netware 伺服器上的目录.
    你也可以列印到 netware 的列印伫列以及将 netware 的列印伫列排存(spool)
    到 Linux 的列印系统. 你需要 1.2.x 或 1.3.54 以上(含 1.3.54) 的核心. ncpfs
    无法在 1.3.54 以前的任何一版 1.3.x 核心下运作.



    要使 nprint 透过 lpd 运作, 你要写个小小的 shell script 将 stdin
    列印到 Netware 上的印表机, 并设成 lpd 列印伫列的 if. 你可能会有:



    sub2|remote-NWprinter:\\
    :lp=/dev/null:sh:\\
    :sd=/var/spool/lpd/sub2:\\
    :if=/var/spool/lpd/nprint-script:



    nprint-script 看起来可能大致上像:


    #! /bin/sh
    # You should try the guest account with no password first!
    /usr/local/bin/nprint -S net -U name -P passwd -q printq-name -



    11.4 列印到 EtherTalk (Apple) 上的印表机



    netatalk 套件包含了像 nprintsmbclient 的东西.
    其他人已经写下了使用 Apple 网路列印的程序, 远比我所能写的好得多; 请参阅
    Linux Netatalk-HOWTO.


    11.5 列印到 HP 或其它的以太网路(ethernet) 印表机



    有些 HP 和其它厂牌的印表机提供了可以直接用 lpd 列印的以太网路介面.
    你应该遵照印表机或其网路介面所附的指示, 但是通常这种印表机上 \"跑\" 的是 lpd,
    而且提供一到多个你可以使用的伫列. 举例来说, 一部 HP 可能可以用这样的 printcap:



    lj-5|remote-hplj:\\
    :lp=/dev/null:sh:\\
    :sd=/var/spool/lpd/lj-5:\\
    :rm=printer.name.com:rp=raw:


    具有 Jet Direct 介面的 HP Laserjet 印表机通常支援两个内建的 lpd 伫列 - \"raw\"
    接受 PCL (可能也接受 Postscript), 以及 \"text\" 接受单纯的 ascii
    (而且会自动地克服阶梯效应). 如果你有的是 JetDirect Plus3 三埠的介面,
    伫列的名称则为 \"raw1\", \"text2\" 等等.

    在一个大型的环境, 特别是个有些印表机不支援 PostScript 的大型环境中,
    架设一部专门的列印伺服器, 让所有的机器都列印到这部伺服器并让所有的 ghostscript
    工作都在这部伺服器上面执行可能会有用.

    这样子也可以让你的 Linux 做为印表机的排存伺服器(spool server),
    如此一来你的网路使用者便可以快一点完成他们的列印工作然後继续手边的事情,
    而不必等待印表机印完先前别人所送出的报表.

    要这样做, 先在你的 linux 机器上设定一个列印伫列指到配有以太网路介面 HP LJ
    (如前所述). 现在将所有在你区域网路上的客户端设定指到这个 Linux 伫列
    (如前面□例中的 lj-5).

    有些 HP 网路印表机似乎不理会客户端送出的标题页(banner page) 设定.
    你可以关掉它们内部自行产生的标题页, 用 telnet 连接到印表机, 按两下 return 键,
    打入 \"banner: 0\", 接著打入 \"quit\". 还有其它可以调整的设定也是用这个方式; 打入
    \"?\" 可以看到它们的表列.


    列印到比较旧的 HP 印表机



    有些印表机 (或是将印表机连上网路的装置) 只支援很阳春的 TCP 连线.
    在这一类中值得注意的是早期的 JetDirect (包括一些 JetDirectEx) 介面卡. 基本上,
    要列印到这类的印表机, 你必须建立到某个特定埠 (典型是在 9100,
    或是三埠机种的 9100, 9101 和 9102) 的 TCP 连接, 然後将你的报表送进去. 这可以用
    Perl 来实做, 或是用其它的方式:




    #!/usr/bin/perl
    # Thanks to Dan McLaughlin for writing the original version of this
    # script (And to Jim W. Jones for sitting next to Dan when writing me
    # for help ;)

    $fileName = @ARGV[0];

    open(IN,\"$fileName\") || die \"Can\t open file $fileName\";

    $dpi300 = \"\\x1B*t300R\";
    $dosCr = \"\\x1B&k3G\";
    $ends = \"\\x0A\";

    $port = 9100 unless $port;
    $them = \"bach.sr.hp.com\" unless $them;

    $AF_INET = 2;
    $SOCK_STREAM = 1;
    $SIG{\INT\} = \dokill\;
    $sockaddr = \S n a4 x8\;

    chop($hostname = `hostname`);
    ($name,$aliases,$proto) = getprotobyname(\tcp\);
    ($name,$aliases,$port) = getservbyname($port,\tcp\)
    unless $port =~ /^\\d+$/;;
    ($name,$aliases,$type,$len,$thisaddr) =
    gethostbyname($hostname);
    ($name,$aliases,$type,$len,$thataddr) = gethostbyname($them);
    $this = pack($sockaddr, $AF_INET, 0, $thisaddr);
    $that = pack($sockaddr, $AF_INET, $port, $thataddr);

    if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
    # print \"socket ok\\n\";
    }
    else {
    die
    发布人:netbull 来自:非常Linux