パーソナルビジネスソフトとお役立ち情報のサイト
PDFlibテクニカルトピック

1. フォントの取り扱い

1) はじめに

第1回目はフォントについて解説します。
PDFlibを使用してPDFを生成する際、勤怠管理システムから出勤簿を出力したり、 販売管理システムから注文書を出力する等といった、システムから帳票を出力するケース が多いと思います。
帳票類を出力する際、フォントに気をつけると、帳票類の見栄えは大変良くなります。
今回はPDFlibでフォントの指定方法やフォントを使用する際の注意点等に焦点を当てて解説します。

2) フォント指定方法

PDFlibでフォントを指定して文書を作成する際には、大きく分けて2種類の方法があります。
それぞれ、下記のような特徴があります。

1.コアフォントを使用する方法

PDF ビューアに予めフォント情報があるフォントを使用します。 フォントを埋め込み処理したい場合を除き、フォントファイルを必要としません。 表示時にPDF ビューアの情報に基づいて表示されます。 フォントの表示され方はローカルの環境に依存します。

2.外部のフォントファイルを埋め込む方法

市販のTrueTypeフォント等を生成するPDFファイルに埋め込みます。 使用するフォントを埋め込むので、表示がローカルの環境に左右されません。 日本語フォントを埋め込む場合、生成されるPDFファイルのサイズが大きくなる 傾向があります。

以下にそれぞれの方法について解説します。

3) コアフォントを使用する方法

PDFビューアは、いくつかのフォントの情報を持っています。この保持しているフォントを コアフォントといいます。このコアフォントを使用してフォントを指定すると、ビューア側に 予めフォントの完全なメトリック情報を保持している為、埋め込み処理などを行わない限り フォントファイルを必要としません。
PDFファイルをビューアで表示する際に、ビューアが保持している情報に基づき、自動的に ローカルのフォントファイルと置き換えて表示します。
具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $font = $p->load_font("Helvetica-Bold", "winansi", "");  ... @
  $p->setfont($font, 24.0);                                ... A
     .
     .
     .
  $p = 0;
PHP5.1.2/PDFlib 7.0.0


基本的な処理は下記の流れで行います。
@ load_font() で、コアフォントを指定し、ロードします。

load_font()で指定可能なコアフォントは下記の14種類です。

  1. Courier
  2. Courier-Bold
  3. Courier-Oblique
  4. Courier-BoldOblique
  5. Helvetica
  6. Helvetica-Bold
  7. Helvetica-Oblique
  8. Helvetica-BoldOblique
  9. Times-Roman
  10. Times-Bold
  11. Times-Italic
  12. Times-BoldItalic
  13. Symbol
  14. ZapfDingbats

A setfont()でカレントフォントとサイズを指定します。
コアフォントを使用する場合、基本的にはPDFビューアが保持している情報により 表示されます。その為、PDFを表示するローカルの環境によって見え方が変わります。 生成されたPDFファイルを確実に表示させたい場合、次に説明する外部のフォント ファイルを埋め込む方法を推奨します。

<<日本語を使用する際の注意点>>
日本語を使用する場合、使用可能なフォントとエンコードは下記の通りです。 正しいフォントとエンコードの組み合わせでないと、出力されません。
フォント名エンコード
HeiseiKakuGo-W5
HeiseiMin-W3
KozMinPro-Regular-Acro
KozGoPro-Medium-Acro
KozGoPro-Medium
KozMinProVI-Regular
83pv-RKSJ-H, 90ms-RKSJ-H, 90ms-RKSJ-V, 90msp-RKSJ-H, 90msp-RKSJ-V, 90pv-RKSJ-H, Add-RKSJ-H, Add-RKSJ-V, EUC-H, EUC-V, Ext-RKSJ-H, Ext-RKSJ-V, H, V, UniJIS-UCS2-H, UniJIS-UCS2-V, UniJIS-UCS2-HW-H, UniJIS-UCS2-HW-V, UniJIS-UTF16-H, UniJIS-UTF16-V
尚、フォントによっては生成するPDFのバージョンによっては使用できません。 詳しくはマニュアルをご参照下さい。
又、PDFlib 7.0.0から日本語フォントを使用する際に必要なCMapが別ファイルと なりました。フォントをロードする前に、CMapの場所を指定する必要があります。
具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $p->set_parameter("SearchPath", "/etc/fonts/cmaps/");    ... @
  $font = $p->load_font("Helvetica-Bold", "winansi", "");  ... A
  $p->setfont($font, 24.0);                                ... B
     .
     .
     .
  $p = 0;
PHP5.1.2/PDFlib 7.0.0


基本的な処理は下記の流れで行います。
@ set_paramater()のSearchPath でCMapファイルを検索するパスを指定します。

CMapファイルのあるディレクトリを絶対パスで指定して下さい。

A load_font() で、コアフォントを指定し、ロードします。
B setfont()でカレントフォントとサイズを指定します。
CMapファイルは、当社ダウンロードページよりダウンロード出来ます。

PDFlibのダウンロードページ
(http://www.infotek.co.jp/download/pdflib_download.html)


4) 外部のフォントファイルを埋め込む方法

