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

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

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

CUPSベースで使用される中間データ形式

昨日に引き続き、脳内のバッファにあって下調べとかいらないもの。自分の勉強のためにブログ書いてるはずなのに、目的と手段が逆転してる……まあいいや。

私の印刷関係のブログってもっと印刷に関心がない人にリーチしたい*1 っていってるわりには、専門用語使いまくりで印刷に元から関心がない人おいてけぼりだよねーというのは気になっていました。

まあ、そういう人は:

Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]

Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]

の第二特集をご覧いただくのがよいと思いますが(宣伝)、よりシンプルにまとめたものを:

Ubuntu Magazine Japan vol.07 (アスキームック)

Ubuntu Magazine Japan vol.07 (アスキームック)

にも書かせていただいたので(また宣伝)、超太っ腹なうぶまがさんに感謝しつつ、Vol.7 の過去記事ダウンロードページに行って PDF をゲットして最初の見開きを見ると、CUPS ベース印刷の基礎の基礎が解ると思います。


それにしても雑誌とて与えられたスペースは有限ですべてのことを書ききることはできません。ということで前回は人名にターゲットを絞ったわけですが、今回は印刷中間データに的をしぼったとこういうわけ。

印刷中間データとは

ホントはここで絵を描いたりすると分かりやすいのかもしれませんけど、めんどくさいので文章でダラダラ書きます*2。CUPS の場合プリンターに対応する「キュー」がデータの入り口になってて、アプリケーションから来たデータを受け取ってディスクに溜めておきます。んでバックエンドの準備ができたら、印刷データの mime type に併せて適当なフィルター (例えば imagetopdf とか texttopdf とか) を通して、中間データ形式に変換するんですな。

あーフィルターって言葉説明なく使っちゃいましたが、この場合 unix のフィルターを思い浮かべてもらえばいいです。ストリームデータを食ってストリームデータに吐き出す。ただ CUPS の場合はここを unix パイプを繋ぐんじゃなくてファイル経由にしてるんだよな。なんでだろ。

まあいいや、とにかく「後段の処理が全部同じになるように」データ形式を揃えたいわけです。それが中間データ形式というわけ。だから逆に言うと、アプリケーションが中間データ形式と同じ形式でジョブ作ってくれれば、フィルター一段通らなくてお得ですねという。だから LibreOffice とか Chrome とかは PS や PDF といった形式でデータを生成するようになってます。それを確かめる方法は SD10月号読めw まあいずれ機会があれば。

なお中間データ形式はその後、ページ面付けやらなんやらの処理をしたあと、実際のイメージデータに変換されるわけですから、十分な表現能力を持つデータ形式でなければなりません。ということで CUPS ベースの印刷システムの場合 Postscript が長いことその役を担って来ましたが、今は PDF にその座を譲ろうとしています。

Postscript

Postscript については説明必要? えーと、Adobe という会社ができたきっかけになった言語です。略して PS。

民生用で最初に成功したページ記述言語。ピクセル依存性がない実座標系によるイメージングモデル、ベジェ曲線とパスというシンプルな描画形式、フォントグリフすらパスに変更して扱える柔軟性、Coodinate Trasfer Matrix (CTM) というアフィン変換を自在に行える表現力というものをパーソナルな世界 (つうても初代 LaserWriter は 100 万ぐらいしましたけど) に持ち込んだ実績は偉大であります。またれっきとしたプログラミング言語だったりするところもおちゃめです。

Adobe さんとしては言語はバンバン使ってもらったほうがトクで、その言語を解析してイメージに落とす「インタプリター」とか「RIP」と言われる部分で商売したほうがいいので、言語仕様は Adobe のページで公開されてますし解説書もちゃんと日本語に翻訳されています。

1980年代から90年代なんてころはレーザープリンターのエンジンも高かったし、UNIX が動くワークステーションも結構したわけだから、Adobe さんのライセンス料乗っけてもたかが知れてます。ので、UNIX の印刷システムは、なんかの方法で PS 作って PS を流すって風になってました。CUPS が中間データ形式として PS を選んだのも当然ですな。

一方で PS にはいくつかの欠点というか印刷の中間データ形式としては扱いにくいところがあって、これは逆に PDF と比較したほうがいいので PDF の方で述べます。

PS について詳しく知りたいけど Adobe のリファレンスに当たるのは骨だなあという人は、ちと古いけど:

あたりを読むのがいいかと。

PDF

Portable Document Format という正式名称のほうを知ってる人のほうがレアか。PS と同じく Adobe が作ったドキュメント形式です。

PS は印刷用の言語でしたけど、PDF は文書フォーマットの言語としていろいろ工夫が入ってます。

  • 明確なページ概念がある。ページインデックスを持っていて、ページ順入れ替えや削除が簡単。PS は自由度が高すぎてページを認識するのがちょい大変
  • PS はプログラミング言語だけど PDF は構造化データ。制御構造とかは持ってない
  • フォーム入力や注釈などの機能を持つ

まあ中間データ形式として一番嬉しいことは、ページ概念がはっきりしてることと、PS に比べると構造がシンプルで処理系が書きやすいことですわね。PS のフリーのインタプリターが Ghostscript ほぼ一択なのに対して PDF はちょこちょこ存在するということからもそれは伺えます。
ページ概念がはっきりしてるということは、ページ順入れ替え、例えば逆順印刷とかがやりやすいということですし、あと、印刷ベンダーがよくやりたがるページ数課金 (大学なんかで、年間の印刷枚数を制限するとかそういう奴) とかのソリューションにも有利です。

でも PDF を中間データにしてから評判悪いで?

そうなんですよねー。

CUPS のフィルターの方は、Ubuntu/Debian から PDF を中間形式として CUPS のフィルターパイプライン群を置き換えました。そして CUPS 1.6 からは upstream から Linux 用のパイプラインが提供されなくなったので、このフィルターパイプライン群が OpenPrinting の管理下におかれ、各ディストリビューションはこれを用いるようになりました。

一方でアプリケーション側にも「PDF にしてくれ」という要望が出ていて、確か今は LibreOffice のデフォルトは PDF 印刷だったはずです。

というタイミングで:

「いままで印刷できてた文書が印刷できなくなった」
「印刷はできるけど死ぬほど時間がかかる」
「普通に PS データを PS プリンターに打ってるだけなのに、メモリエラーとかで印刷できない」

とかいろいろクレームが出ています。

なぜ? という話を書こうと思ったんだけど、今日は時間切れ (風邪引いて会社休んじゃったので、夜ふかしできないの)。
明日続き書きますねー。

よろしくっ。

*1:立直したい、って変換するなよ>Mozc。

*2:こういうときにこんな説明図が欲しいす! というと描いてくれる雑誌媒体さんはありがたいですな。