RPDL 用 cups-raster フィルタを書いた

Ricoh IPSiO SP6120Linux から使うシリーズ。

前回Ricoh RPDL IV Laser Printer Foomatic ドライバの出力をフィルタするスクリプトを書いて両面印刷に対応させたりしました。

この場合の印刷フローは下記のようになっています。

  • ドキュメント =[cairo]=> PostScript =[Ghostscript rpdl driver]=> RPDL native

(実際には CUPS フロントエンドがデータをうけとって、foomatic-RIP フィルタを介して Ghostscript を呼び出したりしてるんですが、そのへんのフローは無視します)
で、Ghostscript rpdl driver の吐く RPDL native データ形式スクリプトで加工した、ということになってます。

今回作成した cups-raster フィルタを使った場合の印刷フローは下記のようになります。

  • ドキュメント =[cairo]=> PostScript =[Ghostscript cups driver]=> CUPS raster =[cups-raster filter]=> RPDL native

(実際には pstoraster フィルタコマンドによって Ghostscript cups driver が呼び出されたりしてるんですが、そのへんのフローは無視します)

上記のフローに比べて1レイヤ増えていることがわかります。ですが、CUPS raster 形式という可搬性のあるフォーマットを経由している*1ので、プリンタドライバを開発する上ではこちらのほうが楽なのです。しかも標準入出力を読み書きするスタンドアロンなプログラムを書けばいいので、デバッグも(そこそこ)楽です。


ともあれ、今回開発したドライバを下記においておきます。

LIPS & ESC/Page & NPDL & RPDL 対応 Ghostscript デバイスドライバからエスケープシーケンスやロジックなどを抜き出した*2ので、倣って GPL v2 としてあります。


以下注意点など。

  • さまざまな機種で入念にテストしたわけではないので、おかしな出力となり紙を浪費したり、紙詰まりをおこすことがありえます
  • どこに原因があるのかわかりませんが、ページ全体が真っ白になったり一部しか印字されないことがありました
    • Ubuntu 9.10 の cairo による PostScript 出力がおかしいのか
    • Ubuntu 9.10 の Ghostscript による PostScript 解釈がおかしいのか
    • Ubuntu 9.10 の Ghostscript cups driver がおかしいのか、不明
      • cups-raster フィルタに画像データがわたってくる時点でブランクになってたりした
      • 該当する PostScript ファイルを Ghostscript で画面に表示してもブランクになってた
      • でも通常の gs-rpdl ドライバだと出力されたりするんですよね、なぜか
  • landscape なデータを 2-up で portrait 出力する場合、なぜかページ順が上下逆になってしまいます
    • cups-raster フィルタ時点では 2-up 時点で統合した画像になっているので対処しようがありません(より上位の部分がおかしいんだと思う)
    • portrait なデータを 2-up で出力する場合は問題ありません

おまけ(リコーオフィシャルのドライバがあった)

と、この文章を書く上で「Ghostscript RPDL」で検索かけたら、リコーの提供している Ghostscript RPDL ドライバ*3がありました。最初っからそのキーワードで検索かければよかった。

Ubuntu 8.04 LTS用ですが、GPL なのでソースも公開されてます。このソースをもとに今回のコードをアップデートする作業がはじまるお*4

*1:この CUPS raster 形式を自力でパースする必要はありません。CUPS Raster API を使えばイメージデータを取得することができます。

*2:実際のインプリメントはほぼ書き下ろしましたが。

*3:といっても Ghostscript RPDL ドライバなので、cups-raster フィルタと異なり Ghostscript を置き換える必要があります。

*4:といっても、リバースエンジニアリングの結果からたいがいのシーケンスはもともと組み込んでありましたけど。このシーケンスを入れてもいいんだ、とか意味がいくつかわかったシーケンスがあるのが大きい。