第十一章 打印

将信息写在纸上是一项至关重要的功能,尽管许多人试图消除它。打印有两个基本组成部分。数据必须交付给打印机,并且必须采用打印机可以理解的形式。

第十一章 打印11.1. 快速开始11.2. 打印机连接11.2.1. 总结11.3. 常用页面描述语言11.3.1. 将PostScript®转换为其他PDLs11.3.2. 总结11.4. 直接打印11.5. LPD(Line Printer Daemon)11.5.1. 初始设置11.5.2. 使用 lpr(1) 打印11.5.3. 过滤器11.5.3.1. 防止踩踏纯文本打印机11.5.3.2. PostScript®打印机上带有 print/enscript 的花式纯文本11.5.3.3. 将PostScript®打印到PCL打印机11.5.3.4. 智能过滤器11.5.4. 多个队列11.5.5. 监控打印11.5.5.1. lpq(1) 11.5.5.2. lprm(1)11.5.5.3. lpc(8)11.5.6. 共享打印机11.5.6.1. 别名11.5.6.2. 标题页11.5.7. 参考文献11.6. 其他打印系统11.6.1. CUPS(Common UNIX® Printing System)11.6.2. HPLIP11.6.3. LPRngCUPS on FreeBSD摘要1. 通用Unix打印系统(CUPS)简介2. 安装CUPS打印服务器3. 配置CUPS打印服务器4. 在CUPS打印服务器上配置打印机5. 配置CUPS客户端5.1. UNIX® 客户端5.2. Windows® 客户端6. CUPS故障排除

11.1. 快速开始

可以快速设置基本打印。打印机必须能够打印纯ASCII文本。要打印到其他类型的文件,请参阅【11.5.3. 过滤器】。

  1. 创建一个目录来存储打印时的文件:

  2. 以root身份创建/etc/printcap,并包含以下内容:

    ① 此行用于连接到USB端口的打印机。

    对于连接到并行或“打印机”端口的打印机,请使用:

    对于直接连接到网络的打印机,请使用:

    network-printer-name 替换为网络打印机的DNS主机名。

  3. 通过编辑 /etc/rc.conf 并添加以下行来启用LPD:

    启动服务:

  4. 打印测试:

    如果打印出的两行都不是从左边框开始,而是从“stairstep”(级差,整行逐字跳跃)开始,请参阅【11.5.3.1. 防止在纯文本打印机上出现阶梯】。

    现在可以使用 lpr 打印文本文件。在命令行上给出文件名,或将输出直接导入 lpr

11.2. 打印机连接

打印机以各种方式连接到计算机系统。小型台式打印机通常直接连接到计算机的USB端口。较旧的打印机连接到并行(parallel)或“打印机”端口。一些打印机直接连接到网络,使多台计算机可以轻松共享它们。少数打印机使用罕见的串行端口(serial port)连接。

FreeBSD可以与所有这些类型的打印机通信。

11.2.1. 总结

有线网络连接通常最容易设置,打印速度也最快。为了直接连接到计算机,USB是速度和简单性的首选。并行连接可以工作,但对电缆长度和速度有限制。串行连接更难配置。电缆布线因型号而异,波特率和奇偶校验位等通信参数必须增加复杂性。幸运的是,串行打印机很少见。

11.3. 常用页面描述语言

发送到打印机的数据必须使用打印机可以理解的语言。这些语言被称为页面描述语言(Page Description Languages),简称PDLs。

11.3.1. 将PostScript®转换为其他PDLs

Ports Collection和FreeBSD实用程序中的许多应用程序都会生成PostScript®输出。此表显示了可用于将其转换为其他常见PDL的实用程序:

表23. 输出PDLs

输出PDL产生于备注
PCL 或 PCL5print/ghostscript9-base-sDEVICE=ljet4 用于单色
-sDVICE=cljet5 用于彩色
PCLXL 或 PCL6print/ghostscript9-base-sDEVICE=pxlmono 用于单色
-sDEVICE=pxlcolory 用于彩色
ESC/P2print/ghostscript9-base-sDEVICE=uniprint
XQXprint/foo2zjs 

11.3.2. 总结

