読者です 読者をやめる 読者になる 読者になる

おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

Common Printing Dialog をビルドしてみた。

OpenPrinting のビッグプロジェクト、Common Printing Dialog

こないだのライトニングトーク d:id:naruoga:20081120 でも喋ったように、*nix 系のデスクトップ OS としての印刷システムの「二大ダサポイント」は:

  • 共通 UI がない
    • だからマルチリンガルとか対応状況アプリでバラバラ
    • User Experience もイマイチ
    • プリンタベンダが提供している機能をアプリが必ず見せてくれると限らない
  • グラフィックエンジンがない
    • みんな好き勝手に PS 作って吐くとかありえなくね?
    • しかも PS だし。ページ概念希薄だし。N-up とか印刷枚数課金とか大変だし
    • さらに非 PS プリンタはバックエンドが GS。巨大でバグが多くて CJK なんか三の次のクソソフト

なのだけど、最初の問題への解、それが Common Printing Dialog (CPD) なのだ。

ということで万が一 LT で興味を示す人がいればと思って今あるサンプル版 (ちゃんと API 実装した奴もあるっぽいのだが、その API を叩くソフトを自力で書くのが面倒くさいものぐさ君 (俺だ) のために、単独で動くアプリを用意しているのだ) を手元の Ubuntu 8.10 でビルドしてみた (実際は PoGo のデモでそれどころではなかったのだけど)。

こんなエントリに興味を持つ人がいるかどうかも疑問だけど、まあ記録に残しておく。しかしもはや記憶が曖昧。取ったパッケージとか違ってるかもだけどゴメン。


参考ページは OpenPrinting/CommonPrintingDialog/TestDialogFromBZR

まずは bzr をインストール

sudo apt-get install bzr

でうまく行ったんだっけ?

ところで Bazzar って結構有名なの? OpenPrinting 以外で使ってるの見るの初めてなんだけど。こないだの LL 温泉でもその手の話題が出たので聞いてみたら誰も知らなかったし。……と思って Wikipedia を見たら
……ああそうか、Ubuntu つながりなのかな? Kernel 界隈は Git みたいだし。

ま、どうでもいいですね。

bzr からレポジトリを取ってくる

これはページにあるように

bzr branch http://bzr.openprinting.org/devel/common-printing-dialog

でOK。common-printing-dialog ってディレクトリが掘られてファイルがごそっと落ちてきます。

KDE

CPD の重要な意義の一つは KDE/GnomeAPI レベルと機能の統一ってことがあるので、サンプルには両方入ってきます。まずは KDE 版から見ていきましょう。
というか GNOME 版は GSoC の期間内に学生さん (Lars 君) が終わらなくて機能が低いみたいなので (^^;)

必要なパッケージを取ってくる

環境によって違うだろうけど、オイラは kde-devel と g++ と libpoppler-dev (いらなかったかも) と libpoppler-qt4-dev を取ってきた気がする。抜けてたらごめん。
まあ基本的には aptitude で必要なのを探してポンポン入れるってことで。

ビルドする

基本的には書いてあるとおり。cmake のところは Ubuntu ではこうせいと書いてあったのでそのまんまパクってみたよ。

rm -rf build
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/lib/kde4 ..
make

インストールするわけじゃないのでこれで終了。

実行してみる

KDE 版は表示要求を処理するデーモンもどき (今はタダの常駐プロセス) と、表示要求するプログラムの二本立てになってる。実際のモジュール構成もそうなるだろうから、まあ妥当でしょう。

kde4-dialog/kde4-cpd &

でデーモンもどきを起こして、

kde4-dialog/view-dialog --previewfile  &

で、適当な PDF をプレビューイメージとして表示させる。

CPD は我々の用語で言うところのリアルプレビュー指向で、N-up (集約) とか Staple (ホチキス綴じ) とか指示すると、アプリの書いた絵でそれがどう表現されるのかって見せてくれる機能を持ってる。
残念ながらそれは動かないんだけど (^^;) まあ雰囲気は出てるかな。

まあ御託はともかく立ち上げてみましょう。

印刷ダイアログとは思えないさっぱりした画面ですが、右側にある「Quick Preset」ってのが、ただ選択するだけで設定を変更できるってものです。普通のユーザなんてのはせいぜいこれを選ぶぐらいやろと (笑)。
でも待てよ、印刷部数ぐらいは普通のユーザでも選ぶんじゃねーかな。ホントにユーザビリティテストやったんかいな。
これは自分で作ることも可能。

