JAGAT ARTICLE
JAGAT LOGOTopPage
    Article LOGO

    Acrobatと日本語



     Acrobatのアプリケーションには,PDFファイルを見るためのAcrobat Readerと,PDFファイルを作るためのPDF WriterやAcrobat Distillerなどがあるが,4月18日にAcrobat Readerの日本語版の正式バージョンがリリースされた。これから日本でも本格的にPDFファイルの利用が始まると思われるが,特に日本語の扱いについての関心が高い。そこで4月のテキスト&グラフィックス研究会のミーティングでは,アドビシステムズ(株)の中本浩氏に,PDFのフォントの扱いを中心にお話をうかがった。

     中本氏はアドビのアプリケーションの日本語化に携わっておられ,ここ1年ほどは主にAcrobat ReaderとPDFWriterのプロジェクトに参加している。

     お話は,PDFの概要と文字コードの扱い,およびフォント管理の3点である。Acrobatの特徴はドキュメントに使われているフォントを,違うプラットフォームでも正しく表示/印刷できることだが,それを日本語でどのように実現しているのか,またプラットフォーム間での文字コードの違いをどう解決しているのか,および異体字の処理についてなどが主な項目である。フォント管理については,フォントの置換のアルゴリズムと,フォントをドキュメントに埋め込むエンベディングについて説明していただいた。以下はその要約である。


    1. PDFの概要

     PDFはポータブル・ドキュメント・フォーマットの略でアドビの開発したパブリックな規格であり,その内容やフォーマットはすべて公開されており秘密は全くない。アメリカではすでに公文書に採用するところも多く,NASAでもPDF文書の受け渡しが可能だと聞いている。

     英語版がサポートするプラットフォームはMac,Windows16ビット,32ビット,UNIX,OS/2である。また,プロジェクタの中にフォーマットしたAcrobatを入れてしまうAcrobatプレイヤーというシステムもある。日本語版はいろいろな問題があって,Mac(漢字Talk),Windows95/NT,Windows32ビットだけがリリース予定である。その他のプラットフォームについては次期バージョンでの対応を検討中である。


    PDF

     PDFは,一言で言うとPostScriptをフラットにしたフォーマットである。フラットというのはPostScriptのプログラミング言語的な要素を取り払って,個々の基本的なグラフィックスの描画やテキストの出力など,プリミティブなものだけを並べたような構造ということである。テキストファイルなので,圧縮しなければテキストデータとして読むことができる。ただ,フォントを置換するためのヒント情報,あるいはインターネット対応のハイパーリンクなどの機能を持っているので,そのような保持情報は持っているが,基本的にはPostScriptによく似ている。もちろん,繰り返しや条件判断,オペレータ再定義などはすべて取り払ってある。近い将来,PDFを直接解釈して印刷するような機能をプリンタ側に持たせるという予定もある。


    PDFの特徴

     そのままだと非常に大きくなってしまうため,テキストファイルではあるが,幾つかの方法で圧縮を可能にしている。テキスト及びラインアート,円や四角などは可逆圧縮,具体的にはLZWを使って圧縮している。イメージについては,何種類か方法があるが,カラーは不可逆圧縮のJPEGを使っている。PDFを作成するときにイメージの圧縮率の指定が可能で,サイズとクオリティの関係を考えて選択できる。

     もう1つの特徴はページ間に依存性がないことである。つまり,そのページに使われているフォントやさまざまなハイパーリンクのオブジェクトなどがすべてページ内にデータとして記述されているので,あるページを取り出して新しいPDFを作っても,それは完全なPDFになる。差し替え,入れ替え,置換,削除などがページ単位で可能で,間違ったページの差し替えなどが容易にできる。


    PDFの中身

     次はPDFの出力サンプルである。

    	/F0 24 Tf<82A0>Tj
    	・・・・・・
    	6 0 obj <<
    	/Type/Font/Subtype/Type0
    	/Name /F0
    	/BaseFont/HeiseiMin-W3-90ms-RKSJ-V,Bold
    	/DescendantFonts [ 1 0 0 R ]
    	/Encoding/90ms-RKSJ-V
    	>>endobj
    	・・・・・・
    	1 0 0 obj <<
    	/Type/Font/Subtype/CIDFontType0
    	/BaseFont/HeiseiMin-W3,Bold
    	/FontDescriptor 7 0 R
    	/CIDSystemInfo
    	<< /Registry(Adobe) /Ordering(Japan1) /Supplement 2 >>

     PDFWriterから出力したひらがなの「あ」という文字だが,1行目に「F0 24 Tf<82A0>Tj」とある。「Tf」というのはPostScriptの「FindFont」,つまりフォントを使うというオペレータと思っていただいてよい。「Tj」はPostScriptでいうと「show」,すなわちテキストを出力するというオペレータである。PDFWriterではシフトJISをそのまま使っており,「82A0」はシフトJISの「あ」である。  PostScriptでは通常Tfの前にフォント名が直接書いてあるが,Acrobatは直接の指定はできないのでフォントオブジェクトを指定する。3行目以下が具体的なフォントオブジェクトの記述である。この場合はフォントは平成明朝W3で,Windowsで作っているので「90ms-RKSJ-V,Bold」と書いてある。この5行目の「/BaseFont」以下の情報が,フォント置き換えのときに使われるヒントになる情報で,フォントディスクリプタである。注意していただきたいのは8行目のEncodingである。「/Encoding/90ms-RKSJ-V」とあるが,このEncodingキーワードによって,もとのフォントがどういう並びだったかを覚えるようになっている。この場合はもとはWindowsで作ってあるから,Windows上で表示する時は同じフォントを使えばよいが,Macに持っていく場合はMacの文字並びに応じて並べ替える。  最終行に「<<Registry(Adobe)/Ordering(Japan1)/Supplement 2>>」とあるが,これはプラットフォームに依存しないキャラクターセットを規定している。つまり,このドキュメントはアドビのCIDフォントのSupplement 2のレベルまでの文字しか含んでいないという意味である。


    PDFの作成

     PDFを作成する方法は3通りある。

     第1はPostScriptファイルをDistillerによって変換する方法である。Distillerは実際にはPostScriptのインタープリタである。通常だとアプリケーションやドライバから出力されたPostScriptファイルを印刷するわけだが,PostScripファイルをDistillerに入力すると,PostScriptコードを解釈し,印刷の1つ1つのグラフィックスコマンドをPDFに変換してもう1度書き出すのである。PostScriptを直接サポートしているアプリケーションを使った場合,まずファイルに保存してからDistillerを立ち上げ,そのファイルを開いて書き出すという手順になる。ただ,それでは手間がかかるので,AcrobatではDistiller Assistantという仮想プリンタドライバを使って,アプリケーションから自動的にPDFを生成するようになっている。PageMakerや,次のバージョンのIllustratorではプラグインでこのプロセスを自動化している。PageMakerやIllustrator,FrameMakerなどはハイパーリンクなども直接この段階でPDFファイルに書き込んでしまう機能を持っているので,ドキュメントを作るときにリンクを指定してPDFに書き出せば,そのままインターネットにアップロードできる。

     第2の方法は,PDFWriterというWindows/Mac用のプリンタドライバを使う方法である。WindowsはGDI,MacはQuickDrawのコマンドを直接PDFに変換する。PDFWriterを使用すれば,Windows/Macのプリンタに出力できるアプリケーションであればすべてPDFファイルを作成できる。さらにいくつかのアプリケーションはPDFWriterの特別のコマンドをサポートしていて,ハイパーリンクやブックマークを作ることができる。

     Distiller AssistantとPDFWriterは同じような機能を持っているがそれぞれ特徴がある。ドキュメントがEPSを使用している場合は,Distiller Assistantを使わないと,EPSの内容がPDFに変換されない。EPSを使っていない場合はどちらでもかまわない。また,Distiller AssistantはバックグラウンドでDistillerが起動するので,それなりに時間がかかる。すばやく簡単に変換したい場合はPDFWriterを使えばよい。

     第3の方法は,Acrobat SDKを使用する方法である。Acrobat SDKは現在アメリカのアドビから出ている。これはサブスクリプションベースで低価格で提供している。SDKを使うと,Distiller及びPDFWriterのAPIセット,あるいは直接PDFを生成できるライブラリが提供される。日本語対応のライブラリも今年前半にアドビから提供される予定である。詳しくは,ADA(アドビ・ディベロッパーズ・アソシエーション)からCD-ROMが手に入るが,それにはアドビのアメリカのWebページをみれば申し込み方法がわかると思う。


    2. 文字コード

    エンコーディング

     英語版のAcrobatはMacやWindowsの他にUNIXのいろいろなバリエーションなどもあって,エンコーディングがすべて違うが,DistillerやPDFWriterでPDFファイルに変換する時に,PDFDocEncodingというニュートラルなエンコーディングに変換するようになっている。ただ,これは文字が256種類しか持てないという制限があり,それ以外はすべてシンボルフォントであるというやや乱暴な扱いをしている。英語はそれでも実用的だったが,日本語ではそうもいかないので,日本語の拡張をするときにいろいろな工夫をした。

     最初はUnicodeにしようという考えがあったが,Unicodeは異体字の問題などいろいろな理由があってうまくいかない。結局,複数のエンコーディングをサポートすることになった。基本的にはCIDエンコーディングである。CIDは16ビット,65,536種類までグリフを持てるエンコーディングである。CIDに変換可能なエンコーディングであれば,すべてのエンコーディングをサポートする。83pv,90pv,90ms,Ext,Add,EUC,JIS,Unicodeが現在サポートしているエンコーディングだが,それ以外でもコードを変更せずにリソースを追加すれば自動的にサポートされるようになっている。ただし,欧字は日本語版でもPDFDocEncodingを使用している。

     また,一部Unicodeにしているところがある。ハイパーリンクやファイル名,URL,ブックマークなどは印刷されない文字コードなので,ポータビリティや互換性の方を優先したものである。例えば,Acrobatのドキュメントには注釈をつけることができるが,これは印刷されない。このようなテキストは内部的にはすべてUnicodeで扱われている。


    CID

     CIDはキャラクターIDという意味だが,実際には文字ではなくグリフである。グリフコードなので,例えば,縦横の約物,括弧類等は別々のCIDコードを持っている。異体字や,プロポーショナルと固定幅の半角文字も別々のCIDコードを持っている。CIDコードで保存されると,PDFにすることによって情報が失われてしまうことはない。それから,任意のコード体系をリソースの追加,テーブルの追加によって付加することが可能である。原理的にはベンダ独自のコードも定義してサポート可能である。

     CIDはベンダごとにRegistryを持ち,LocaleごとにOrderingを持っている。具体的には,例えばAdobe-Japan-,あるいはAdobe-CNS-とかAdobe-Korean-となっていて,1つのLocaleについては各ベンダーでCIDのOrderingが固定する。日本語のCIDのOrderingに関しては,アドビの中にはAdobe-Japan-しかない。グリフの追加の場合には後ろの方に足すことになる。したがって,CIDで記述されたものはAcrobat Readerがサポートする限り,決して内容が違う文字で表示されることはないと思う。

     「@」という文字の変換を例に説明する。Macで@というデータを含むPDFファイルを作成してWindowsで見ると普通にテキストを持っていくと文字化けしてしまうが,Distillerは次のような変換を行う。

    	90pv-RKSJ-H = <82a0 8540>
    	CID = 843,7555
    	90ms-RKSJ-H = <82a0 8740>
    
     Macのホストエンコーディングは90pvで,その@という文字のコードは8540である。これをCIDに変換すると「7555」となる。これは受信の場合だが,このような形でPDFに格納される。厳密には違う場合もあるが,大体は同じである。Windowsで見るときは,PDF中のデータを表示するときに90ms,つまりWindowsのホストエンコーディングに再変換して表示する。すると8740となって正しく@が表示される。


    異体字

     78字形/83字形は両字形を表示することができる。これは78字形と83字形とではCIDのコードが違うからである。「唖」を例に説明する。これはシフトJISでは88a0というコードで,それぞれ78字形=口+亞(CID=7633),83字形=口+亜(CID=1126)である。78JISを指定して出力するとシフトJISの「88a0」にその文字が入っている。Distillerがこれを7633という78のCIDコードに変換する。ちなみにこの場合の83字形のCIDコードは1126になっている。表示するときにホストのエンコーディングが78であれば,そのまま88a0を使うが,そうでない場合はAcrobat Readerにバンドルされているサブセットフォントの中から7633というコードを引いてきて,元の字形を再現する。

     検索は,両方とも同じ「あ」で検索できる。検索するときは,ホストのエンコーディングとのインターフェースがあるので,CIDコードからホストに一番近いもの,この場合だとWindowsのシフトJISに丸められるため,両方とも同じ「あ」として検索できる。同様に,異体字が将来拡張されても,ホストのコードで同じコードポイントにマッピングされるのであれば検索は可能である。ただし,標準の検索では異体字を入力する方法がないので,両者を区別して検索するには,プラグインを作成して直接PDFの内部構造にアクセスすることになる。ただし,これはアドビからは標準では提供されない。


    3. 置換とエンベディング

    フォント置換

     ドキュメントで指定されたフォントがドキュメントを見る環境にないとき,欧文はMultiple Masterフォントによって合成する。Multiple Masterは幅と太さを無段階にコントロールできるフォントで,Acrobat Readerにバンドルされている。これを使うと比較的近い字形で,さほど品質を損なわないで見ることができる。ただ,Multiple Masterフォントは作るのに大変な手間がかかり,特に文字数が多いと大変で,残念ながら日本語のMultiple Masterフォントはまだない。そのため現在はホストにある最も近いフォントに置換することになる。何が最も近いフォントかという議論はあるが,とりあえず,TrueType協議会の推奨PANOSE属性によって,明朝,丸ゴ,角ゴ,あるいは楷書,隷書,ポップなどを区別している。

     最大で16種類くらいのフォントを区別するが,基本的なアルゴリズムとしては,まず同じ種類の書体を選ぶ。それがない場合はより近いものを選ぶ。例えば楷書がなければ教科書を選び,教科書がなければ明朝を選ぶという具合である。その次に,一番ウエイトが近いものを選ぶ。このとき,Acrobat Readerはそのフォントが実際にどういう太さで表示されるかわからないため,TrueTypeのOS2テーブルに入っているPANOSEの属性値を信じることになる。

     WindowsやOS/2ではPANOSE属性が必須になっているが,Macではオプションなので必ずしもあるとは限らない。Acrobat Readerは現在存在している主なPostScript及びTrueTypeの日本語フォントについて300種類ほどのデータベースを持っている。それらについてはPANOSEのテーブルがなくても自動的に内部のテーブルから引っ張ってきて比較することになっている。ただ,今後出るフォントに関してはわからない。今後新しくフォントを開発される場合は,ぜひこのPANOSEテーブルをフォントの中に持っていただきたい。これがないと明朝だと思い込んでしまって,Acrobatからそれを知る方法はない。TrueType協議会に問い合わせればPANOSEの属性の資料が入手できるはずである。

     置換は,CIDフォントもしくはTrueTypeフォントを使用して文字の置き換えを行う。ただし,アウトラインが見えるものに限る。エンクリプションがかかっているものは使用できない。

     日本語フォントの置き換えはフォントの中の全角部分だけについて行われる。これは,全角で固定幅であれば置き換えても文字が重なったりしないという特徴を利用したものである。半角部分は,スペースから127までは欧文と同じようにMultiple Masterフォントを使う。プラットフォームごとの文字コレクションが違って足りない部分は,Acrobat Readerにバンドルされているサブセットフォントを使用する。サブセットフォントは平成明朝と平成角ゴシックのごく小さいサブセットを使っているので,そのどちらかに丸められてしまうことになる。

     以上は画面表示の話だが,プリンタの場合は画面とは全く関係なく単純な置換を行う。つまり,プリンタはホストほどフォントの種類が多くないので,フォントがなければゴシックか角ゴ,丸ゴ,明朝のどれかに丸めてしまうのである。従って確実に同じフォントで印刷することを望むなら,そのターゲットプリンタのフォントをあらかじめ調べておかねばならない。ただ,これはPostScriptの場合であり,時間がかかってもいいのであれば,GDIやQuickDrawでホストのフォントをビットマップとして使って,もとのドキュメントにより近いイメージを印刷できる可能性がある。

     制限事項として,WindowsのMS Pというプロポーショナル日本語フォントは,日本語のマルチプルマスターフォントがないため置換ができないということがある。Windowsのプロポーショナル日本語フォントを使った場合,全角部分はもとと同じフォントがない限りレイアウトは保証されない。現状では,全角部分固定幅は日本語フォントを使い,半角部分はTimesやHelveticaを使うというような方法でPDFを作成する方がよいだろう。


    フォント・エンベディング

     フォント・エンベディングとは,PDFのドキュメントの中にフォントデータを埋め込んでしまう機能である。Acrobat Readerに最初からデータベースとして入っているTimes,Courier,Helvetica,Symbol,Dingbatsなど13種類の基本フォント以外のType-1及びTrueTypeの欧文フォントであればすべてエンベディング可能である。

     さらに,フルセットでエンベディングするか,サブセットをエンベディングするか選択することができる。使用する文字種が少なければサブセットエンベディングを選べばよい。 Type-3もエンベディング可能である。ロゴなどをType-3フォントで作成してPDFの中に埋め込めば,どこへ持っていっても表示印刷が可能だ。

     残念ながら,日本語フォントは現在のバージョンではエンベディングをサポートしていない。技術的にはできるはずだが,今回はリリース優先で,エンベディングは次期以降のバージョンになる。ただし,その場合もエンベディングを禁止する属性が入っていないフォントのみが対象となる。

     MacではAdobe Type Composerにより外字フォントを作成できるというメカニズムを提供している。これはType-1フォントなので,Distillerでエンベディング可能である。したがって,Adobe Type Composerを使えるMacでは,いわゆるユーザ外字をPDFの中に埋め込むことが可能となる。


    4. 現時点での使用条件

     CIDもしくはTrueTypeのエンクリプションされていないアウトラインフォントが置換用に必要である。具体的には,少なくとも明朝と角ゴが必要だ。ただ,WindowsもMacもOSに明朝と角ゴが必ず1つついてくるからこれ自体はあまり問題にはならないだろう。もちろん,丸ゴも入れた方がきれいに見えるし,余裕があれば,ウエイトが違うものを幾つか用意すればオリジナルのウエイトがほぼ再現されると思う。

     CID以前にATMによって提供されていたOCFというコンポジットフォントがあるが,残念ながらこれは置換用には使用できない。例えば,MacのATMフォントのリュウミンライトを使っているとする。Macなら別のMacにリュウミンライトがあれば利用できるが,Windowsのリュウミンライトを使ったPDFをMacに持っていってもエンコーディングが違うため,Mac上でリュウミンライトを使って表示することはできない。なぜなら,PDFは内部的にCIDを使っており,AcrobatはCIDフォントを直接ラスタライズするわけだが,OCFフォントはCIDコードアクセスを許していないため,Acrobatからそれを呼び出すことができないのである。したがって,CIDもしくはTrueTypeフォントの違う種類のものを2つ以上用意していただきたいということである。

     また,Acrobat Readerは既に知られているエンコーディングしか対応できない。具体的には,シフトJISではExt,Add,83pv,90pv,90ms,EUCである。これらのエンコーディングはコードの変更なしに対応可能だが,それ以外の場合はリソースにCIDからシフトJIS,シフトJISからCIDに双方向変換するテーブルを足す必要がある。これは個別対応だが,CIDのドキュメントがあれば簡単にできると思う。

     それから,フォントのPANOSEの値を知っている必要がある。現在Acrobatのデータベースに入っているフォント及びフォント自身にPANOSEの値を持っているフォントは置換用に使用可能だが,持っていないものは使うのが難しい。PDFを書き出すときにもPDFWriterやDistillerはフォントからPANOSEの値を取り出してPDFに埋め込むが,PANOSEの値がないとそれができないので,どんなフォントに置換されるかわからなくなってしまう。

     データベースについては,不具合があれば随時更新をするが,とても全部のフォントはカバーできない。フォントベンダの方は,できればフォントをリリースする際にテーブルにPANOSEの値を書いていただきたい。


     以上が中本氏のお話である。お話からもわかるように,今度のAcrobat日本語版によっていきなり自由自在に日本語のフォントを使ってPDFファイルを作り,配布できるようになるというわけではない。そもそも日本語フォントの扱いはアドビだけでどうこうできるものではないのである。今は発売直前で関心も高まっているが,むしろ発売後の動きの方が重要だと思われる。フォントベンダーやソフトウェア会社などの動向にも注意していきたい。


    (テキスト&グラフィックス研究会)


Copyright 1997 JAGAT All rights reserved.

JAGAT LOGO