为了实现最简单的打印,请选择支持PostScript®的打印机。支持PCL的打印机是下一个首选。使用 print/ghostscript9-base ,这些打印机可以像本机理解PostScript®一样使用。直接支持PostScript®或PCL的打印机几乎总是支持直接打印纯ASCII文本文件。

像典型喷墨打印机这样的行式打印机(line-base printers)通常不支持PostScript®或PCL。它们通常可以打印纯ASCII文本文件。print/grescript9-base 支持其中一些打印机使用的PDL。然而,由于需要传输和打印大量数据,在这些打印机上打印整个基于图形的页面通常非常缓慢。

基于主机的打印机通常更难设置。由于专有的PDL,有些根本无法使用。尽可能避免使用这些打印机。各种型号打印机使用的特定PDL可以在以下网址找到:

http://www.openprinting.org/printers

11.4. 直接打印

对于偶尔打印,文件可以直接发送到打印机设备,无需任何设置。例如,可以将名为 sample.txt 的文件发送到USB打印机:

直接打印到网络打印机取决于打印机的能力,但大多数打印机都接受端口9100上的打印作业, nc(1) 可以与它们一起使用。要将同一文件打印到DNS主机名为 netlaser 的打印机上:

11.5. LPD(Line Printer Daemon)

Line Printer Daemon,行式打印机后台程序

在后台打印文件称为后台打印(spooling)。后台处理程序(spooler)允许用户继续执行计算机上的其他程序,而无需等待打印机缓慢完成打印作业。

FreeBSD包含一个名为 lpd(8) 的后台处理程序。打印作业使用 lpr(1) 提交。

11.5.1. 初始设置

创建用于存储打印作业的目录,设置所有权,并设置权限以防止其他用户查看这些文件的内容:

打印机在 /etc/printcap 中定义。每台打印机的条目包括名称、连接端口和各种其他设置等详细信息。使用以下内容创建 /etc/printcap

创建 /etc/printcap 后,使用 chkprintcap(8) 测试它是否有错误:

在继续之前,请先解决所有报告的问题。

/etc/rc.conf 中启用 lpd(8)

启动服务:

11.5.2. 使用 lpr(1) 打印

文档通过 lpr 发送到打印机。要打印的文件可以在命令行上命名,也可以通过管道传输到 lpr 。这两个命令是等效的,将doc.txt的内容发送到默认打印机:

可以使用 -P 选择打印机。要打印到称为激光的打印机:

11.5.3. 过滤器

到目前为止,所示的示例已将文本文件的内容直接发送到打印机。只要打印机理解这些文件的内容,输出就会正确打印。

有些打印机无法打印纯文本,输入文件甚至可能不是纯文本。

过滤器(filter)允许翻译或处理文件。典型的用途是将一种类型的输入(如纯文本)转换为打印机可以理解的形式,如PostScript®或PCL。过滤器还可以用于提供其他功能,例如添加页码或突出显示源代码以使其更易于阅读。

这里讨论的过滤器是输入过滤器或文本过滤器。这些过滤器将传入文件转换为不同的形式。在创建文件之前,使用 su(1) 成为 root

过滤器在 /etc/printcap 中用 if= 标识符指定。要使用 /usr/local/libexec/lf2crlf 作为过滤器,请按如下方式修改 /etc/printcap

11.5.3.1. 防止踩踏纯文本打印机

典型的FreeBSD文本文件在每行末尾只包含一个换行符。这些行将在标准打印机上“阶梯式”打印:

过滤器可以将换行符转换为回车符和换行符。滑架返回使打印机在每行后返回左侧。使用以下内容创建 /usr/local/libexec/lf2crlf

设置权限并使其可执行:

修改 /etc/printcap 以使用新过滤器:

通过打印相同的纯文本文件来测试过滤器。回车(carriage returns)将导致每行从页面左侧开始。

11.5.3.2. PostScript®打印机上带有 print/enscript 的花式纯文本

GNUEnscript将纯文本文件转换为格式良好的PostScript®,以便在PostScript®打印机上打印。它添加页码,换行,并提供许多其他功能,使打印的文本文件更容易阅读。根据当地纸张尺寸,从Ports Collection安装 print/enscript-letterprint/enscript-a4

