MacOS SierraではCUPS経由で印刷できません。

MacOS SierraではCUPS経由で印刷できません。

私たちは、約10台のHPプリンタで構成されたUbuntu 14.04で動作するCUPSサーバーを持っています。私たちは、サーバーに完全に印刷するために、Windows、Linux、およびMacクライアントを混在して使用します。

最近、一部のMacがSierraにアップグレードされるまで完全に機能しました。ユーザーがサーバーを介して印刷しようとすると、カップと同様にクライアントも正常に実行されます。ジョブはサーバーを介して処理され、ジョブログにはジョブが正常に印刷されていることが示されます。ただし、プリンタは何も出力しません。 MacクライアントはAirPrintを使用してプリンタに直接印刷できます。

私たちは以前のバージョンのcupを持っていたので、最新のcupを使用して新しい16.04サーバーを構築しましたが、同じ結果が得られました。部品が正しく機能するように、ポート9100のプリントサーバーからプリンタに直接印刷できます。

問題がカップではなくMacOS 12.12にあると仮定しても安全ですか?誰でも問題を解決するアイデアはありますか?

答え1

MacOS コンピュータは独自の cup サーバーを使用します。最新のHPレーザープリンタの場合、カップはPostScript出力を生成しますが、ターゲットプリンタにはいくつかの特別な設定があります。 Linux システムのカップサーバーは PostScript 入力を解析し、独自の設定を使用して出力を再生成します。 Linuxでは、ほとんどのHPレーザープリンタの出力を生成するために、フィルタスクリプト/usr/lib/cups/filter/hppsが呼び出されます。問題は、Linuxのcupでは無視されるように見えるMacOSのPostScript出力です。空のファイルでhppsフィルタスクリプトを呼び出し、空のページを生成します。プリンタはこれを無視します。私たちはこの問題を解決するために2つの方法を見つけました。

1) MacOS 出力を gzip で圧縮し、Linux サーバーに送信します。カップサーバーは出力を解凍し、それをhppsフィルターにパイプします。フィルタは、独自のヘッダーとフッターとともにソースファイルをプリンタに送信します。特別な設定(バナーなど)がない場合、フィルタの出力はMacOS出力と同じです。この追加を達成するには

    ?compression=gzip

MacOSカップサーバーのカップURIで。呼ぶhttps://localhost:631お使いのブラウザ(ターミナルでインターフェイスを有効にするには、「cupsctl WebInterface = yes」を使用してください)。プリンタの変更を選択して認証し、IPPまたはIPPS印刷プロトコルを選択します。ターゲットURIには古いURIが含まれています。上記の行を次のように追加します。

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

説明とモデル設定を保存して保存します。

2) HP プリンターと同じターゲット URI を使用して、Linux サーバーに RAW プリンターをインストールします。ただし、プリンタの製造元とモデルとしてRawを選択してください。たとえば、プリンタ名が「hp1」の場合、「hp1_raw」を2番目のプリンタとして追加します。 MacOS では、RAW プリンタ URI をターゲットとして使用します。

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

まだ小さなリスクがあります。誰かがLinuxのrawキューに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)

関連情報