私たちは、約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)