使用以下内容创建 /usr/local/libexec/enscript

设置权限并使其可执行:

修改 /etc/printcap 以使用新过滤器:

通过打印纯文本文件来测试过滤器。

11.5.3.3. 将PostScript®打印到PCL打印机

许多程序生成PostScript®文档。然而,廉价的打印机通常只能理解纯文本或PCL。此过滤器在将PostScript®文件发送到打印机之前将其转换为PCL。

从Ports Collection安装Ghostscript PostScript®解释器, print/gestscript9-base

使用以下内容创建 /usr/local/libexec/ps2pcl

设置权限并使其可执行:

发送到此脚本的PostScript®输入在发送到打印机之前将被渲染并转换为PCL。

修改 /etc/printcap 以使用此新的输入过滤器:

通过向过滤器发送一个小型PostScript®程序来测试过滤器:

11.5.3.4. 智能过滤器

检测输入类型并自动将其转换为打印机正确格式的过滤器非常方便。PostScript®文件的前两个字符通常是 %! 。过滤器可以检测这两个字符。PostScript®文件可以原封不动地发送到PostScript®打印机。如前所示,文本文件可以使用Enscript转换为PostScript®。使用以下内容创建 /usr/local/libexec/psif

设置权限并使其可执行:

修改 /etc/printcap 以使用此新的输入过滤器:

通过打印PostScript®和纯文本文件来测试过滤器。

11.5.4. 多个队列

/etc/printcap 中的条目实际上是队列的定义。单个打印机可以有多个队列。当与过滤器结合使用时,多个队列为用户提供了对其作业打印方式的更多控制。

例如,考虑办公室中的联网PostScript®激光打印机。大多数用户希望打印纯文本,但少数高级用户希望能够直接打印PostScript®文件。可以在 /etc/printcap 中为同一台打印机创建两个条目:

发送到 textprinter 的文档将由前面示例中显示的 /usr/local/libexec/enscript 过滤器进行格式化。高级用户可以在 psprinter 上打印PostScript®文件,而无需进行过滤。

这种多队列技术可用于提供对各种打印机功能的直接访问。带有双面打印机的打印机可以使用两个队列,一个用于普通单面打印,另一个带有过滤器,该过滤器发送命令序列以启用双面打印,然后发送传入文件。

11.5.5. 监控打印

有几个实用程序可用于监视打印作业以及检查和控制打印机操作。

11.5.5.1. lpq(1)

lpq(1) 显示用户打印作业的状态。不显示其他用户的打印作业。

在单个打印机上显示当前用户的待处理作业:

在所有打印机上显示当前用户的待处理作业:

11.5.5.2. lprm(1)

lprm(1) 用于删除打印作业。普通用户只允许删除自己的作业。root可以删除任何或所有作业。

从打印机中删除所有挂起的作业:

从打印机中删除单个作业。 lpq(1) 用于查找作业编号。

11.5.5.3. lpc(8)

lpc(8) 用于检查和修改打印机状态。 lpc 后面是一个命令和一个可选的打印机名称。可以使用 all 代替特定的打印机名称,该命令将应用于所有打印机。普通用户可以使用 lpc(8) 查看状态。只有root用户可以使用修改打印机状态的命令。

显示所有打印机的状态:

阻止打印机接受新作业,然后重新开始接受新作业:

停止打印,但继续接受新作业。然后重新开始打印:

出现某些错误情况后重新启动打印机:

关闭打印队列并禁用打印,并显示一条消息向用户解释问题:

重新启用已关闭的打印机:

有关更多命令和选项,请参阅 lpc(8)

11.5.6. 共享打印机

打印机通常由企业和学校的多个用户共享。提供了其他功能,使共享打印机更加方便。

11.5.6.1. 别名

打印机名称设置在 /etc/printcap 中条目的第一行。可以在该名称后添加其他名称或别名。别名与名称和彼此之间用竖线分隔:

别名可以用来代替打印机名称。例如,销售部门的用户使用以下命令打印到他们的打印机

维修部门的用户使用

所有文件都在那台打印机上打印。当销售部门发展到需要自己的打印机时,可以从共享打印机条目中删除别名,并将其用作新打印机的名称。两个部门的用户继续使用相同的命令,但销售文档将发送到新打印机。

