无法从 MacOS Sierra 通过 CUPS 进行打印

无法从 MacOS Sierra 通过 CUPS 进行打印

我们有一个在 Ubuntu 14.04 上运行的 CUPS 服务器,配置了大约 10 台 HP 打印机。我们混合使用 Windows、Linux 和 Mac 客户端,完美地打印到服务器。

一直完美无瑕,直到最近一些 Mac 升级到了 Sierra。现在,如果用户尝试通过服务器进行打印,客户端将正常运行,cups 也是如此。作业通过服务器进行处理,作业日志显示作业打印正常。然而,打印机却没有输出任何内容。 Mac 客户端可以使用 AirPrint 直接打印到打印机。

我们有旧版本的 cups,因此我们使用最新的 cups 构建了一个新的 16.04 服务器,结果相同。我们可以从端口 9100 上的打印服务器直接打印到打印机,以便该部分工作正常。

是否可以安全地假设问题不在于cups,而在于MacOS 12.12?有人有任何解决问题的想法吗?

答案1

MacOS 计算机使用自己的 cups 服务器。对于现代 HP 激光打印机,cups 会生成 PostScript 输出,但会针对目标打印机进行一些特殊设置。 Linux机器上的cups服务器解析PostScript输入并使用他自己的设置重新生成输出。在 Linux 上,调用过滤器脚本 /usr/lib/cups/filter/hpps 来生成大多数 HP 激光打印机的输出。问题是 MacOS 的 PostScript 输出,在 Linux 下的 cups 中似乎会忽略该输出。使用空文件调用 hpps 过滤器脚本并生成一个空页面。打印机会忽略这一点。我们找到了解决该问题的两种方法:

1) 将 MacOS 的输出压缩为 gzip 发送到 Linux 服务器。 cups 服务器解压缩输出并将其通过管道传送到 hpps 过滤器。过滤器将带有自己的页眉和页脚的源文件发送到打印机。如果没有特殊设置(例如横幅),过滤器的输出与 MacOS 输出相同。为了实现这个添加

    ?compression=gzip

到 MacOS cups 服务器中的 cups URI。称呼https://本地主机:631您的浏览器(使用“cupsctl WebInterface=yes”启用终端中的界面)。选择“修改打印机”,进行身份验证并选择 IPP 或 IPPS 打印协议。目标 URI 包含先前的 URI。添加上面的行,例如

    ipps://<ubuntu-cups-server>/printers/<printername>?compression=gzip

保留描述和模型设置并保存。

2) 在 Linux 服务器上安装 RAW 打印机,目标 URI 与 HP 打印机相同。但选择 Raw 作为打印机的制造商和型号。例如,如果您的打印机名为“hp1”,则添加“hp1_raw”作为第二台打印机。在 MacOS 中,使用 RAW 打印机 URI 作为目标,例如

    ipps://<ubuntu-cups-server>/printers/hp1_raw

仍然存在一个小风险。如果有人在 Linux 上将非 PostScript 文件发送到原始队列,打印机会将此文件打印为文本。打印一个小PDF文件可能会得到很多润滑纸片。

答案2

hpps包装中的过滤器已hplip损坏。应用补丁:

--- /usr/lib/cups/filter/hpps.shipped       2017-01-13 17:23:49.000000000 +0100
+++ /usr/lib/cups/filter/hpps       2017-03-23 14:51:09.904355996 +0100
@@ -144,6 +144,9 @@

 try:
     job_id, username, title, copies, options = args[0:5]
+    if len(args) > 5:
+        input_fd = os.open(args[5], os.O_RDONLY)
+
     job_id = int(job_id)
 except IndexError:
     bug("Invalid command line: invalid arguments.")
@@ -376,7 +379,7 @@

 while True:
     try:
-        data = os.read(0, 4096)
+        data = os.read(input_fd, 4096)
     except IOError:
         bug('Unable to read from standart input')
         sys.exit(CUPS_FILTER_FAILED)

相关内容