JasperReports 6 で PDF を作り、ブラウザーで表示する【5】

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 プロジェクトの、クラスパスが通っている任意のフォルダー配下に、フォント ファイルを配置します。今回は、以下のフォルダー構成にしました。

[Eclipse] フォント ファイルを配置
フォント ファイルを配置

フォント定義ファイルを作成・配置

フォントを配置したのと同じフォルダーに、適当な名前の XML ファイルを作成します。ここでは fonts.xml としましたが、別の名前でも OK です。

[Eclipse] フォント定義ファイルを配置
フォント定義ファイルを配置

ファイルの内容は次の通りです。

<?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/pdfEncodingPDF のエンコーディング。「Identity-H」は、日本語の横表示です。
fontFamily/pdfEmbeddedPDF にフォントを埋め込むかどうか。今回はフォントを埋め込むので、true とします。

プロパティ ファイルを作成・配置

クラスパスが通っているルート フォルダーの直下に、jasperreports_extension.properties という名前のファイルを作成します。

[Eclipse] プロパティ ファイルを配置
プロパティ ファイルを配置

ファイルの内容は次の通りです。

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」の部分は、上で作成したフォント定義ファイルまでの相対パスを示しています。

帳票レイアウトに日本語フォントを適用

個々の要素(TextFieldStaticText など)に対し日本語フォントを適用するには、帳票レイアウトを設計モードで表示します。対象の要素を選択し、フォント定義ファイルで設定したフォント名を設定します。フォント名はドロップ ダウン リストに出てこないので、直接入力する必要があります。

[JasperReports] 帳票上の個々の要素に日本語フォントを設定
帳票上の個々の要素に日本語フォントを設定

出力結果をブラウザーで確認

ブラウザーでサーブレットにアクセスして、PDF の出力結果を確認します。

[JasperReports] PDF の出力結果。日本語が表示されている
PDF の出力結果。日本語が表示されている

バッチリです!(デザイン性は皆無ですが)

PDF ファイルのプロパティにて、フォントが設定されているかどうか、確認してみました。

PDF のプロパティ。フォントが埋め込まれている
PDF のプロパティ。フォントが埋め込まれている

指定したフォントが、しっかりと埋め込まれています。

上手くいかない、その時は…

実行時エラーが出るなど、日本語の出力が上手くいかない場合は、以下を確認してみてください。

  • フォント定義 XML に設定したフォント名と、帳票レイアウトに設定したフォント名が一致しているか。
  • フォント定義 XML に記述した、フォント ファイルへのパス指定が正しいか。
  • jasperreports_extension.properties に記述した、フォント定義 XML ファイルへのパス指定が正しいか。
  • jasperreports_extension.properties は、クラスパスが通っているフォルダーのルート直下に配置しているか。

あとがき

手法は意外と簡単だったですが、試している最中は相当苦戦しました。(Java や Tomcat そのものにも慣れていないというのも、大きな原因ではあります。)プログラムより、設定関係の方が遥かに時間がかかりました。うまく動かない時は、環境を疑うべしという教訓を得ました😫

次回:【6】おまけ:スタイルを一括指定する →

kpdn

お寿司とゲームと動物が好きな、フリーランスのエンジニアです。フロントエンドからインフラまで日々奮闘中です。最近は物忘れがどんどんがひどくなってきました。

コメントを残す