11.5.6.2. 标题页

用户可能很难在繁忙的共享打印机生成的页面堆栈中找到他们的文档。创建标题页是为了解决此问题。在每次打印作业之前,都会打印一个包含用户名和文档名的标题页。这些页面有时也被称为横幅或分隔页。

启用页眉页面取决于打印机是通过USB、并行还是串行电缆直接连接到计算机,还是通过网络远程连接。

通过从 /etc/printcap 中的条目中删除 :sh:\(抑制页眉)行,可以启用直接连接打印机上的页眉页。这些标题页仅对新行使用换行符。一些打印机将需要 /usr/share/example/printing/hpif 过滤器来防止打印文本。过滤器将PCL打印机配置为在收到换行时打印回车和换行。

网络打印机的标题页必须在打印机本身上配置。/etc/printcap 中的页眉条目将被忽略。设置通常可以从打印机前面板或可通过web浏览器访问的配置网页中获得。

11.5.7. 参考文献

示例文件:/usr/share/Example/printing/

4.3BSD行式打印机后台程序手册,/usr/share/doc/smm/07.lpd/paper.ascii.gz

手册页:printcap(5)lpd(8)lpr(1)lpc(8)lprm(1)lpq(1)

11.6. 其他打印系统

除了内置的 lpd(8) 之外,还有其他几种打印系统可供选择。这些系统支持其他协议或附加功能。

11.6.1. CUPS(Common UNIX® Printing System)

CUPS是一种流行的打印系统,可在许多操作系统上使用。在FreeBSD上使用CUPS有一篇单独的文章:CUPS

11.6.2. HPLIP

惠普提供了一种打印系统,支持他们的许多喷墨和激光打印机。port为 print/hplip 。主网页位于 https://developers.hp.com/hp-linux-imaging-andprinting 。该port处理FreeBSD上的所有安装细节。配置信息显示在 https://developers.hp.com/hp-linux-imaging-and-printing/install

11.6.3. LPRng

LPRng是作为 lpd(8) 的增强替代品开发的。port为 sysutils/LPRng 。有关详细信息和文档,请参阅 https://lprng.sourceforge.net/


/etc/printcap文件内容如下:


CUPS on FreeBSD

摘要

一篇关于在FreeBSD上配置CUPS的文章。

1. 通用Unix打印系统(CUPS)简介

CUPS是通用UNIX打印系统(Common UNIX Printing System),为基于UNIX®的操作系统提供了一个可移植的打印层。它由Easy Software Products开发,旨在为所有UNIX®供应商和用户推广标准打印解决方案。

CUPS使用互联网打印协议(Internet Printing Protocol,IPP)作为管理打印作业和队列的基础。行式打印机守护程序(Line Printer Daemon,LPD)、服务器消息块(Server Message Block,SMB)和AppSocket(又名JetDirect)协议也支持减少的功能。CUPS添加了网络打印机浏览和基于PostScript打印机描述(PostScript Printer Description,PPD)的打印选项,以支持UNIX®下的真实打印。因此,CUPS非常适合在FreeBSD、Linux®、Mac OS®X或Windows®的混合环境中共享和访问打印机。

CUPS的主要站点是http://www.cups.org/.

2. 安装CUPS打印服务器

要使用预编译的二进制文件安装CUPS,请从根终端发出以下命令:

其他可选但推荐的软件包是 print/guteprintprint/hplip ,这两个软件包都为各种打印机添加了驱动程序和实用程序。安装后,CUPS配置文件可以在 /usr/local/etc/cups 目录中找到。

3. 配置CUPS打印服务器

安装后,必须编辑一些文件来配置CUPS服务器。首先,根据具体情况创建或修改 /etc/devfs.rules 文件,并添加以下信息,以设置所有潜在打印机设备的适当权限,并将打印机与 cups 用户组相关联:

接下来,在/etc/rc.conf中添加两行,如下所示:

这两个条目将在引导时启动CUPS打印服务器,并分别调用上面创建的本地devfs规则。

要在某些Microsoft®Windows®客户端下启用CUPS打印,应在 /usr/local/etc/cups/mime.types/usr/local/ec/cups/mime.convs 中取消注释以下行:

