●MacOS X 10.3.2におけるPSプリンタドライバの不具合と回避法


  2003年12月25日

概要

MacOS X 10.3.2環境にてPostScriptプリンタおよび、Ghostscript等を使ってPSプリンタをエミュレートしているプリンタに印刷した場合に、「文字抜け」が生じることがある。また、この問題が生じるファイルを、プリント・メニューの「PDFとして保存…」によってPDFに変換したものを、Acorbat/Adobe Readerで印刷した場合には、「文字抜け」が生じない。なお、同じくPostScriptエミュレーションとされている(Apple曰く"Virtual PostScript")ものであっても、OSX 10.3.xで標準装備されているGimpPrintでドライヴしているプリンタでは、この問題が生じない。

原因の推定

"cgpdftops"への絞り込み

MacOS X 10.2.x/10.3.xでの印刷においては、その過程をCUPSが管理しており、通常のCocoa/Carbonアプリケーションから印刷する場合、以下のようなデータ変換過程をたどる。 一方Acrobat/Adobe ReaderからPostScriptプリンタないしfoomatic/GhostscriptによるPSエミュレート・プリンタに印刷する場合、Acrobat/Adobe Readerが独自にPSデータへの変換を行い、これをさらにフィルタ"pictwpstops"が整形してプリンタに直接ないしfoomatic-ripに渡している。また、印刷時の「出力オプション」で生成されるPSファイルは、Quartz APIが生成したPDFデータをフィルタ"cgpdftops"がPSデータに変換したものを、ファイルとして保存しているものである。そして印刷時に「文字抜け」の生じるファイルをこの方法でPSファイルとして保存したものには、やはり「文字抜け」が生じてしまう。以上より、「文字抜け」問題の原因は、フィルタ"cgpdftops"にあると思われる。

"cgpdftops"の背後にあるもの

ところが、10.3.2アップデートでは、"cgpdftops"(なお、上記の各種フィルタは「純正ドライバ」のもの以外は、"/usr/libexec/cups/filter"にインストールされている。)そのものは置き換えられていない。そこで"cgpdftops"の動作が依存するもののうち、10.3.2アップデートで置き換えられたものが問題となってくる。そのうち、ここで問題となるのはCUPSのライブラリである"libcups.2.dylib"と、"ApplicationServices.framework"だが、より怪しいのは後者である。CUPS本来のPS→PDF変換フィルタである"pdftops"は、Xpdfに含まれている同名コマンドに、CUPSの管理のもとでPPD情報等を参照できるように手を入れたものである。これに対し"cgpdftops"は、ソース非開示のAppleによる固有の実装であり、それ故具体的詳細は不明だが、CUPSオリジナルの"pdftops"に比べるとファイルサイズがかなり小さい。これは"pdftops"が内部にもっているPDF→PS変換に関係する機能の多くを、外部、すなわち"ApplicationServices.framework"(さらにおそらく、そのサブ・コンポーネントである"CoreGraphics.framework"あたり。ちなみに"cgpdftops"の"cg"は"CoreGraphics"の略であろう。)に依存しているからであろう。よって10.3.2アップデートによってゴッソリと更新された、当該frameworkのどこかに、直接の原因があるものと推定できる。

暫定的対処法

代替フィルタ・インストールパッケージの仕様

以上のように、"CoreGraphics.framework"回りの問題であろうことまでは追究できたので、おそらくはその関連のファイルをOSX 10.3.1以前のものに戻すことで問題の解消は可能だろう。しかし、この種のframeworkはシステムの根幹に関わるものであるため、迂闊にいじるのは危険であることと、仮にそれで問題が解消可能であったとしても、すでに10.3.2にアップデートしてしまった環境に、場合によっては別に新たに10.3.1の環境を構築して、そこからファイルをコピーする手間を考えると、この方法は現実的ではないだろう。そこでここでは、殆どシステムに手を加えることなく安全・簡便に可能な別のアプローチをとってみたい。それは基本的には、"cgpdftops"ではなく、CUPSオリジナルの"pdftops"をフィルタとして呼び出させる、という方法である。CUPSでは、送られてくるファイル形式に応じてどのフィルタを使うかという定義を、"/etc/cups"ディレクトリ内の拡張子が".convs"であるファイルに記述する。その記述様式はたとえば次のようなものであり、CUPSの起動時に読み込まれる。
application/pdf application/postscript 25 cgpdftops
これはcontent-typeが"application/pdf"のデータを"application/postscript"に変換するためにはフィルタ"cgpdftops"を用いる、ということを意味している。そしてひとつのデータ・タイプに対し複数の".convs"ファイルによる定義が与えられている場合は、"25"にあたる数字が、より小さいものが優先される。さらに、最少の数字を与えられているフィルタが実際には存在しない場合には、次に小さい数字のフィルタが用いられるようになっている。たとえば、CUPSオリジナルのファイルは"mime.convs"というものであり、そこではapplication/pdfのフィルタとして"pdftops"が33に割り当てられている(ちなみに、OSXではCUPSオリジナルのpdftopsは存在しない)が、OSX独自のファイルである"apple.convs"にある上記の例の定義のほうが優先されて動作するのである。そこでこの動作仕様を利用して、次のような内容のパッケージを構築してみた。

問題点

これによって、一応日本語文書の「文字抜け」問題は解消できるようである。ただし多言語混在文書を処理する場合には、一応Xpdf/pdftops用に用意されている各言語用リソースは組み込んであるものの、使われているフォント等によってはうまく処理できず、プリンタがハング・アップしてしまうこともある。この点は、フォント処理も含めてOSX側に任せてしまっている"cgpdftops"に遠く及ばない。このように、所詮は「暫定的な代替手段」であることに十分注意し、自分が扱うファイルに頻繁に「文字抜け」がおこるような場合のみ、あくまで“自己責任”で用いられたい。より安全な回避法は、少し面倒ではあるがプリント・オプションでPDFとして保存したうえで、Acrobat/Adobe Readerから印刷することであろう。


Package Download(500KB)

〔2004年3月16日追記〕

以上の問題点は、Mac OS X 10.3.3アップデートにて修正・解消されている。



Back to Index