📄 printing-howto.txt
字号:
rlpr 可以用在任何使用传统 lpr 的地方, 而且和传统的 BSD lpr 相容. rlpr 最大的好处在於可以 *从任何地方列印到任何地方* 而不用管列印来源端的 系统设定. 它可以像传统的 lpr 做为一个 filter, 而让在远端机器上执行的客 户端像 netscape, xemacs 等能够轻易地列印报表到你本地的机器. 你可以在 [26]SunSite 找到 rlpr. 11.2 列印到 Win95, WinNT, LanManager, 或 Samba 上的印表机 在 Printing to Windows mini-HOWTO 中有比这儿更多的资讯. 透过 [27]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. 你可以在 [28]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 套件包含了像 nprint 和 smbclient 的东西. 其他人已经写下了使用 Apple 网路列印的程序, 远比我所能写的好得多; 请参阅 [29]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 $!;}# Give the socket an address.if (bind(S, $this)) {# print "bind ok\n";}else { die $!;}# Call up the server.if (connect(S,$that)) {# print "connect ok\n";}else { die $!;}# Set socket to be command buffered.select(S); $| = 1; select(STDOUT);# print S "@PJL ECHO Hi $hostname! $ends";# print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends";# print S $dpi300;# Avoid deadlock by forking.if($child = fork) { print S $dosCr; print S $TimesNewR; while (<IN>) { print S; } sleep 3; do dokill();} else { while(<S>) { print; }}sub dokill { kill 9,$child if $child;}11.6 替远端印表机执行 if lpd 一个不寻常的地方在於如果是远端印表机, if 不会被执行. 如果你发现你需 要执行 if, 你可以设定双重伫列(double queue) 并重新伫列报表. 举个例子, 看一下这个 printcap: lj-5:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :if=/usr/lib/lpd/filter-lj-5:lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\ :rp=raw:sd=/var/spool/lpd/lj-5-raw: 和相关的 filter-lj-5 命令稿(script): #!/bin/shgs <options> -q -dSAFER -sOutputFile=- - | \ lpr -Plj-5-remote -U$5 只有在 lpr 以监控程式(daemon) 模式执行的时候, -U 选项才有作用, 这个选项 会正确地设定第二重伫列中的送件人姓名. 你可能应该用更可靠的方法取得送件 人姓名, 因为有些时候它并不是第五个参数. 请参照 [30]printcap 的线上手 □. 11.7 从 Windows 列印 利用 SAMBA 套件可以直接支援以 SMB 协定从 Windows (或许 OS/2) 客户端列印 到 Linux 伺服器, 这个套件同时也支援将你的 Linux 档案系统分享给 Windows 客户端. Samba 包含了相当完整的文件, 也有一份很不错的 Samba FAQ 涵盖到这方面的内 容. 你可以在 Linux 上设置 magic filter 然後以 PostScript 列印, 或是在每 一部 Windows 机器上安装印表机专用的驱动程式然後为他们设定一个不用任何 filter 的伫列. 使用 Windows 驱动程式有些时候会有比较好的输出, 但是如果 有很多部 Windows 机器, 管理者就比较麻烦. 所以先试试看 PostScript 吧! 11.8 从 Apple 列印 Netatalk 支援由 Apple 客户端透过 EtherTalk 列印. 请参照 [31]Netatalk HOWTO Page 以取得更进一步的资讯. 11.9 从 Netware 列印 ncpfs 套件含有一个叫作 pserver 的监控程式(daemon) 可以提供服务给 NetWare 的列印伫列. 据我所了解, 这个系统必须搭配 Bindery-based 的 NetWare, 像是 2.x, 3.x, 或是使用 bindery 存取的 4.x 版本. 要取得更进一步关於 ncpfs 和其 pserver 程式的资讯, 请参照 [32]ncpfs 的 FTP 站. 12. Windows 专用印表机 如同稍早之前我所讨论的, 有些印表机原本就不被支援, 因为它们并非使用一般 的印表机语言, 而是利用电脑的 CPU 来描绘出位元组列(bitmap), 然後再以固定 的速率将之导到(pipe to) 印表机. 少数这类的印表机也使用普通的印表机语 言, 像PCL, 但是通常都没有. 有些 (非常低阶的) 印表机甚至并非使用平行埠连 接, 而是靠厂商的驱动程式来模拟硬体的行为 (最重要的控制信号交 换(handshaking)). 假如你发现你陷在这种恶劣的情况, 无论如何, 总还有一些可能的解决之道. 12.1 Ghostscript Windows 导向器(redirector) 现在有一个 Windows 的印表机驱动程式可以用 (叫做 mswinpr2), 它可以在列印 出报表之前先将其送到 Ghostscript 处理. (有点像在 Unix LPD 中的 if filter). 也有一个新的 Ghostscript 驱动程式可以用 Windows GDI 呼叫来列 印. 把它们兜在一块儿, 这样应该可以让 Windows 机器用厂商的驱动程式列印 PostScript 到一部 Windows 专用的印表机. 如果你成功了, 你可以依照前面让 Linux 透过网路列印到 Windows 印表机的说 明, 让 Unix (以及其它的 Windows, Mac 等) 主机列印到你的印表机. 话虽如此, 我从来没试过, 因为我没有 Windows 专用的印表机, 所以你的评价可 能不同. 所有这儿所牵涉到的软体应该都可以从 Ghostscript 的首页 (请看这份 文件在 Ghostscript 一节中的连结) 找到. 12.2 pbm2ppa 程式 有些 HP 的印表机使用 "Printing Performance Architecture" ("我们太便宜 了, 所以没有 PCL" 的行销术语). 要支援这种印表机, 可以透过使用 Tim Norman 所写的 pbm2ppa 翻译器(translator) 的这种迂回的方式. 基本上, 你使 用 ghostscript 将 PostScript 描绘成 pbm 格式的位元组列图案(bitmapped image), 然後用 pbm2ppa 将其翻译成可以直接倾印(dump) 的印表机专属的 ppa 格式的位元组列(bitmap). 这个程式现在可能也以 ghostscript 驱动程式的型式 出现. ppa 软体可以由 [33]ppa 的首页 取得. pbm2ppa 支援 HP 720, 820, 和 1000 的一些机种; 请阅读套件中所附的文件以取得有关 ppa 印表机支援的更进一步资
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -