Ubuntu Weekly Recipe

第472回 EPSON EP-879AWのドライバーレス印刷の不具合を報告する

この記事を読むのに必要な時間:およそ 3.5 分

CUPS印刷システムとしての調査

ここから先の調査はCUPSの印刷システムについての理解が必要になるため,簡単に説明しておきます。

実のところ「ドライバーレス印刷」といっても,ドライバー的な役割をするものが存在しないわけではなく,ただ,それを個別に導入する必要がない仕組みなのです。

まず,アプリケーションやユーザーに対して「このプリンターはこういう能力(両面やカラー印刷の可否,印刷可能な用紙サイズなど)があるよ」と示す情報は,CUPSではPPDというテキストファイルで管理されています。

通常のプリンタードライバーは,プリンターの情報を持つPPDファイルを含んでいますが,ドライバーレス印刷では,プリンターが接続されたときに,能力をInternet Printning Protocolで得てPPDを自動生成して登録しています。

また実際の印刷時には,CUPSの印刷キューに投入されたデータは,いくつかのフィルターを連結したパイプラインで「プリンターが解釈できるデータ」に変換されます。

Apple AirPrint・IPP Everywhereのポイントはどのプリンターでも解釈できるビットマップ形式を決めることで,プリンター個別のデータを作る処理を不要にしたことです。ドライバーレス印刷は,この「どのプリンターでも解釈できるデータ」を作るフィルターを標準で持っているため,個別のドライバーの導入がいらないのです。

そのため,ドライバー印刷のトラブルシュートにおいても次の視点で調査が必要です。

  • 対応するPPDを参照
  • フィルターが適切に動作しているかを確認
PPDの確認

CUPSのプリントキューに対応するPPDは,/etc/cups/ppd以下にあります。中身を覗いてみましょう。まずは次の部分です。

*ColorDevice: True

モノクロになってしまうということはカラーデバイスであると認識されていないのではないかと思ったのですが,そうではないようです。

そのあとに,チェックしたのは次の部分です。

*cupsFilter2: "image/pwg-raster image/pwg-raster 0 -"
*cupsFilter2: "image/urf image/urf 100 -"
*cupsFilter2: "image/jpeg image/jpeg 0 -"

これは最終的にプリンターに送り込むことができるデータ形式です。次のことが読み取れます。

  • pwg-rasterで示されるPWG RasterはIPP Everywhere標準のビットマップ形式です。CUPS Rasterという形式が元になっています。
  • urfはApple Rasterという形式です。名前の通りApple AirPrintで用いられます。
  • このプリンターはJPEGデータを直接受け取ることもできます。
lprでデータを送ってみる

JPEGデータを受け取れることがわかったので,lprコマンドを用いてプリントキューにJPEGデータを送ってみます。

$ lpr -P EPSON-EP-879A-Series TEST.jpg

これはカラーで印刷されました。

では,アプリケーションから印刷するときと同じように,PDFファイルを送ってみましょう。

$ lpr -P EPSON-EP-879A-Series TEST.pdf

モノクロになってしまいます。PDFファイルからラスターデータを作るフィルターパイプラインに問題がありそうなことがわかりました。

プリンターに送られるはずのデータを確認する

CUPSが持っているFileDeviceという機能を用いて,どんなデータが送られているかを確認します。

/etc/cups/cups-files.confファイルを次のように変更して,cupsを再起動すれば機能が有効になります。

# Do we allow file: device URIs other than to /dev/null?
FileDevice Yes

[システム設定]⁠-⁠Printers]でプリントキューを複製し,新たなキューの設定の「デバイスURI」をfile:///tmp/test.prnとして,印刷を行います。/tmp/test.prnというファイルができますので,fileコマンドで確認します。

$ sudo file /tmp/test.prn
/tmp/test.prn: Cups Raster version 2, Big Endian, 360x360 dpi, 2976x4209 pixels 1 bits/color 1 bits/pixel ColorOrder=Chunky ColorSpace=black

フィルターパイプラインで生成されたpwg-rasterファイルが,すでにモノクロになっていることを確認できました。

不具合を報告する

これは明らかな不具合なので報告することにします。しかし,いったいどこに不具合報告するのが適切なのでしょうか。

印刷機能に限らず,オープンソースの不具合報告はなるべく,⁠不具合の原因となっている部分」を特定して,その開発者に報告するのが解決の近道です。しかし,現在のシステム構成は複雑なため,どこに原因があるかを特定するのはなかなか困難です。今回の場合はCUPS,cups-filters,プリンターと最低でも3つの可能性があります。

しかし,ちょっとズルをすれば,要は原因を特定して問題を解決できる人間に伝わればよいわけです。ドライバーレス印刷の場合,2つのキーマンがすぐに浮かびます。

一人はオープンソースの印刷標準化団体OpenPrintingのリーダーかつCanonical社員のTill Kamppeter,もう一人はCUPSのオリジナル作者であり現Apple社員のMichael Sweetです。

過去の経験からすると,Michaelは「それはCUPSの問題ではない」といって不具合を閉じたがる傾向があるのに対し,Tillは問題を解決できるなら手段は汚くてもよいという姿勢が見えます。であれば,一旦はTillに見てもらう,つまりUbuntu側で起票するのがよさそうです。

考えた末に,最終的にモノクロのデータを生成しているモジュールということでcups-filtersパッケージ起票しました。

そして解決へ

起票後わずか数時間でTillから「CUPS付属のipptoolで,プリンターが返している情報を知らせてほしい」と反応があり,それに答えたところ,CUPSのupstreamに報告したよとコメントがありました。CUPS側の問題ということで,影響パッケージにCUPSも追加されました。

CUPSのチケットでの議論は次のような流れでした。ここまで1日足らずです。

Till:「IPPの問い合わせで,プリンターがサポート色空間を大文字で返してくるために,CUPSが生成するPPDに問題が起きる。大文字小文字を無視できないか?」

Mike:「それはプリンターがIPPの仕様に合致していない。考えてみるけど,EPSONにレポートして修正ファームウェアを出してもらうのがいい」

IPP(Internet Printing Protocol)では大文字小文字も含めスキーマが定義されています。Mikeの言い分はもっとも……とはいえ,彼も現実主義者ではあって,ファームウェアの修正がそれほど簡単ではないことは理解しています。そして数日後,ふと見直したところ:

  • [master d2817c9] Allow PWG Raster types to vary by case (non-conformant behavior for Issue #4998)

直っています!

このパッチを取り込んだCUPSのパッケージをあわしろいくやさんに作っていただきました(この場を借りてお礼申し上げます。ありがとうございました)⁠そして導入したところ,PPDの生成ロジックは対応できていることを確認しました。

ただ,一度ドライバーレス印刷でPPDを生成してしまった場合はどこかでそれを覚えているようで,現在,問題の解決には至っていません。Ubuntuのバグ票で質問はしているので,遠からず問題は解消されるのではと思っています。

今回の教訓として,ドライバーレス印刷の場合はUbuntuのCUPSパッケージの不具合として報告するのがよさそうということがわかりました。

ドライバーレス印刷は新しい機能です。筆者のように不具合にあたる可能性もあるでしょうが,なにしろ使うのは感動するほど簡単です。手元に対応プリンターをお持ちの場合,ぜひ試して結果を共有していきましょう!

著者プロフィール

おがさわらなるひこ

LibreOffice日本語チーム所属。主な担当はUI翻訳や東京圏でのイベント企画など。本業は(株)SHIFT所属のソフトウェアテスト自動化アーキテクト。自由なデスクトップとしてUbuntuを愛用。

Twitter@naru0ga