openSUSE® Leap 支持使用多种类型的打印机进行打印,包括远程网络打印机。 打印机可以通过手动方式或使用 YaST 进行配置。 有关配置说明,请参阅 第 17 章,设置打印机。 图形和命令行实用程序都可用于启动和管理打印作业。 如果您的打印机无法按预期工作,请参阅 第 7.8 节,“故障排除”。
CUPS(通用 Unix 打印系统)是 openSUSE Leap 中的标准打印系统。
打印机可以通过接口(例如 USB 或网络)和打印机语言来区分。 购买打印机时,请确保打印机具有受支持的接口(USB、以太网或 Wi-Fi)和合适的打印机语言。 打印机可以根据以下三种打印机语言类别进行分类
PostScript 是 Linux 和 Unix 中大多数打印作业使用的打印机语言,由内部打印系统生成和处理。 如果 PostScript 文档可以直接由打印机处理,而无需在打印系统中进行额外的转换阶段,则可以减少潜在的错误源数量。
目前,PDF 正在取代 PostScript 作为标准的打印作业格式。 已经存在支持 PostScript+PDF 打印机,除了 PostScript 之外,它们还可以直接打印 PDF。 对于传统的 PostScript 打印机,需要在打印工作流程中将 PDF 转换为 PostScript。
对于已知的打印机语言,打印系统可以使用 Ghostscript 将 PostScript 作业转换为相应的打印机语言。 此处理阶段称为解释。 最著名的语言是 PCL(由惠普打印机及其克隆机使用)和 ESC/P(由爱普生打印机使用)。 这些打印机语言通常受 Linux 支持,并能产生足够好的打印结果。 Linux 可能无法处理某些特殊的打印机功能。 除了惠普和爱普生之外,目前没有打印机制造商为 Linux 开发驱动程序,并以开源许可方式向 Linux 发行版提供这些驱动程序。
这些打印机不支持任何常见的打印机语言。 它们使用自己的未公开的打印机语言,这些语言会在发布新版本的型号时发生变化。 通常,只有 Windows 驱动程序才能用于这些打印机。 有关更多信息,请参阅 第 7.8.1 节,“缺少标准打印机语言支持的打印机”。
在购买新打印机之前,请参阅以下资源,以检查您打算购买的打印机的支持情况
OpenPrinting 主页和打印机数据库。 数据库显示最新的 Linux 支持状态。 但是,Linux 发行版只能集成生产时可用的驱动程序。 因此,当前评为 “完美支持” 的打印机在发布最新 openSUSE Leap 版本时可能没有此状态。 因此,数据库不一定指示正确的状态,而仅提供近似值。
Ghostscript 网页。
/usr/share/doc/packages/ghostscript/catalog.devices
内置 Ghostscript 驱动程序列表。
用户创建一个打印作业。 打印作业由要打印的数据以及有关排队器的信息组成。 这包括打印机名称或打印队列名称,以及可选地,有关筛选器的信息,例如特定于打印机的选项。
对于每个打印机,至少存在一个专用的打印队列。 排队器将打印作业保存在队列中,直到所需的打印机准备好接收数据。 当打印机准备好时,排队器通过筛选器和后端将数据发送到打印机。
筛选器将应用程序生成的打印数据(通常是 PostScript 或 PDF,也可能是 ASCII、JPEG 等)转换为特定于打印机的数据(PostScript、PCL、ESC/P 等)。 打印机的功能在 PPD 文件中描述。 PPD 文件包含特定于打印机的选项,以及在打印机上启用这些选项所需的参数。 筛选器系统确保用户选择的选项已启用。
如果使用 PostScript 打印机,筛选器系统会将数据转换为特定于打印机的 PostScript。 这不需要打印机驱动程序。 如果使用非 PostScript 打印机,筛选器系统会将数据转换为特定于打印机的数据。 这需要适合您的打印机的打印机驱动程序。 后端从筛选器接收特定于打印机的数据,然后将其传递给打印机。
有多种可能性可以将打印机连接到系统。 CUPS 的配置不区分本地打印机和通过网络连接到系统的打印机。 有关打印机连接的更多信息,请阅读 CUPS 简介,网址为 https://en.opensuse.net.cn/SDB:CUPS_in_a_Nutshell。
连接打印机到计算机时,请不要忘记只能在运行过程中插入或拔出 USB 设备。 为了避免损坏您的系统或打印机,请在更改任何非 USB 连接之前关闭系统。
PPD(PostScript 打印机描述)是描述属性(例如分辨率)和选项(例如双面单元的可用性)的计算机语言。 这些描述对于在 CUPS 中使用打印机选项是必需的。 如果没有 PPD 文件,打印数据将以 “原始” 状态转发到打印机,这不是期望的结果。
要配置 PostScript 打印机,最好的方法是获取合适的 PPD 文件。 许多 PPD 文件在 manufacturer-PPDs 和 OpenPrintingPPDs-postscript 包中可用。 请参阅 第 7.7.3 节,“多个软件包中的 PPD 文件”和 第 7.8.2 节,“没有适用于 PostScript 打印机的合适的 PPD 文件”。
可以将新的 PPD 文件存储在目录 /usr/share/cups/model/ 中,或使用 YaST 添加,如 第 17.1.1 节,“使用 YaST 添加驱动程序” 中所述。 随后,在打印机设置期间可以选择 PPD 文件。
如果打印机制造商要求您安装整个软件包,请务必小心。 这种安装可能会导致丢失 openSUSE Leap 提供的支持。 此外,打印命令可能会以不同的方式工作,系统可能无法再处理其他制造商的设备。 因此,不建议安装制造商软件。
网络打印机可以支持多种协议。 虽然大多数受支持的协议都是标准化的,但某些制造商会修改标准。 然后,制造商仅为少数操作系统提供驱动程序,并且很少为 Linux 提供驱动程序。 目前的情况是,您不能假定每个协议在 Linux 中都能顺利工作。 因此,您可能需要尝试几种选项才能实现功能配置。
CUPS 支持 socket、LPD、IPP 和 smb 协议。
Socket 指的是将纯打印数据直接发送到 TCP 套接字的连接。 常用的套接字端口号是 9100 或 35。 设备 URI(统一资源标识符)语法为:socket://打印机的 IP 地址:端口号,例如:socket://192.168.2.202:9100/。
LPD 协议在 RFC 1179 中描述。 在此协议下,在发送实际打印数据之前,会发送特定的作业相关数据,例如打印队列的 ID。 因此,在配置 LPD 协议时必须指定打印队列。 各种打印机制造商的实现足以接受任何名称作为打印队列。 如果需要,打印机手册应指示使用哪个名称。 LPT、LPT1、LP1 或类似名称通常用于此目的。 LPD 服务的端口号为 515。 示例设备 URI 为 lpd://192.168.2.202/LPT1。
IPP 基于 HTTP 协议。 使用 IPP,比其他协议传输更多的作业相关数据。 CUPS 使用 IPP 进行内部数据传输。 正确配置 IPP 需要打印队列的名称。 IPP 的端口号为 631。 示例设备 URI 为 ipp://192.168.2.202/ps 和 ipp://192.168.2.202/printers/ps。
CUPS 还支持在连接到 Windows 共享的打印机上打印。 为此使用的协议是 SMB。 SMB 使用端口号 137、138 和 139。 示例设备 URI 为 smb://user:password@workgroup/smb.example.com/printer、smb://user:password@smb.example.com/printer 和 smb://smb.example.com/printer。
在配置之前,必须确定打印机支持的协议。 如果制造商未提供所需的信息,可以使用命令 nmap(随 nmap 包一起提供)来确定协议。 nmap 检查主机上是否有开放的端口。 例如
> nmap -p 35,137-139,515,631,9100-10000 IP.OF.THE.PRINTER可以使用命令行工具(如 lpinfo、lpadmin 和 lpoptions)配置 CUPS。 您需要一个由后端(例如 USB)和参数组成的设备 URI。 要确定系统上的有效设备 URI,请使用命令 lpinfo -v | grep ":/"
>sudolpinfo -v | grep ":/" direct usb://ACME/FunPrinter%20XL network socket://192.168.2.253
使用 lpadmin,CUPS 服务器管理员可以添加、删除或管理打印队列。 要添加打印队列,请使用以下语法
>sudolpadmin -p QUEUE -v DEVICE-URI -P PPD-FILE -E
然后,设备(-v)将作为 队列名称(-p)可用,使用指定的 PPD 文件(-P)。 这意味着您必须知道 PPD 文件和设备 URI 才能手动配置打印机。
不要将 -E 作为第一个选项使用。 对于所有 CUPS 命令,-E 作为第一个参数设置使用加密连接。 要启用打印机,-E 必须按如下所示使用
>sudolpadmin -p ps -v usb://ACME/FunPrinter%20XL -P \ /usr/share/cups/model/Postscript.ppd.gz -E
以下示例配置网络打印机
>sudolpadmin -p ps -v socket://192.168.2.202:9100/ -P \ /usr/share/cups/model/Postscript-level1.ppd.gz -E
有关 lpadmin 的更多选项,请参阅 lpadmin(8) 的手册页。
在打印机设置期间,会设置某些选项作为默认值。 这些选项可以针对每个打印作业进行修改(具体取决于使用的打印工具)。 也可以使用 YaST 更改这些默认选项。 使用命令行工具,按如下方式设置默认选项
首先,列出所有选项
>sudolpoptions -p QUEUE -l
示例
Resolution/Output Resolution: 150dpi *300dpi 600dpi
激活的默认选项由前导星号(*)标识。
使用 lpadmin 更改选项
>sudolpadmin -p QUEUE -o Resolution=600dpi
检查新设置
>sudolpoptions -p QUEUE -l Resolution/Output Resolution: 150dpi 300dpi *600dpi
当普通用户运行 lpoptions 时,设置将写入 ~/.cups/lpoptions。 但是,root 设置将写入 /etc/cups/lpoptions。
要从命令行打印,请输入 lp -d 队列名称 文件名,用相应的名称替换 队列名称 和 文件名。
几个应用程序依赖于 lp 命令进行打印。 在这种情况下,在应用程序的打印对话框中输入正确的命令,通常无需指定 文件名,例如,lp -d 队列名称。
CUPS 的几个功能已针对 openSUSE Leap 进行调整。 这里涵盖了最重要的更改。
完成 openSUSE Leap 的默认安装后,firewalld 处于活动状态,并且网络接口配置为位于 public 区域,这会阻止传入流量。
当 firewalld 处于活动状态时,您可能需要对其进行配置以允许客户端浏览网络打印机,方法是允许 mdns 和 ipp 通过内部网络区域。公共区域绝不应暴露打印队列。
(有关 firewalld 配置的更多信息,请参阅 “安全和加固指南”一书,第 23 章“伪装和防火墙”,第 23.4 节“firewalld” 以及 https://en.opensuse.net.cn/SDB:CUPS_and_SANE_Firewall_settings。)
通常,CUPS 客户端运行在位于受信任网络环境中的常规工作站,该工作站位于防火墙之后。在这种情况下,建议将网络接口配置为位于 Internal Zone,以便工作站可以在网络内部访问。
CUPS 服务器定期通过网络广播共享打印机的可用性和状态信息。客户端可以访问此信息,以便在打印对话框中显示可用打印机列表,例如。这称为 “浏览”。
CUPS 服务器通过传统的 CUPS 浏览协议或 Bonjour/DNS-SD 通过网络广播其打印队列。要启用浏览网络打印队列,需要在所有通过 CUPS 服务器进行打印的客户端上运行 cups-browsed 服务。默认情况下,cups-browsed 不会启动。要为活动会话启动它,请使用 sudo systemctl start cups-browsed。要确保在启动后自动启动它,请使用 sudo systemctl enable cups-browsed 在所有客户端上启用它。
如果启动 cups-browsed 后浏览不起作用,则 CUPS 服务器通过 Bonjour/DNS-SD 广播网络打印队列。在这种情况下,您还需要在所有客户端上安装 avahi 包,并使用 sudo systemctl start avahi-daemon 启动关联的服务。
有关通过 firewalld 允许打印机浏览的信息,请参阅 第 7.7.1 节,“CUPS 和防火墙”。
YaST 打印机配置使用安装在 /usr/share/cups/model 中的 PPD 文件设置 CUPS 的队列。为了找到适合打印机型号的 PPD 文件,YaST 会将硬件检测期间确定的供应商和型号与所有 PPD 文件中的供应商和型号进行比较。为此,YaST 打印机配置会从 PPD 文件中提取的供应商和型号信息生成数据库。
仅使用 PPD 文件和不使用其他信息源的配置具有优势,即可以自由修改 /usr/share/cups/model 中的 PPD 文件。例如,如果您有 PostScript 打印机,可以将 PPD 文件直接复制到 /usr/share/cups/model(如果它们尚未存在于 manufacturer-PPDs 或 OpenPrintingPPDs-postscript 包中),以实现打印机的最佳配置。
以下包提供额外的 PPD 文件
gutenprint:Gutenprint 驱动程序及其匹配的 PPD
splix:SpliX 驱动程序及其匹配的 PPD
OpenPrintingPPDs-ghostscript:用于 Ghostscript 内置驱动程序的 PPD
OpenPrintingPPDs-hpijs:用于非 HP 打印机的 HPIJS 驱动程序的 PPD
以下部分涵盖了最常遇到的打印机硬件和软件问题以及解决或规避这些问题的方法。涵盖的主题包括 GDI 打印机、PPD 文件和端口配置。还讨论了常见的网络打印机问题、有缺陷的打印输出和队列处理。
这些打印机不支持任何常见的打印机语言,只能使用特殊的专有控制序列来寻址。因此,它们只能与制造商为其提供驱动程序的操作系统版本一起工作。GDI 是 Microsoft* 为图形设备开发的编程接口。通常,制造商仅为 Windows 提供驱动程序,由于 Windows 驱动程序使用 GDI 接口,这些打印机也称为 GDI 打印机。实际问题不是编程接口,而是这些打印机只能使用各自打印机型号的专有打印机语言来寻址。
某些 GDI 打印机可以切换为以 GDI 模式或标准打印机语言之一运行。请查阅打印机手册,查看是否可行。某些型号需要特殊的 Windows 软件才能进行切换。例如,Windows 打印机驱动程序在从 Windows 打印时可能会始终将打印机切换回 GDI 模式。对于其他 GDI 打印机,可以使用标准打印机语言的扩展模块。
一些制造商为其打印机提供专有驱动程序。专有打印机驱动程序的缺点是无法保证它们与安装的打印系统兼容或适用于多个硬件平台。相反,支持标准打印机语言的打印机不依赖于特殊的打印系统版本或特殊的硬件平台。
与其花时间尝试使专有 Linux 驱动程序工作,不如购买支持标准打印机语言(最好是 PostScript)的打印机可能更具成本效益。这将一次性解决驱动程序问题,无需安装和配置特殊驱动程序软件以及可能因打印系统中的新发展而需要获得的驱动程序更新。
如果 manufacturer-PPDs 或 OpenPrintingPPDs-postscript 包不包含适用于 PostScript 打印机的合适的 PPD 文件,则应该可以使用打印机制造商的驱动程序 CD 中的 PPD 文件,或从打印机制造商的网站下载合适的 PPD 文件。
如果 PPD 文件作为 zip 存档 (.zip) 或自解压 zip 存档 (.exe) 提供,请使用 unzip 解压缩。首先,查看 PPD 文件的许可条款。然后使用 cupstestppd 实用程序检查 PPD 文件是否符合 “Adobe PostScript 打印机描述文件格式规范,版本 4.3。” 如果该实用程序返回 “FAIL,” 则 PPD 文件中的错误是严重的,并会导致主要问题。应消除 cupstestppd 报告的问题点。如有必要,请向打印机制造商索取合适的 PPD 文件。
将打印机直接连接到计算机。为了测试,将打印机配置为本地打印机。如果这可行,则问题与网络有关。
TCP/IP 网络和名称解析必须正常工作。
lpd使用以下命令测试是否可以建立到 HOST 上的 lpd(端口 515)的 TCP 连接
> netcat -z HOST 515 && echo ok || echo failed如果无法建立到 lpd 的连接,则 lpd 可能未激活或存在基本的网络问题。
前提是相应的 lpd 处于活动状态并且主机接受查询,以 root 身份运行以下命令以查询远程 HOST 上的 QUEUE 的状态报告
# echo -e "\004queue" \
| netcat -w 2 -p 722 HOST 515如果 lpd 没有响应,则它可能未激活或存在基本的网络问题。如果 lpd 响应,则响应应显示为什么无法在 host 上的 queue 上打印。如果您收到类似于 示例 7.1,“来自 lpd 的错误消息” 的响应,则问题是由远程 lpd 引起的。
lpd 的错误消息 #lpd: your host does not have line printer access lpd: queue does not exist printer: spooling disabled printer: printing disabled
cupsdCUPS 网络服务器默认情况下每 30 秒通过 UDP 端口 631 在网络上广播其队列。因此,可以使用以下命令测试网络中是否存在广播 CUPS 网络服务器。确保在执行该命令之前停止本地 CUPS 守护程序。
> netcat -u -l -p 631 & PID=$! ; sleep 40 ; kill $PID如果存在广播 CUPS 网络服务器,则输出将显示为 示例 7.2,“来自 CUPS 网络服务器的广播”。
ipp://192.168.2.202:631/printers/queue
可以使用以下命令测试是否可以建立到 HOST 上的 cupsd(端口 631)的 TCP 连接
> netcat -z HOST 631 && echo ok || echo failed如果无法建立到 cupsd 的连接,则 cupsd 可能未激活或存在基本的网络问题。 lpstat -h HOST -l -t 返回 HOST 上所有队列的状态报告,前提是相应的 cupsd 处于活动状态并且主机接受查询。
可以使用以下命令测试是否可以发送包含单个回车符的打印作业到 HOST 上的 QUEUE。不应打印任何内容。可能会弹出空白页。
> echo -en "\r" \
| lp -d queue -h HOST打印服务器机器中运行的假脱机程序有时会在需要处理多个打印作业时引起问题。由于这是由打印服务器机器中的假脱机程序引起的,因此无法解决此问题。作为解决方法,通过使用 TCP 套接字直接寻址连接到打印服务器机器的打印机来绕过打印服务器机器中的假脱机程序。请参阅 第 7.4 节,“网络打印机”。
这样,打印服务器机器就被简化为多个数据传输形式(TCP/IP 网络和本地打印机连接)之间的转换器。要使用此方法,您需要知道打印服务器机器上的 TCP 端口。如果打印机连接到打印服务器机器并已打开,则通常可以在打印服务器机器启动一段时间后使用 nmap 实用程序从 nmap 包中确定此 TCP 端口。例如,nmap IP 地址 可能会为打印服务器机器提供以下输出
Port State Service 23/tcp open telnet 80/tcp open http 515/tcp open printer 631/tcp open cups 9100/tcp open jetdirect
此输出表明可以通过 TCP 套接字通过端口 9100 寻址连接到打印服务器机器的打印机。默认情况下,nmap 仅检查 /usr/share/nmap/nmap-services 中列出的几个常用端口。要检查所有可能的端口,请使用命令 nmap -p FROM_PORT-TO_PORT IP 地址。有关更多信息,请参阅 nmap 的手册页。
输入如下命令
> echo -en "\rHello\r\f" | netcat -w 1 IP-address port
cat file | netcat -w 1 IP-address port以直接将字符字符串或文件发送到相应的端口,以测试是否可以通过该端口寻址打印机。
对于打印系统,当 CUPS 后端完成将数据传输到接收者(打印机)时,打印作业就完成了。如果接收者上的进一步处理失败(例如,如果打印机无法打印特定于打印机的数据),则打印系统不会注意到这一点。如果打印机无法打印特定于打印机的数据,请选择更适合打印机的 PPD 文件。
如果数据传输到接收者的尝试多次失败后,CUPS 后端(例如 USB 或 socket)将错误报告给打印系统(cupsd)。后端确定在将数据传输报告为不可能之前,允许多少次不成功的尝试。由于进一步的尝试将是徒劳的,cupsd 会禁用相应队列的打印。在消除问题原因后,系统管理员必须使用命令 cupsenable 重新启用打印。
如果 CUPS 网络服务器通过浏览向客户端主机广播其队列,并且在客户端主机上激活了合适的本地 cupsd,则客户端 cupsd 会接受来自应用程序的打印作业并将其转发到服务器上的 cupsd。当服务器上的 cupsd 接受打印作业时,会为其分配一个新的作业编号。因此,客户端主机上的作业编号与服务器上的作业编号不同。由于打印作业通常会立即转发,因此无法使用客户端主机上的作业编号删除它。这是因为客户端 cupsd 在将打印作业转发到服务器 cupsd 后,会将其视为已完成。
要删除服务器上的打印作业,请使用诸如 lpstat -h cups.example.com -o 的命令来确定服务器上的作业编号。这假设服务器尚未通过将其发送到打印机来完成打印作业。使用获得的作业编号,按照以下方式删除服务器上的打印作业
> cancel -h cups.example.com QUEUE-JOBNUMBER如果在打印过程中关闭打印机或关机,打印作业将保留在队列中。当计算机(或打印机)重新启动时,打印将继续。有缺陷的打印作业必须使用 cancel 从队列中删除。
如果打印作业损坏或在主机和打印机之间发生通信错误,打印机将无法正确处理数据,并打印出包含无法理解字符的许多张纸。要解决此问题,请按照以下步骤操作
要停止打印,请从喷墨打印机中取出所有纸张,或打开激光打印机的纸盘。高质量打印机具有用于取消当前打印输出的按钮。
打印作业可能仍然在队列中,因为只有在将其发送到打印机后才会删除作业。使用 lpstat -o 或 lpstat -h cups.example.com -o 检查当前正在打印的队列。使用 cancel QUEUE-JOBNUMBER 或 cancel -h cups.example.com QUEUE-JOBNUMBER 删除打印作业。
即使已从队列中删除打印作业,某些数据仍可能传输到打印机。检查是否有 CUPS 后端进程仍在为相应的队列运行,并停止它。
通过关闭打印机一段时间来重置打印机。然后插入纸张并打开打印机。
使用以下通用过程来定位 CUPS 中的问题
在 /etc/cups/cupsd.conf 中设置 LogLevel debug。
停止 cupsd。
删除 /var/log/cups/error_log* 以避免在大型日志文件中搜索。
启动 cupsd。
重复导致问题的操作。
检查 /var/log/cups/error_log* 中的消息,以确定问题的原因。
关于 openSUSE Leap 上打印的深入信息在 openSUSE 支持数据库中提供,网址为 https://en.opensuse.net.cn/Portal:Printing。