SDB:Printing from Windows to Linux

跳转到:导航搜索


本教程解释了如何通过网络从 Windows 计算机打印到 openSUSE 上的 CUPS,该 Windows 计算机已为其自身安装了打印机驱动程序。

本文适用于 Linux 下 CUPS 版本高达 2.x,以及那里的传统过滤系统和后端。

如今的无驱动程序打印工作流程则大不相同。

Windows 和 Linux 打印之间的差异

通过网络打印时,Windows 的常见做法是客户端系统运行打印机驱动程序,将原始数据(纯文本、Microsoft Office 文档或其他专有格式)转换为特定于打印机的数据格式,然后通过 SMB 协议通过网络将转换后的数据发送到 Windows 打印服务器上的打印机共享。打印服务器然后将特定于打印机的数据发送到打印机。通常,Windows 打印服务器仅执行缓冲(纯数据缓冲和传输到打印机设备)。过滤(转换为特定于打印机的数据格式)在客户端系统上完成,因此必须在客户端系统上安装打印机驱动程序。当添加或更换打印机时,用户必须在他们的笔记本电脑或工作站上安装匹配的驱动程序才能打印。或者,自动机制可以从 Windows 打印服务器自动安装驱动程序到客户端系统 - 只要客户端系统的用户喜欢自动机制在他们的笔记本电脑或工作站上安装软件,这意味着用户必须信任这种“外国”软件(“如何劫持喜欢打印的无辜客人的笔记本电脑”)。

使用 UNIX/Linux 打印时,客户端系统将原始数据(纯文本、PostScript、PDF 或 JPEG)发送到 CUPS 打印服务器,具体到打印队列,通过 IPP 协议。CUPS 服务器然后运行打印机驱动程序,将数据转换为特定于打印机的数据格式,并将转换后的数据发送到打印机设备(参见 Concepts printing)。CUPS 服务器执行缓冲和过滤。这意味着客户端系统不需要了解打印机型号的差异,也不需要特定于打印机的驱动程序。CUPS 服务器处理打印机硬件的特定细节。优点是,最终用户可以将笔记本电脑和台式机连接到正在运行 CUPS 服务器的网络,在笔记本电脑或台式机上运行自己的 cupsd,并立即打印。有关更多详细信息,请参阅“网络打印的 CUPS 内在设计”在 SDB:CUPS in a Nutshell

为什么 Windows 客户端安装了打印机驱动程序

CUPS 服务器上的过滤系统接受纯文本、PostScript、PDF、JPEG、PNG 和其他一些图形格式。通常,CUPS 打印服务器上的过滤系统无法将 Microsoft Office 文档或其他专有格式转换为特定于打印机的数据,因为没有可用的适当过滤程序。

如果过滤像往常一样在 CUPS 服务器上进行,则需要在 Windows 客户端系统上预先过滤为 PostScript(或另一种接受的格式,例如 PDF),然后才能通过 CUPS 服务器打印。

通常,当 Windows 客户端打印到 CUPS 服务器时,其方式与打印到 Windows 打印服务器上的打印机共享时相同。这意味着 Windows 客户端在打印到 CUPS 服务器时也运行特定于打印机的驱动程序。优点是 Windows 客户端上的应用程序具有特定于打印机的驱动程序的所有特定于打印机的选项(Linux 应用程序使用 PPD 文件来实现此目的,参见 Concepts printing)。

使用 Samba 和 CUPS

CUPS 服务器上的每个打印队列都必须具有匹配的 SMB 打印机共享,以便 Windows 客户端系统可以通过 SMB 协议像往常一样发送其打印数据。这些 SMB 打印机共享由 Samba 提供。

这样,Samba 通过 SMB 协议从 Windows 客户端获取打印数据,然后 Samba 将其转发到 CUPS 打印队列,最后 CUPS 打印系统将其转发到打印机。

与直接可供 Windows 系统访问的打印机相比,从 Windows 通过 Samba 和 CUPS 转发到打印机可能会导致一些延迟,直到打印机开始打印。

强制“原始”打印

当 Windows 客户端运行特定于打印机的驱动程序时,它们会发送特定于打印机的数据。

没有可靠的工作自动方法来检测发送到 CUPS 的数据是特定于打印机的数据(应直接发送到打印机)还是必须过滤才能获得特定于打印机的数据。例如,当它是 PostScript 打印机时,其特定于打印机的数据是 PostScript,但默认情况下 PostScript 数据会被 CUPS 过滤(参见 Concepts printing 中的“PostScript:传统的打印数据格式”)。

