daily dayflower

2010-02-02

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 フィルタを使った場合の印刷フローは下記のようになります。

(実際には 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:といっても、リバースエンジニアリングの結果からたいがいのシーケンスはもともと組み込んでありましたけど。このシーケンスを入れてもいいんだ、とか意味がいくつかわかったシーケンスがあるのが大きい。

naruoganaruoga 2011/02/22 12:20 こんにちは。*nixの印刷環境改善のためにPSを勉強しようと思ってWebをさかのぼっていたら、同じようなことをやろうとしていらっしゃる方がいてびっくりしました。
ご存知とは思いますが、1)GSにはすでにRPDLドライバがいますが(その名もズバリRPDL)、印字領域がヘンテコなのでちょっとイケてない、2)GSのmainstreamはすでにPDL別ドライバのメンテを拒否している、の二つの理由で、OPVP (ftp://www.pwg.org/pub/pwg/fsg/vector/ に仕様があるはずなんだけど、今見られない……) ベースでポートしようかなと思ってます。
問題は私、RPDLのドキュメント持ってないんですよねぇ……。

dayflowerdayflower 2011/02/24 11:34 こんにちはこんにちは。
わたしのやりくちはラスタイメージのレンダリングなので既存のドライバや出力データのリバースエンジニアリングですんだのですが,OPVP だとたしかベクタベースですよね。たしかにRPDLの仕様がわからないといかんともしがたいですね。仕様の入手はリコーはRPDLではなく(よりクローズドな)RPCSに移行しようとしているので望み薄な気もします。
ハードルは高いと思いますががんばってください。

nicholasnicholas 2012/02/03 18:18 どのように私はこれをコンパイルすることができます。
"make all" =

rastertorpdl.c:42:22: error: unknown type name ‘ppd_file_t’
rastertorpdl.c:139:32: error: unknown type name ‘ppd_file_t’
rastertorpdl.c:139:49: error: unknown type name ‘cups_page_header2_t’
rastertorpdl.c:182:32: error: unknown type name ‘ppd_file_t’
rastertorpdl.c:182:49: error: unknown type name ‘cups_page_header2_t’
rastertorpdl.c:206:28: error: unknown type name ‘ppd_file_t’
rastertorpdl.c:206:45: error: unknown type name ‘cups_page_header2_t’
rastertorpdl.c:326:24: error: unknown type name ‘ppd_file_t’
rastertorpdl.c:326:41: error: unknown type name ‘cups_page_header2_t’
rastertorpdl.c: In function ‘main’:
rastertorpdl.c:472:5: error: unknown type name ‘ppd_file_t’
rastertorpdl.c:473:5: error: unknown type name ‘cups_page_header2_t’
rastertorpdl.c:492:5: warning: implicit declaration of function ‘ppdOpenFile’ [-Wimplicit-function-declaration]
rastertorpdl.c:492:9: warning: assignment makes pointer from integer without a cast [enabled by default]
rastertorpdl.c:499:5: warning: implicit declaration of function ‘ppdMarkDefaults’ [-Wimplicit-function-declaration]
rastertorpdl.c:500:5: warning: implicit declaration of function ‘cupsMarkOptions’ [-Wimplicit-function-declaration]
rastertorpdl.c:532:5: warning: implicit declaration of function ‘rpdl_init’ [-Wimplicit-function-declaration]
rastertorpdl.c:536:5: warning: implicit declaration of function ‘cupsRasterReadHeader2’ [-Wimplicit-function-declaration]
rastertorpdl.c:544:54: error: request for member ‘NumCopies’ in something not a structure or union
rastertorpdl.c:548:13: warning: implicit declaration of function ‘rpdl_setup_page’ [-Wimplicit-function-declaration]
rastertorpdl.c:553:30: error: request for member ‘cupsBytesPerLine’ in something not a structure or union
rastertorpdl.c:559:26: error: request for member ‘cupsBytesPerLine’ in something not a structure or union
rastertorpdl.c:569:31: error: request for member ‘cupsHeight’ in something not a structure or union
rastertorpdl.c:573:44: error: request for member ‘cupsBytesPerLine’ in something not a structure or union
rastertorpdl.c:577:48: error: request for member ‘cupsBytesPerLine’ in something not a structure or union
rastertorpdl.c:592:31: error: request for member ‘Duplex’ in something not a structure or union
rastertorpdl.c:597:9: warning: implicit declaration of function ‘rpdl_finish’ [-Wimplicit-function-declaration]
rastertorpdl.c:600:9: warning: implicit declaration of function ‘ppdClose’ [-Wimplicit-function-declaration]
rastertorpdl.c: At top level:
rastertorpdl.c:97:1: warning: ‘rpdl_paper_size_by_size’ defined but not used [-Wunused-function]
rastertorpdl.c:131:1: warning: ‘rpdl_set_custom_paper_size’ defined but not used [-Wunused-function]
rastertorpdl.c:176:1: warning: ‘rpdl_set_paper_type’ defined but not used [-Wunused-function]
make: *** [rastertorpdl] Error 1

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/dayflower/20100202/1265080144