真ん中にででーんといるのがリアルプレビュー君です。印刷するドキュメントをそのまんま表示。本来なら ImagiableArea とか見て印字不能領域は白くするとか処理が入るはずなんですがまあ今のところはご愛嬌。

上の ”Aficio xxxx” とか書いてあるのがプリンタ選択。複数ある場合はプルダウンで選択できます。
その下の「Control Printing aspects」ってのはなにかというと……ぽち。

画面の様相が変わりましたね。
これで PPD (CUPS が読み込むプリンタの設定ファイル) に記述されているような細かな設定ができるようになると。トレイ選択とか両面とかね。

CPD 的に重要な概念にタグってのがあってこの画面にその萌芽があるんですが、このエントリは CPD の機能を紹介しよう、ではないのでそこらへんはいっちゃん上のリンクから手繰れる Spec 見るか、「紹介しろー」とどっか (ここのコメントでもわさーでも twitter でもいいです) で騒いでください。

とりあえず技術屋の目から見た今の実装レベルをさらっと述べると (一般向じゃない用語頻出でごめんなさい)、

  • 枠組みはま、おっけーじゃね?
  • プリセット名に日本語が通る。ちょっとびっくり。
  • でも日本語の PPD は読めない。バケバケ。これって Spec どうだったかなあ。確認しよ。

Fallback: Conventional one-language PPDs should be shown in their language by the printing dialog. The dialog can provide translations for common strings in PPDs (like "PageSize", "Resolution", ...) and this way show options or choices translated in the case of English-only PPDs or PPDs with missing translations.

  • Multilingual PPD なら読めるかは未確認。あとで試そう。【宿題】
  • ウリのリアルプレビューは設定変えても微動だにしません (^^;) まあ実装途中なのでご愛嬌。
  • PPD の Foomatic Extension は見てくれてない。ぶーぶー。CUPS Extension はどうか確認しよう。【宿題】

てなとこか。
頑張れ。……って誰が? ここまで作った奴は GSoC 終わって大学戻っちゃったからなぁ。


あ、そうそう。view-dialog はウィンドウ畳めばプロセスいなくなるけど、kde4-cpd はプロセス終了の手段がないので pkill で殺してね (笑)。

GNOME

あぶない、KDE だけで話が終わるところだった。
GNOME 版も完成度は劣るけどいちおうあります。

必要なパッケージを取ってくる

Ubuntu の場合、KDE で必要なパッケージを揃えたらあとはなんかいったっけ?
libcups2-dev と libpoppler-glib-dev ぐらいだった気がする。

ビルドする

パッケージさえ揃ってればドキュメントどおり。
まずはリファレンス PDF ファイルを手で書き換えてやりましょう (引数から読む機能ぐらい実装しろよお前……)。

static void setup_preview_widget(GtkDrawingArea *previewwidget)
{
    GError *error = NULL;
    PopplerDocument *doc;

    doc = poppler_document_new_from_file("file:///home/lars/Documents/doc/DSC_Spec.pdf",  /* ←ここを書き換える */
                                         NULL,
                                         &error);
...

そいで Make。

cd gtk-dialog
make

ていうか今時 Makefile 手書き? もしかして。

実行してみる

フツーに

./cpd-glib

とすればこんな感じの画面が起動します。

KDE 版に比べるとページめくりの機能とかまだ入ってません。
あとたぶんプリンタのリスト処理がバグってます (苦笑)。オイラの環境だと二個プリンタがいるのに選択肢に出てくるのは一個だけです。

Control Printing aspect を開くとこんな感じ。

ちょっとかっこいいかな。

でも待てよ、PPD って基本的には選択肢は選択肢、としか書きようがないので、それをウィジェットとしてラジオボタンにするのかプルダウンメニューにするのかは決めようがないはず (OpenPrinting では PPD に対する CPD 拡張を提案していて、それではウィジェットを指定できるんだけど、今は既存の PPD を食わせているんで)。
もしかしてハードコードしてる? それはイケてないなぁ。

まあ KDE 版に比べても完成度低めなんで、頑張れ!(…って誰が?) ってことで。

まとめ?

こんなわけで、Linux でプログラムなんざまともにビルドしたこたねーぜなオイラでもいじれるので、もし Desktop Linux の未来に興味がある人は触ってみてくださいましな。

GNOME 版とか作りが学生の夏休みの宿題みたい (いや、ホントに学生の夏休みの宿題なんだけど。GSoC だから) なので、作りが素朴で逆に CUPS API の勉強にはいいかもしれない、と思った。