17 打印机操作 #
SUSE® Linux Enterprise Server 支持使用多种类型的打印机进行打印,其中包括远程网络打印机。可以手动或使用 YaST 配置打印机。有关配置描述,请参见第 11.3 节 “设置打印机”。启动和管理打印任务时既可以使用图形实用程序,也可以使用命令行实用程序。如果打印机未能按预期正常工作,请参见第 17.8 节 “查错”。
CUPS(通用 Unix 打印系统)是 SUSE Linux Enterprise Server 中的标准打印系统。
可以根据接口(例如 USB 或网络)以及打印机语言对打印机进行区分。购买打印机时,确保打印机配有支持的接口(USB、以太网或 Wi-Fi)和合适的打印机语言。可以按照以下三类打印机语言对打印机进行分类:
- PostScript 打印机
Linux 和 Unix 中的内部打印系统使用 PostScript 这种打印机语言生成并处理大部分打印任务。如果打印机可以直接处理 PostScript 文档而不需要在打印系统中通过附加步骤转换这些文档,则可以降低可能出现的错误的数目。
PDF 正在逐渐取代 PostScript,成为标准打印作业格式。可直接打印 PDF(而不仅仅是 PostScript)的 PostScript+PDF 打印机已经面世。传统的 PostScript 打印机需要在打印工作流程中将 PDF 转换为 PostScript。
- 标准打印机(PCL 和 ESC/P 等语言)
对于已知的打印机语言,打印系统可以借助 Ghostscript 将 PostScript 作业转换为相应的打印机语言。此处理阶段称为解释。最有名的语言有 PCL(主要是 HP 打印机及其克隆产品使用)和 ESC/P(Epson 打印机使用)。这些打印机语言通常受 Linux 支持,可以生成令人满意的打印效果。Linux 可能无法使用某些特殊打印机功能。除了 HP 和 Epson 之外,当前尚没有其他打印机制造商开发 Linux 驱动程序,并通过开放源代码许可证将这些驱动程序提供给 Linux 发行套件供应商。
- 专有打印机(也称作 GDI 打印机)
这些打印机不支持任何常见的打印机语言。这些打印机使用自己的无文档记录打印机语言,该语言在发布新版本时可能发生变化。通常只有 Windows 驱动程序供这些打印机使用。有关更多信息,请参见第 17.8.1 节 “打印机没有标准打印机语言支持”。
在您购买新打印机之前,请参考以下资源以了解您要购买的打印机的支持情况:
- http://www.linuxfoundation.org/OpenPrinting/
包含打印机数据库的 OpenPrinting 主页。数据库显示最新的 Linux 支持状态。但是,Linux 分发只能集成生产时可用的驱动程序。因此,当前标为“完全支持”的打印机在最新的 SUSE Linux Enterprise Server 版本发布后,不一定还具有此状态。这样,数据库不一定可以指出正确的状态,只是提供大致估计而已。
- http://pages.cs.wisc.edu/~ghost/
Ghostscript 网页
/usr/share/doc/packages/ghostscript/catalog.devices
内置 Ghostscript 驱动程序列表。
17.1 CUPS 工作流程 #
用户创建一个打印任务。打印作业由要打印的数据和有关假脱机程序的信息组成。其中包括打印机的名称或打印队列的名称,还有可能包括有关过滤器(例如特定于打印机的选项)的信息。
每台打印机至少有一个专用打印队列。假脱机程序储存着队列中的打印任务,直到所需打印机已做好接收数据的准备。打印机准备就绪后,假脱机程序通过过滤器和后端将数据发送到打印机。
过滤器将转换正在打印的应用程序生成的数据(通常为 PostScript 或 PDF,也可能为 ASCII、JPEG 等)特定于打印机的数据(PostScript、PCL、ESC/P 等)。PPD 文件中描述了打印机的功能。PPD 文件包含打印机特定的选项以及在打印机上启用这些选项所需的参数。过滤器系统用于确保用户选择的选项被启用。
如果使用的是 PostScript 打印机,则过滤器系统将数据转换为打印机特定的 PostScript。这样做不需要打印机驱动程序。如果使用的是非 PostScript 打印机,则过滤器系统将数据转换为打印机专用的数据。这样做需要一个适合您的打印机的 打印机驱动程序。后端从过滤器接收打印机特定的数据,然后将其传递到打印机。
17.2 连接打印机的方法和协议 #
可以通过多种方法将打印机连接到系统。CUPS 的配置不能区分本地打印机和通过网络连接到系统的打印机。有关打印机连接的更多信息,请阅读 http://en.opensuse.org/SDB:CUPS_in_a_Nutshell 上的文章 CUPS in a Nutshell(CUPS 概述)。
IBM Z CUPS 不支持 z/VM 提供的可与 IBM Z 大型机进行本地连接的打印机和类似设备。在这些平台上,只能通过网络进行打印。必须根据打印机制造商的描述安装网络打印机的电缆。
当将打印机连接到计算机时,一定不要忘记操作期间只能插入或拔下 USB 设备。为防止损坏系统或打印机,请在更改任何非 USB 连接前先关闭系统。
17.3 安装软件 #
PPD(PostScript 打印机描述)是描述属性(例如,分辨率)和选项(例如,双面打印单位的可用性)的计算机语言。这些描述对于使用 CUPS 中的各个打印机选项是必需的。如果没有 PPD 文件,打印数据将被以“原始”状态转发到打印机,通常这不是希望出现的情况。
要配置 PostScript 打印机,最佳的方法是获得一个合适的 PPD 文件。manufacturer-PPDs
和 OpenPrintingPPDs-postscript
包中提供了许多 PPD 文件。请参见第 17.7.3 节 “多种包中的 PPD 文件”和第 17.8.2 节 “没有合适的 PPD 文件可用于 PostScript 打印机”。
新的 PPD 文件可以储存在目录 /usr/share/cups/model/
中,或如第 11.3.1.1 节 “使用 YaST 添加驱动程序”中所述使用 YaST 添加到打印系统中。随后,可以在打印机设置过程中选择 PPD 文件。
如果打印机制造商希望您安装整个软件包,请务必小心。这种安装类型可能导致 SUSE Linux Enterprise Server 提供的支持失效。另外,打印命令可能会以不同的方式工作,并且系统可能不再能够对其他制造商的设备寻址。出于此原因,不建议安装制造商软件。
17.4 网络打印机 #
网络打印机可以支持多种协议,有些甚至支持并发打印不同协议。尽管大部分支持的协议都已标准化,但某些制造商可能修改了标准。他们仅提供适用于少数操作系统的驱动程序。不过很少提供 Linux 驱动程序。当前的情况是您在执行操作时不能假定每个协议都可以在 Linux 中正常工作。因此,您可能需要试验不同的选项以找出起作用的配置。
CUPS 支持 socket
、LPD
、IPP
和 smb
协议。
- 套接字
套接字是指将纯文本打印数据直接发送到 TCP 套接字的连接。一些常用的套接字端口号包括
9100
或35
。设备 URI(统一资源标识符)的语法为 socket://IP.OF.THE.PRINTER:PORT,例如socket://192.168.2.202:9100/
。- LPD(行式打印机守护程序)
LPD 协议如 RFC 1179 中所述。使用此协议,打印队列 ID 等作业相关数据将先于实际打印数据发送。因此,配置 LPD 协议时必须指定打印队列。各打印机制造商的实施非常灵活,可以接受为打印队列指定任何名称。如果需要,打印机手册应该指出要使用的名称。通常使用 LPT、LPT1、LP1 或类似的名称。LPD 服务的端口号是
515
。设备 URI 示例:lpd://192.168.2.202/LPT1
。- IPP(因特网打印协议)
IPP 是一个基于 HTTP 协议的相对较新的协议 (1999)。使用 IPP,所传送的与任务有关的数据比其他协议要多一些。CUPS 使用 IPP 进行内部数据传送。要正确配置 IPP,必须提供打印队列的名称。IPP 的端口号是
631
。设备 URI 示例:ipp://192.168.2.202/ps
和ipp://192.168.2.202/printers/ps
。- SMB(Windows 共享)
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
17.5 使用命令行工具配置 CUPS #
CUPS 可使用 lpinfo
、lpadmin
和 lpoptions
之类的命令行工具配置。您需要一个包含一个后端(例如 USB)和多个参数的设备 URI。要确定系统上的有效设备 URI,请使用命令 lpinfo -v | grep ":/"
:
# lpinfo -v | grep ":/" direct usb://ACME/FunPrinter%20XL network socket://192.168.2.253
使用 lpadmin
,CUPS 服务器管理员可以添加、删除或管理打印队列。要添加打印队列,请使用以下语法:
lpadmin -p QUEUE -v DEVICE-URI -P PPD-FILE -E
设备 (-v
) 便会用作 QUEUE (-p
),并使用指定的 PPD 文件 (-P
)。这意味着如果要手动配置打印机,则必须了解 PPD 文件和设备 URI。
不要使用 -E
作为第一个选项。对于所有 CUPS 命令,将 -E
用作第一个参数设置使用加密连接。要启用打印机,必须使用 -E
,如下面的示例所示:
lpadmin -p ps -v usb://ACME/FunPrinter%20XL -P \ /usr/share/cups/model/Postscript.ppd.gz -E
以下示例配置了网络打印机:
lpadmin -p ps -v socket://192.168.2.202:9100/ -P \ /usr/share/cups/model/Postscript-level1.ppd.gz -E
有关 lpadmin
的更多选项,请参考 lpadmin(8)
的手册页。
在系统安装期间,某些选项被设置为默认值。可以为每个打印任务修改这些选项(根据所使用的打印工具)。也可以使用 YaST 来更改这些默认选项。使用命令行工具设置默认选项,如下所示:
首先,列出所有选项:
lpoptions -p QUEUE -l
示例:
Resolution/Output Resolution: 150dpi *300dpi 600dpi
激活的默认选项通过加星号前缀 (
*
) 进行标识。使用
lpadmin
更改选项:lpadmin -p QUEUE -o Resolution=600dpi
检查新设置:
lpoptions -p QUEUE -l Resolution/Output Resolution: 150dpi 300dpi *600dpi
普通用户运行 lpoptions
时,设置将写到 ~/.cups/lpoptions
。但是,根
设置将写到 /etc/cups/lpoptions
。
17.6 从命令行打印 #
要从命令行打印,请输入 lp -d
QUEUENAME FILENAME,并用相应的名称替换 QUEUENAME 和 FILENAME。
有些应用程序依赖于 lp
命令来进行打印。在这种情况下,请在应用程序的打印对话框中输入正确的命令(通常无需指定 FILENAME),例如 lp -d
QUEUENAME。
17.7 SUSE Linux Enterprise Server 中的特殊功能 #
某些 CUPS 功能已针对 SUSE Linux Enterprise Server 做出调整。这里将介绍一些最重要的更改。
17.7.1 CUPS 和防火墙 #
执行默认 SUSE Linux Enterprise Server 安装后,SuSEFirewall2 将处于活动状态,且网络接口配置为位于外部区域
中,这会阻止传入通讯。Section 16.4, “SuSEfirewall2”中和 http://en.opensuse.org/SDB:CUPS_and_SANE_Firewall_settings 上提供了有关 SuSEFirewall2 配置的更多信息。
17.7.1.1 CUPS 客户端 #
通常 CUPS 客户端在使用防火墙的可信网络环境中的常规工作站上运行。在这种情况下,建议将网络接口配置为在内部区域
中,这样可以从网络内部访问工作站。
17.7.1.2 CUPS 服务器 #
如果 CUPS 服务器在受防火墙保护的可信网络环境中,则应将网络接口配置为在防火墙的内部区域
中。建议不要在不可信网络环境中安装 CUPS 服务器,除非您确定该服务器受到特殊防火墙规则和 CUPS 配置中的安全设置的保护。
17.7.2 浏览网络打印机 #
CUPS 服务器会定期在网络上公告共享打印机的可用性及状态信息。客户端可以访问此信息,以便在打印对话框中显示可用打印机列表。此过程称为“浏览”。
CUPS 服务器通过传统的 CUPS 浏览协议或 Bonjour/DND-SD 在网络上公告它们的打印队列。为了能够浏览网络打印队列,通过 CUPS 服务器打印的所有客户端上都需要运行 cups-browsed
服务。默认情况下,cups-browsed
不会启动。要为活动会话启动它,请使用 sudo systemctl start cups-browsed
。要确保它在系统引导后自动启动,请在所有客户端上使用 sudo systemctl enable cups-browsed
启用它。
如果在启动 cups-browsed
之后浏览不起作用,则表明 CUPS 服务器可能是通过 Bonjour/DND-SD 公告网络打印队列的。在此情况下,您需要另外安装 avahi
包,并在所有客户端上使用 sudo systemctl start avahi-daemon
启动关联的服务。
17.7.3 多种包中的 PPD 文件 #
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
17.8 查错 #
下面几节介绍一些最常遇到的打印机硬件和软件问题以及解决或避免这些问题的方法。讨论的主题有 GDI 打印机、PPD 文件和端口配置。另外还讨论常见网络打印机问题、打印件问题以及队列处理。
17.8.1 打印机没有标准打印机语言支持 #
这些打印机不支持任何常见的打印机语言,只能使用专门的专有控制系列来进行寻址。因此这些打印机只能用于制造商提供了驱动程序的操作系统版本。GDI 是 Microsoft* 为图形设备开发的编程接口。通常制造商只提供 Windows 的驱动程序,而因为 Windows 驱动程序使用 GDI 界面,所以这些打印机也称作 GDI 打印机。问题实际并不是出在编程接口上,而是因这些打印机只能通过相应打印机型号的专用打印机语言来寻址所造成。
某些 GDI 打印机可切换成以 GDI 方式或一种标准打印机语言进行操作。请参见打印机手册以了解这是否可行。有些型号需要有专门的 Windows 软件来进行切换(注:Windows 打印机驱动程序在通过 Windows 进行打印时可能总是将打印机切换回 GDI 模式)。对于其他 GDI 打印机,还有针对标准打印机语言的扩展模块。
某些制造商为他们的打印机提供专有驱动程序。专有打印机驱动程序的缺点在于不能保证这些驱动程序可用于已安装的打印系统,也不能保证它们适合各种硬件平台。相反,支持标准打印机语言的打印机不依赖于特殊的打印系统版本或特殊的硬件平台。
与其花时间尝试使专有 Linux 驱动程序运行,购买支持标准打印机语言(最好是 PostScript)的打印机可能更经济高效。这可以一次性彻底解决驱动程序问题,您不再需要安装并配置特殊驱动程序软件,以及获取由于打印系统中开发的新功能而必须安装的驱动程序更新。
17.8.2 没有合适的 PPD 文件可用于 PostScript 打印机 #
如果 manufacturer-PPDs
或OpenPrintingPPDs-postscript
包不包含适用于 PostScript 打印机的 PPD 文件,则可以使用打印机制造商提供的驱动程序 CD 上的 PPD 文件,或从打印机制造商网页下载合适的 PPD 文件。
如果以 zip 存档 (.zip) 或自解压缩 zip 存档 (.exe
) 的形式提供 PPD 文件,则用 unzip
命令将其解包。首先,查看 PPD 文件的许可证协议条款。然后使用 cupstestppd
实用程序来确认 PPD 文件是否与“ Adobe PostScript 打印机描述文件格式规范 V4.3” 相符合,如果实用程序返回 “FAIL,”则描述 PPD 文件中的错误很严重,可能导致重大问题。应该解决 cupstestppd
报告的问题点。如果需要,询问打印机制造商是否提供合适的 PPD 文件。
17.8.3 网络打印机连接 #
- 确定网络问题
将打印机直接连接到计算机。出于测试目的,将该打印机配置为本地打印机。如果打印机可以工作,则问题与网络有关。
- 检查 TCP/IP 网络
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
响应,响应应该描述为什么在主机
的队列
上不能进行打印。如果您接收到类似例 17.1 “来自lpd
的错误消息” 中的响应,则问题是由远程lpd
引起的。例 17.1︰ 来自lpd
的错误消息 #lpd: your host does not have line printer access lpd: queue does not exist printer: spooling disabled printer: printing disabled
- 检查远程
cupsd
CUPS 网络服务器可以在 UDP 端口
631
上广播其队列,默认每 30 秒广播一次。因此,以下命令可用于测试网络中是否存在广播 CUPS 网络服务器。执行此命令之前,务必停止本地 CUPS 守护程序。netcat -u -l -p 631 & PID=$! ; sleep 40 ; kill $PID
如果广播 CUPS 网络服务器存在,则输出如例 17.2 “来自 CUPS 网络服务器的广播” 所示。
例 17.2︰ 来自 CUPS 网络服务器的广播 #ipp://192.168.2.202:631/printers/queue
IBM Z 请注意,IBM Z 以太网设备默认不接收广播。
以下命令可用于测试是否可以与 HOST 上的
cupsd
(端口631
)建立 TCP 连接:netcat -z HOST 631 && echo ok || echo failed
如果不能与
cupsd
建立连接,则可能是cupsd
未处于活动状态,或者存在基本网络问题。如果相应的cupsd
处于活动状态并且主机接受查询,lpstat -h
HOST -l -t 会返回 HOST 上所有队列的状态报告(可能非常长)。下面的命令可用于测试 HOST 上的 QUEUE 是否接受由单个回车字符组成的打印作业。不应打印任何内容。可能会弹出一页空白纸。
echo -en "\r" \ | lp -d queue -h HOST
- 对网络打印机或打印服务器计算机进行查错
有时,当在打印服务器计算机中运行的假脱机程序需要处理多个打印作业时会产生问题。这是打印服务器计算机中的假脱机程序导致的,目前尚无解决此问题的方法。变通方法是,直接通过 TCP 套接字对连接到打印服务器计算机的打印机进行寻址,来绕过打印服务器计算机中的假脱机程序。请参见 第 17.4 节 “网络打印机”。
这样,打印服务器计算机仅充当各种不同数据传送方式之间(TCP/IP 网络和本地打印机连接)的转换器。要使用此方法,您需要知道打印服务器计算机上的 TCP 端口。如果打印机连接到打印服务器计算机并且已启动,则通常可以在打开打印服务器计算机电源一段时间后使用
nmap
包中的nmap
实用程序确定此 TCP 端口。例如,nmap
IP-address 可能会返回打印服务器计算机的以下输出:Port State Service 23/tcp open telnet 80/tcp open http 515/tcp open printer 631/tcp open cups 9100/tcp open jetdirect
此输出指出可以在端口
9100
上通过 TCP 套接字对连接到打印服务器计算机的打印机寻址。默认情况下,nmap
只检查在/usr/share/nmap/nmap-services
中列出的一些常见的端口。要检查所有可能的端口,请使用命令nmap -p
FROM_PORT-TO_PORT IP_ADDRESS。这可能要花一些时间。有关详细信息,请参见nmap
的手册页。输入如下命令
echo -en "\rHello\r\f" | netcat -w 1 IP-address port cat file | netcat -w 1 IP-address port
将字符串或文件直接发送到相应的端口以测试是否可以在该端口上对打印机进行寻址。
17.8.4 打印件有问题但没有错误消息 #
对于打印系统,打印任务完成的标志是 CUPS 后端完成到接收方(打印机)的数据传送。如果在接收方的进一步处理失败(例如,如果打印机无法打印特定于打印机的数据),则打印系统不会对此进行通知。如果打印机无法打印特定于打印机的数据,请选择一个更适合该打印机的 PPD 文件。
17.8.5 禁用的队列 #
如果向接收方传送数据在多次尝试后都失败,则 CUPS 后端(例如 USB
或 socket
)向打印系统(向 cupsd
)报告一个错误。后端用于确定在将数据传送报告为不可行前应执行的失败尝试次数。由于继续尝试可能也是徒劳,cupsd
将禁用相应队列的打印。在消除了问题的起因后,系统管理员必须使用 cupsenable
命令重新启用打印。
17.8.6 CUPS 浏览:删除打印任务 #
如果 CUPS 网络服务器通过浏览向客户端主机广播其队列并且客户端主机上合适的本地 cupsd
处于活动状态,则客户端 cupsd
接受来自应用程序的打印任务并将它们转发到服务器上的 cupsd
。当服务器上的 cupsd
接受打印任务后,会为该任务指派一个新的任务号。因此,客户端主机上的任务号与服务器上的任务号不同。因为打印作业通常都会立即转发出去,所以不能用客户端主机上的作业号将其删除,原因是当打印作业已转发到服务器 cupsd
后,客户端 cupsd
会将打印作业视为已完成。
要删除服务器上的打印作业,请使用 lpstat -h cups.example.com -o
之类的命令来确定服务器上的作业编号。此情况假设服务器尚未完成该打印作业(即尚未完全将它发送到打印机)。按如下方式使用获得的作业编号来删除服务器上的打印作业:
cancel -h cups.example.com QUEUE-JOBNUMBER
17.8.7 有问题的打印任务和数据传送错误 #
如果在打印过程中关闭打印机或计算机,则打印任务将保留在队列中。再次打开计算机(或打印机)后,打印将继续。必须使用 cancel
从队列中删除有问题的打印任务。
如果打印作业损坏,或主机与打印机之间的通讯出现错误,打印机将无法正确处理数据,并会打印出很多张有乱码的纸。要修复该问题,请执行以下步骤:
要停止打印,请将所有纸张从喷墨打印机中取出或打开激光打印机的纸盒。高质量的打印机具有一个用于取消当前打印件的按钮。
打印任务可能仍在队列中,因为只有在将任务完全发送到打印机后才会将它们删除。使用
lpstat -o
或lpstat -h cups.example.com -o
检查哪个队列当前正在打印。使用cancel
QUEUE-JOBNUMBER 或cancel -h cups.example.com
QUEUE-JOBNUMBER 删除打印作业。即使已将打印任务从队列中删除,某些数据仍会被传送到打印机。检查 CUPS 后端进程是否仍在为相应的队列运行并将其终止。
通过关闭打印机一段时间完全重设置打印机。然后插入纸张并打开打印机。
17.8.8 调试 CUPS #
使用以下通用过程确定 CUPS 中的问题:
在
/etc/cups/cupsd.conf
中设置LogLevel debug
。停止
cupsd
。删除
/var/log/cups/error_log*
从而无需搜索非常长的日志文件。启动
cupsd
。重复导致问题的操作。
检查
/var/log/cups/error_log*
中的消息以确定问题的原因。
17.8.9 更多信息 #
有关在 SUSE Linux 上打印的详细信息,请参见 openSUSE 支持数据库,网址为 http://en.opensuse.org/Portal:Printing。SUSE 知识库 (http://www.suse.com/support/) 中提供了对许多特定问题的解决方案。通过对 CUPS
的文本搜索找到相关文章。