
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 フィルター スクリプトは空のファイルで呼び出され、空のページを生成します。プリンターはこれを無視します。この問題の回避策が 2 つ見つかりました。
1) MacOSからの出力をgzip圧縮してLinuxサーバーに送信します。cupsサーバーは出力を解凍し、hppsフィルターにパイプします。フィルターは独自のヘッダーとフッターを付けてソースファイルをプリンターに送信します。特別な設定(バナーなど)がなければ、フィルターからの出力はMacOSの出力と同一です。これを実現するには、以下を追加します。
?compression=gzip
MacOSのcupsサーバーのcups URIにhttps://localhost:631ブラウザで(ターミナルで「cupsctl WebInterface=yes」でインターフェースを有効にします)。「プリンターの変更」を選択し、認証してIPPまたはIPPS印刷プロトコルを選択します。ターゲットURIには前のURIが含まれます。上記の行を追加します。例:
ipps://<ubuntu-cups-server>/printers/<printername>?compression=gzip
説明とモデル設定を保存して保存します。
2) Linuxサーバーに、HPプリンターと同じターゲットURIを持つRAWプリンターをインストールします。ただし、プリンターのメーカーとモデルとしてRawを選択します。たとえば、プリンターの名前が「hp1」の場合、2番目のプリンターとして「hp1_raw」を追加します。MacOSでは、RAWプリンターURIを宛先として使用します。
ipps://<ubuntu-cups-server>/printers/hp1_raw
小さなリスクが残ります。Linux で PostScript 以外のファイルを raw キューに送信すると、プリンタはこのファイルをテキストとして印刷します。小さな 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)