因此,当 Windows 客户端系统发送特定于打印机的数据时,必须强制 CUPS 服务器直接将数据发送到打印机,而不是尝试过滤已经特定于打印机的数据。

这称为“原始”打印。可以使用打印命令中的“-o raw”选项(“lp -d queue_name -o raw”)强制 CUPS 执行原始打印。

Samba 默认在 /etc/samba/smb.conf 中具有以下选项以强制原始打印

cups options = raw

这样,Samba 通过 SMB 获取特定于打印机的数据,以原始打印模式将其转发到打印队列,以便 CUPS 将其直接发送到打印机(无需额外过滤)。

替代方案

这里仅提及上述常用方法的替代方案,不详细描述

通过 LPD 协议或 IPP 发送数据

可以配置 Windows 客户端系统,不要像往常一样通过 SMB 将其特定于打印机的数据发送到打印机共享,而是直接通过 LPD 协议或 IPP 将其发送到 CUPS 打印队列。在这种情况下,Windows 客户端系统将 CUPS 打印队列视为网络打印机(即,直接通过网络可访问的打印机)。如果所有 Windows 客户端系统都以这种方式更改,则无需 Samba 即可打印到 CUPS 服务器。

通过 LPD 协议到 CUPS 打印服务器

Windows 通常也可以通过 LPD 协议发送打印数据。在 Windows 中,LPD 协议可能称为“LPR”。请参阅您的 Windows 文档,了解如何为您的特定 Windows 版本设置这种方式的打印。设置通过 LPD 协议打印需要 CUPS 服务器的主机名或 IP 地址以及 CUPS 打印队列名称。

在 CUPS 服务器上,cups-lpd(接受通过 LPD 的 CUPS 数据守护程序)必须运行。直到 CUPS 1.7.5,cups-lpd 通过 xinetd 启动。从 CUPS 2.0 开始,cups-lpd 也可以通过适当的 systemd 单元文件由 systemd 启动。有关更多信息,请参见“man cups-lpd”和 SDB:CUPS in a Nutshell

您可以使用 xinetd 在 /etc/xinetd.d/cups-lpd 配置文件中强制执行原始打印

server_args = cups-lpd -o document-format=application/vnd.cups-raw

使用 systemd 的 cups-lpd 设置不同。

所有具有 MIME 类型 application/vnd.cups-raw 的数据都不会被过滤,而是直接发送到打印机。这意味着通过 LPD 协议发送到所有 CUPS 打印队列的所有数据都以原始模式打印。如果不想对所有 CUPS 打印队列进行 LPD 协议的原始打印,则不能使用上述条目。而是必须使用其他原始队列,如下所示。

通过 IPP 到 CUPS 打印服务器

如今的 Windows 版本通常也可以通过 IPP 发送打印数据。在 Windows 中,IPP 可能称为“HTTP”。请参阅您的 Windows 文档,了解如何为您的特定 Windows 版本设置这种方式的打印。访问 CUPS 服务器上的队列“funprinter1000”的 URL/URI 如下(请注意 CUPS 服务器上必须的“/printers/”部分)

ipp://server.domain/printers/funprinter1000

如果使用 HTTP,则可能需要指定 IPP 端口 631

http://server.domain:631/printers/funprinter1000

通常,无法在 Windows 设置中为通过 IPP/HTTP 打印设置“原始”打印选项。在这种情况下,在 CUPS 服务器上强制执行原始打印的唯一可靠方法是为每个打印机创建一个额外的原始队列,并在从 Windows 打印时使用原始队列。

要通过 YaST 设置原始队列,请在搜索制造商/型号的驱动程序时选择或输入“原始队列”,并在使用 CUPS Web 前端时,选择“原始”作为打印机的制造商。

在 CUPS 服务器上进行过滤

如果要在 CUPS 服务器上进行过滤,则需要在 Windows 客户端系统上进行预过滤到 PostScript(参见上述内容)。这可以使用 Windows 上的 PostScript 驱动程序完成。有关 PostScript 驱动程序,您可以查看 cupsaddsmb man 页面(“man cupsaddsmb”)或 CUPS 1.4 文档在 http://www.cups.org/documentation.php/doc-1.4/man-cupsaddsmb.html

其他资源