PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

フォントの取り扱い

1) はじめに

PDFlib を使用して PDF を生成する際、勤怠管理システムから出勤簿を出力したり、販売管理システムから注文書を出力する等といった、システムから帳票を出力するケースが多いと思います。

帳票類を出力する際、フォントに気をつけると、帳票類の見栄えは大変良くなります。

今回は PDFlib でフォントの指定方法やフォントを使用する際の注意点等に焦点を当てて解説します。

2) フォント指定方法

PDFlib でフォントを指定して文書を作成する際には、大きく分けて2種類の方法があります。

それぞれ、下記のような特徴があります。

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

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

※ PDFlib 9 以降、標準 CJK フォントについては非推奨になりました。

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

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

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

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

PDF ビューアは、いくつかのフォントの情報を持っています。この保持しているフォントをコアフォントといいます。このコアフォントを使用してフォントを指定すると、ビューア側に予めフォントの完全なメトリック情報を保持している為、埋め込み処理などを行わない限りフォントファイルを必要としません。

PDF ファイルをビューアで表示する際に、ビューアが保持している情報に基づき、自動的にローカルのフォントファイルと置き換えて表示します。

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $font = $p->load_font("Helvetica-Bold", "winansi", "");  // ... ①
  $p->setfont($font, 24.0);                                // ... ②
     .
     .
     .
  $p = 0;
PHP 8 / PDFlib 10

基本的な処理は下記の流れで行います。

① 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
② 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 から日本語フォントを使用する際に必要な CMap が別ファイルとなりました。フォントをロードする前に、CMap の場所を指定する必要があります。

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
     .
  $p->set_option("searchpath=/etc/fonts/cmaps/");    // ... ①
  $font = $p->load_font("Helvetica-Bold", "winansi", "");  // ... ②
  $p->setfont($font, 24.0);                                // ... ③
     .
     .
     .
  $p = 0;
PHP 8 / PDFlib 10

基本的な処理は下記の流れで行います。

① set_option() の searchpath で CMap ファイルを検索するパスを指定します。
PHP の場合、CMap ファイルのあるディレクトリを絶対パスで指定します。
② load_font() で、コアフォントを指定し、ロードします。
③ setfont() でカレントフォントとサイズを指定します。

CMap ファイルは、当社ダウンロードページよりダウンロード出来ます。

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

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

具体的なソースは下記の様になります。


  $p = new PDFlib();
     .
     .
  $p->set_option("searchpath=/etc/fonts/");                 // ... ①
  $p->set_option("FontOutline={HGRHM3=HGRHM3.TTF}");        // ... ②
  $font = $p->load_font("HGRHM3", "unicode", "embedding");  // ... ③
  $p->setfont($font, 24.0);                                 // ... ④
     .
     .
     .
  $p = 0;
PHP 8 / PDFlib 10

基本的に下記の流れで行います。

① set_option() の searchpath でフォントファイルを検索するパスを指定します。

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

② set_option() の FontOutline でフォント名を別名で命名する。

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

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

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

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

フォントが PDF ファイルに埋め込まれたかどうかは、Adobe Acrobat や Adobe Reader で確認する事が出来ます。

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

TrueType フォントを埋め込む際には、出力文字列を Unicode にする必要があります。

例えば PHP の場合、出力文字列を下記の様に変換します。


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

言語毎の変換方法は、各言語のマニュアルをご覧下さい。

又、日本語フォントは欧米のフォントと比較すると、文字種が多く、フォントのサイズも大きい為、全て埋め込むと、生成される PDF ファイルのサイズが大きくなります。そこで、特別な理由が無い限りは後述のサブセッティングの処理を行い、フォントの中でも必要な文字種のみを埋め込むようにします。(PDFlib はデフォルトでサブセッティングを行います)

5) サブセッティング

フォント (特に日本語フォント) を埋め込むと、生成される PDF のファイルサイズが大きくなります。これは埋め込むフォントの全ての内容を PDF ファイルの中に保持するためです。埋め込むフォントのうち、実際にその文書の中で使われている文字だけを埋め込めば埋め込み処理を行う文字種が減り、生成される PDF ファイルのサイズを抑えることができます。この処理をサブセッティングと言います。PDFlib はデフォルトでサブセッティングを行う設定になっていますが、明示的に行う事もできます。


  $p = new PDFlib();
     .
     .
  $p->set_option("searchpath=/etc/fonts/");
  $p->set_option("FontOutline={HGRHM3=HGRHM3.TTF}");
  $font = $p->load_font("HGRHM3", "unicode",  "embedding",
                        "subsetting subsetlimit=75");       // ... ①
  $p->setfont($font, 24.0);
     .
     .
     .
  $p = 0;
PHP 8 / PDFlib 10

基本的な処理は下記の流れで行います。

① load_font() でフォントをロードする際、サブセッティングの設定を行います。

load_font() 関数の optlist に subsetting を指定することで、明示的にサブセッティングを指定できます。

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

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

PDFlib は次の種類のフォントのサブセッティングに対応しています。

  1. TrueType フォント
  2. PostScript か TrueType のアウトラインを持つ OpenType フォント

6) おわりに

フォントの埋め込みは PDF 文書を生成する際によく使われる方法ですが、埋め込みが許可されていないフォントも存在します。埋め込み処理を行う前に、フォントの利用条件等を必ず確認してください。

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

疑問点やリクエストなどがあれば、お問い合わせフォームからお問合せ下さい。

関連ページ

(Nov 13, 2006 - Dec 6, 2021)