JasperReport 6 と Java を使って PDF を出力しました。試行錯誤の連続だったので、忘れないように、一連の手順をまとめました。今回は「【5】日本語が出力できるようにする ~PDF にフォントを埋め込む編~」です。
← 前回:【4】日本語が出力できるようにする ~PDF にフォントを埋め込まない編~
もくじ
PDF にフォントを埋め込むメリットとデメリット
PDF にフォントを埋め込む場合のメリットは、PDF を表示する環境に関わらず、埋め込まれたフォントで表示できるため、PDF 作成者の意図した表示・印刷結果になることでしょう。そのかわり、デメリットとして、ファイル サイズが大きくなってしまいます。また、フォントのライセンスについて気を配る必要があります。
帳票レイアウトで日本語を出力
フォント ファイルをダウンロード
今回は、PDF への埋め込みが許可されている「IPA フォント」を使用します。
ダウンロードしたファイルを展開すると、ipag.ttf
(IPA ゴシック)、ipagp.ttf
(IPA P ゴシック)、ipam.ttf
(IPA 明朝)、ipamp.ttf
(IPA P 明朝)の 4 つのフォント ファイルが入っています。
フォント ファイルを配置
Tomcat プロジェクトの、クラスパスが通っている任意のフォルダー配下に、フォント ファイルを配置します。今回は、以下のフォルダー構成にしました。
フォント定義ファイルを作成・配置
フォントを配置したのと同じフォルダーに、適当な名前の XML ファイルを作成します。ここでは fonts.xml
としましたが、別の名前でも OK です。
ファイルの内容は次の通りです。
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="IPA ゴシック">
<normal>fonts/ipag.ttf</normal>
<!-- <bold>太字フォント ファイルの相対パス</bold> -->
<!-- <italic>イタリック フォント ファイルの相対パス</italic> -->
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
<fontFamily name="IPA Pゴシック">
<normal>/fonts/ipagp.ttf</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
<fontFamily name="IPA 明朝">
<normal>fonts/ipam.ttf</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
<fontFamily name="IPA P明朝">
<normal>fonts/ipamp.ttf</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
</fontFamilies>
XML 項目 | 内容 |
---|---|
fontFamily@name | フォント ファミリーの名前。帳票レイアウト上でフォントを選択する時に使う名前なので、わかりやすい適当な値を設定します。 |
fontFamily/normal | 通常フォント ファイルのパス。クラスパスのルート フォルダーを基点とする相対パスです。 |
fontFamily/bold | 太字フォント ファイルのパス。クラスパスのルート フォルダーを基点とする相対パスです。太字フォントのファイルが無ければ、記述しなくて OK です。 |
fontFamily/italic | イタリック フォント ファイルのパス。クラスパスのルート フォルダーを基点とする相対パスです。イタリック フォントのファイルが無ければ、記述しなくて OK です。 |
fontFamily/pdfEncoding | PDF のエンコーディング。「Identity-H」は、日本語の横表示です。 |
fontFamily/pdfEmbedded | PDF にフォントを埋め込むかどうか。今回はフォントを埋め込むので、true とします。 |
プロパティ ファイルを作成・配置
クラスパスが通っているルート フォルダーの直下に、jasperreports_extension.properties
という名前のファイルを作成します。
ファイルの内容は次の通りです。
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.font=fonts/fonts.xml
「fonts/fonts.xml」の部分は、上で作成したフォント定義ファイルまでの相対パスを示しています。
帳票レイアウトに日本語フォントを適用
個々の要素(TextField
や StaticText
など)に対し日本語フォントを適用するには、帳票レイアウトを設計モードで表示します。対象の要素を選択し、フォント定義ファイルで設定したフォント名を設定します。フォント名はドロップ ダウン リストに出てこないので、直接入力する必要があります。
出力結果をブラウザーで確認
ブラウザーでサーブレットにアクセスして、PDF の出力結果を確認します。
バッチリです!(デザイン性は皆無ですが)
PDF ファイルのプロパティにて、フォントが設定されているかどうか、確認してみました。
指定したフォントが、しっかりと埋め込まれています。
上手くいかない、その時は…
実行時エラーが出るなど、日本語の出力が上手くいかない場合は、以下を確認してみてください。
- フォント定義 XML に設定したフォント名と、帳票レイアウトに設定したフォント名が一致しているか。
- フォント定義 XML に記述した、フォント ファイルへのパス指定が正しいか。
jasperreports_extension.properties
に記述した、フォント定義 XML ファイルへのパス指定が正しいか。jasperreports_extension.properties
は、クラスパスが通っているフォルダーのルート直下に配置しているか。
あとがき
手法は意外と簡単だったですが、試している最中は相当苦戦しました。(Java や Tomcat そのものにも慣れていないというのも、大きな原因ではあります。)プログラムより、設定関係の方が遥かに時間がかかりました。うまく動かない時は、環境を疑うべしという教訓を得ました😫