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

← 前回:【5】日本語が出力できるようにする ~PDF にフォントを埋め込む編~

JasperReport 6 と Java を使って PDF を出力しました。試行錯誤の連続だったので、忘れないように、一連の手順をまとめました。今回は 「【6】おまけ:スタイルを一括指定する」です。PDF の出力と直接関係がない内容ですが、帳票を作成するうえで便利そうな機能なのでおまけとして取り上げました。

帳票レイアウト上の個々の要素に同じスタイルを 1 つ 1 つ設定していく作業は、なかなかに面倒なものです。また、スタイル変更が発生した時に、また一から同じ作業をする必要があり、保守性があまり良くないです。そこで、まず帳票レイアウト自体にスタイル定義を作成し、各要素に対して定義済みのスタイルを適用しておくと、スタイルをまとめて管理できるため便利です。HTML に対する CSS と似ています。

スタイルを一括指定する

帳票レイアウトをソース モードで表示し、<jasperReport> 要素の子要素として <style> 要素を追加します。そして、各スタイル項目(フォントや文字揃えなど)を、属性で設定します。例えば次のようにします。

<jasperReport ...>
    
    <!--
    デフォルトのスタイル。明朝体で、縦中央揃えとします。 
    -->
    <style name="Default" isDefault="true" vAlign="Middle" pdfFontName="HeiseiMin-W3" pdfEncoding="UniJIS-UCS2-H" isPdfEmbedded="false"/>

    <!--
    帳票のタイトル部分に適用するためのスタイル。ゴシック体で、横中央揃えとします。
    その他については、デフォルトのスタイルを継承します。
    -->
    <style name="Title" style="Default" hAlign="Center" pdfFontName="HeiseiKakuGo-W5"/>

    <!--
    表ヘッダー部分に適用するためのスタイル。ゴシック体とします。
    その他については、デフォルトのスタイルを継承します。
    -->
    <style name="Header" style="Default" pdfFontName="HeiseiKakuGo-W5"/>

name 属性は、スタイルに対して適当な名前をつけています。isDefault 属性は、このスタイルが、帳票のデフォルトのスタイルであるということを表しています。つまり、この帳票においては、個別の要素に対して設定を行わない限り、ここで指定されたスタイルが適用されます。style 属性は、継承元スタイルの名前を指定しています。

ちなみに、<style> 要素を定義する位置は、XML スキーマーで厳密に定められています。<property> 要素→<import> 要素、<template> 要素、<reportFont> 要素、<style> 要素、…の順番で定義しないと、怒られます。

<style> 要素に対して指定可能な属性については、こちら。

後は、個々の要素に対して、上で定義したスタイル名を指定していきます。

[JasperReports] 帳票レイアウトの個々の要素にスタイルを指定
帳票レイアウトの個々の要素にスタイルを指定

もちろん、スタイルを指定した上で、個々の要素に追加で設定を行うこともできます。<style> 要素で統一的なスタイルをまとめて定義しておき、細かい部分は個々の要素に対して設定、というのが良さそうです。

スタイル設定中に発生した問題

帳票レイアウト ファイルを保存したタイミングで、vAlign="Middle" の部分が勝手に vTextAlign="Middle" vImageAlign="Middle" に書きかわっていました。しかも、その状態でプログラムを実行したら、次の例外が発生しました。

net.sf.jasperreports.engine.JRException: org.xml.sax.SAXParseException; lcvc-complex-type.3.2.2: 要素'style'に属性'vTextAlign'を含めることはできません。

JasperReport のエディターの不具合なのかもしれません。ちなみに、jrxml ファイルをテキスト エディターで開いて、vTextAlign="Middle" vImageAlign="Middle" の部分を vAlign="Middle" に戻してから保存すると、例外が発生せずにきちんと動いてくれます。

kpdn

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

コメントを残す