無法從 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)

相關內容