PDFファイルに外部フォントファイルを埋め込むと、ローカルの環境に依存せず、 フォントを表示することが出来ます。生成したPDFファイルを不特定多数に公開 する場合や、複数の環境で表示する必要がある場合に効果的です。
具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
  $p->set_parameter("SearchPath", "/etc/fonts/");           ... @
  $p->set_parameter("FontOutLine", "HGRHM3=HGRHM3.TTF");    ... A
  $font = $p->load_font("HGRHM3", "unicode", "embedding");  ... B
  $p->setfont($font, 24.0);                                 ... C
     .
     .
     .
  $p = 0;
PHP5.1.2/PDFlib 7.0.0


基本的に下記の流れで行います。
@ set_paramater()のSearchPath でフォントファイルを検索するパスを指定します。

フォントファイルのあるディレクトリを絶対パスで指定して下さい。

A set_paramater()のFontOutLine でフォント名を別名で命名する。

フォントを読み込む際には、フォントの名前を指定する必要があります。 この際、正確なフォントの内部名称が必要になるのですが、実際はフォントの正確な 内部名を知るのは難しいです。この為、PDFlib では、PostScript・TrueType ・OpenType フォントのフォント名の別名命名に対応しています。フォント名の別名命名を用いると、 フォントに任意の名前を別名としてつけることができます。

B load_font() で、フォントを検索し、それを後で利用できるようにロードします。

Aで指定した別名を使用して、フォントをロードし、埋め込み処理を行います。

C setfont() でカレントフォントとサイズを指定します。

フォントがPDFファイルに埋め込まれたかどうかは、下記方法で確認する事が出来ます。 (Adobe Readerの場合のみ)

  1. Adobe Reader でPDFファイルを開く。
  2. ファイルメニューで「文書のプロパティ」をクリックし、文書のプロパティを表示する。
  3. フォントタブを開き、該当するフォントの項目を見る。
  4. 埋め込みの表記があればフォントの埋め込み処理はされています。

<<日本語を使用する際の注意点>>
TrueTypeフォントを埋め込む際には、出力文字列をUnicodeにする必要があります。
例えばPHPの場合、出力文字列を下記の様に変換します。


    $data = "こんにちは。";
    $str = mb_convert_encoding($data, 
             "UCS-2LE", "EUC-JP,ASCII,JIS,UTF-8,SJIS");
PHP5.1.2


言語毎の変換方法は、各言語のマニュアルをご参照下さい。
又、日本語フォントは欧米のフォントと比較すると、文字種が大きく、フォントのサイズも大きい為、 全て埋め込むと、生成されるPDFファイルのサイズが大きくなります。特別な理由が無い限りは 後述のサブセッティングの処理を行い、フォントの中でも必要な文字種のみを埋め込む様にして 下さい。(PDFlibではデフォルトではサブセッティングを自動で行います)

5) サブセッティング

フォント(特に日本語フォント)を埋め込むと、生成されるファイルサイズが大きくなります。 これは埋め込むフォントの全ての内容をPDFファイルの中に保持するためです。 埋め込むフォントのうち、実際にその文書の中で使われている文字だけを埋め込めば 埋め込み処理を行う文字種が減り、生成されるPDFファイルのサイズが小さくなる可能性があります。 (文書内で一定以上の文字種が使用されている場合、小さくなりません) この処理をサブセッティングと言います。 PDFlibのデフォルトでは自動的にサブセッティングする設定になっていますが、明示的に行う事も 出来ます。
具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
  $p->set_parameter("SearchPath", "/etc/fonts/");
  $p->set_parameter("FontOutLine", "HGRHM3=HGRHM3.TTF");
  $p->set_value("subsetlimit", 75);                        ... @
  $font = $p->load_font("HGRHM3", "unicode",  "embedding",
                        "subsetting");                     ... A
  $p->setfont($font, 24.0);
     .
     .
     .
  $p = 0;
PHP5.1.2/PDFlib 7.0.0


基本的な処理は下記の流れで行います。
@ set_value() のsubsetlimit で、サブセッティングの閾値を指定します。

サブセッティング処理を行う際の閾値を%で指定します。文書中で使用されている文字種が、 埋め込むフォント全体からみてこの閾値を超えたときには、フォント全体が埋め込まれます。

A load_font() でフォントを埋め込む際、サブセッティングの設定をします。

デフォルトはサブセッテイングが有効になっているので、通常はsubsettingを指定する必要はありません。

PDFlib は次の種類のフォントのサブセッティングに対応しています。
  1. TrueType フォント
  2. PostScript かTrueType のアウトラインを持つOpenType フォント
サブセッティングを要求されているフォントが文書内で使われている場合、PDFlib は実際 にテキスト出力に使われている文字を調べます。文字の数がフォント全体からみて、閾値を 超えている場合、サブセッティング処理は行われず、指定されたフォントを全て埋め込みます。

6) おわりに

フォントの埋め込みは、PDF文書を生成する際に、よく使われる方法です。 ですが、フォントの埋め込み処理には、法律上の問題がつきまといます。
提供している会社によっては、埋め込み等の使用を許可している会社もあります。
埋め込み処理を行う前に、フォントの提供元に必ず確認をとるようにしてください。

文書内で使用されているフォントが統一されていると、文書全体に統一感 がでます。また、マルチプラットフォームを意識したりすると、表示上の 問題から、フォントの埋め込み処理は欠かせない方法です。是非マスター してください。

疑問点やリクエストなどがあれば、下記のお問合せアイコンより、メールにて お問合せ下さい。


(Nov 13, 2006)