2012年11月26日月曜日

JasperReportsでフォントを埋め込まない日本語PDFを生成する方法

JasperReportsで日本語PDFを作成する場合、日本語フォントの指定を おこなう必要があります。フォントの扱いは以下の2通りがあります。

  • フォントをPDFに埋め込む
  • フォントをPDF埋め込まず、PDF標準フォントを指定する

フォントをPDFに埋め込むと、環境に依存せず同じ見た目が保てる利点があり、 明朝・ゴシック以外のフォントや外字フォントを用いる場合に有益です。 しかし、フォントをPDFに埋め込むと以下の問題が発生します。

  • フォントデータの分、PDFのファイルサイズが大きくなる。 イントラネットのみの場合や回線が太い場合はさほど問題に ならないかもしれませんが、回線に余裕が少ない場合は ファイルサイズが問題になる可能性があります。
  • PDFファイルを配布する時にフォントのライセンスが問題となる。 Windows, Macintosh等の商用OSに附属するフォントは マシン1台でのみ使用できるライセンスになっていることが多く、 他のマシンで使うには別途ライセンスが必要になります。 ライセンスはフォントに依りますが、 Webで不特定多数にPDFを配布する場合は 高額なライセンス(数10万〜100万円)が必要になる場合が多いようです。

外字を利用する、毛筆フォントを利用する、 といったフォントを埋め込む必然性がある場合を除いて、 ほとんどの場合はフォントを埋め込まない方法が望ましいと私は考えています。 
どういう訳か、雑誌やWebでのJasperReportsの紹介記事では フォント埋め込み方式しか紹介されていないようです。 そこで、このページではフォントを埋め込まない方式を紹介します。

 

JasperReportsの紹介

JasperReportsは Javaで動作するオープンソースの帳票ライブラリです。 私はPDF生成ツールとして注目しています。 このツールには以下の機能的な特徴があります。

  • 100% pure Java
  • オープンソースで商用ソフトに組み込みやすいライセンス (Apache likeとLGPLのデュアルライセンス)
  • 1つの帳票レイアウトから複数のフォーマット (PDF, HTML, XLS, CSV, XML 等)で出力できる
  • GUIレイアウトツールiReportが存在する (Apache FOPはGUIレイアウトツールが存在しないので レイアウトには苦労します)
  • レイアウトで準備した枠にプログラムから値を埋めこむ帳票方式のため Apahce FOPのような組版ソフトに比べて生成速度が速いが、 長文を埋めこむ目的には向かない

JasperReportsの内部構造上の特徴は以下の通り。

  • PDF生成にはiTextを、 Excelファイル生成にはJakarta POIを使用している。
  • 帳票レイアウトは独自形式XMLを使用する。
  • 帳票に埋め込むデータの形式はHashMap, JavaBean, JDBCのResultSet等が使用できる。

フォント指定方法

JasperReportsはPDF生成にiTextを使用しています。 そのため、フォントの取り扱いはiTextに従います。 東アジア言語のiTextでの使いかたは、 iText TutorialのCJKフォント解説に書いてあります。

Report XMLファイルの中で、 reportFontエレメントでフォントの指定を行う場合に、 以下の設定を行います。

  <reportFont name="Gothic" isDefault="false"      fontName="Default Gothic" size="10" pdfFontName="HeiseiKakuGo-W5"      pdfEncoding="UniJIS-UCS2-H" isPdfEmbedded="false"/>    <reportFont name="Mincho" isDefault="false"      fontName="Default Mincho" size="10" pdfFontName="HeiseiMin-W3"      pdfEncoding="UniJIS-UCS2-H" isPdfEmbedded="false"/>      
name
定義するフォントの識別子です。 実際に出力コンテンツでフォントを指定する時、 fontエレメントで使用します。
fontName
何のために存在するのか良くわかりません。Acrobat Readerで `フォント情報' に表示するフォント名でしょうか? (追記: javaしかできない によると、XSL, HTMLで使用して、PDFには影響ないそうです)
pdfEncoding
フォントのエンコード形式を指定します。例で使用している `UniJIS-UCS2-H' は `文字集合: Adobe Japanese1, エンコード形式:Unicode(UCS2), 半角文字を欧文フォントに置き換えない, 横書き' を表しています。 参考:エンコーディング形式 (つながらなくなっているので、 Web Archiveに残っていたページへリンクします)。 ただ、`UniJIS-UCS2-H' と `UniJIS-UCS2-HW-H' を試して比べてみたのですが 見た目は変わらなかったです。実際のところ、何が違うのでしょうね。
pdfFontName
isPdfEmbeddedがtrueの場合、フォントファイル名を指定します。 isPdfEmbeddedがfalseの場合、PDFファイルに記録するフォント名を指定します。 埋め込まなくても良いフォントは、欧文基本14フォント, 日本語標準フォント, 簡体中国語標準フォント, 繁体中国語標準フォント, 韓国語標準フォント のみと考えると良いでしょう。

JasperReportsを組み込んだプログラムを動作させてPDFを生成したら、 AcrobatReaderのメニュー「ファイル - 文書のプロパティ - フォント」 を見てフォントが埋め込まれていないことを確認してみましょう。

 

0 件のコメント:

コメントを投稿