一旦进行了这些更改,devfs(8) 和CUPS系统都必须重新启动,可以通过重新启动计算机或在根终端中发出以下两个命令:

4. 在CUPS打印服务器上配置打印机

安装和配置CUPS系统后,管理员可以开始配置连接到CUPS打印服务器的本地打印机。这部分过程与在其他基于UNIX®的操作系统(如Linux®发行版)上配置CUPS打印机非常相似,如果不是完全相同的话。

管理CUPS服务器的主要方式是通过基于web的界面,可以通过启动web浏览器并在浏览器的URL栏中输入 http://localhost:631 【需要修改 /usr/local/etc/cups/supsd.conf 】。如果CUPS服务器位于网络上的另一台机器上,请将服务器的本地IP地址替换掉 localhost 。CUPS web界面相当直观,因为其中有管理打印机和打印作业、授权用户等部分。此外,在管理屏幕的右侧有几个复选框,可以轻松访问通常更改的设置,例如是否共享连接到系统的已发布打印机,是否允许远程管理CUPS服务器,以及是否允许用户对打印机和打印作业进行额外访问和特权。

添加打印机通常很容易,只需在CUPS web界面的管理屏幕上单击“Add Printer”,或在管理屏幕上也单击“New Printers Found”按钮之一即可。当出现“Device”下拉框时,只需选择所需的本地连接打印 机,然后继续整个过程。如果如上所述添加了 print/gutenprint-cupsprint/hplip ports或包,则后续屏幕中将提供额外的打印驱动程序,这些驱动程序可能会提供更多的稳定性或功能。

5. 配置CUPS客户端

配置CUPS服务器并将打印机添加并发布到网络后,下一步是配置客户端或将访问CUPS服务器的机器。如果一个人有一台同时充当服务器和客户端的台式机,那么可能不需要这些信息中的大部分。

5.1. UNIX® 客户端

CUPS还需要安装在UNIX®客户端上。一旦CUPS安装在客户端上,跨网络共享的CUPS打印机通常会被GNOME或KDE等各种桌面环境的打印机管理器自动发现。或者,可以在以下位置访问客户端计算机上的本地CUPS接口 http://localhost:631 然后单击“管理”部分中的“Add Printer”。当出现“Device”下拉框时,如果自动发现,只需选择联网的CUPS打印机,或者选择 ipphttp 并输入联网CUPS打印机的IPP或HTTP URI,通常使用以下两种语法之一:

如果CUPS客户端难以在网络上找到其他共享的CUPS打印机,有时添加或创建一个文件 /usr/local/etc/cups/client.conf 并添加一个条目会有所帮助,如下所示:

在这种情况下, server-ip 将被网络上CUPS服务器的本地IP地址替换。

5.2. Windows® 客户端

XP之前的Windows®版本无法与基于IPP的打印机进行本地网络连接。但是,Windows®XP和更高版本确实具有此功能。因此,在这些版本的Windows®中添加CUPS打印机非常容易。通常,Windows®管理员将运行Windows®添加打印机向导,选择网络打印机,然后按以下语法输入URI:

如果有一个旧版本的Windows®没有原生IPP打印支持,那么连接到CUPS打印机的一般方法是同时使用 net/samba416 和CUPS,这是本章范围之外的主题。

6. CUPS故障排除

CUPS的困难通常在于权限。首先,仔细检查上述 devfs(8) 权限。接下来,检查在文件系统中创建的设备的实际权限。确保您的用户是 cups 组的成员也是有帮助的。如果CUPS web界面“管理”部分中的权限复选框似乎不起作用,另一种修复方法可能是手动备份位于 /usr/local/etc/cups/cupsd.conf 的主CUPS配置文件,编辑各种配置选项,并尝试不同的配置选项组合。下面列出了一个要测试的示例 /usr/local/etc/cups/cupsd.conf 。请注意,此示例 cupsd.conf 牺牲了安全性以便于配置;管理员成功连接到CUPS服务器并配置客户端后,建议重新访问此配置文件并开始锁定访问。

最后修改日期:2024年11月11日作者:Ed Maste