あいれぽ

JasperReportsで日本語をPDFで表示させるときのメモ。
ググれば一杯出てくるけど、自分のとこでひとまとめでわかるように。

最低限必要なJAR

  • jasperreports-3.7.1.jar
  • iText-2.1.0.jar
  • iTextAsian.jar

ほかに依存しているCommons系がある(Web系アプリならたいていつかってるかな?)

レイアウトXMLの修正

fontタグに以下の属性を追加する。

<staticText>
    <reportElement x="0" y="0" width="100" height="20"/>
    <textElement>
        <font fontName="MS UI Gothic" size="12" isBold="false" 
         isItalic="false" isUnderline="false" isStrikeThrough="false" 
         pdfFontName="HeiseiKakuGo-W5" 
         pdfEncoding="UniJIS-UCS2-HW-H" 
         isPdfEmbedded="false"/>
    </textElement>
    <text><![CDATA[お試しiReport]]></text>
</staticText>
ゴシックの場合

pdfFontName="HeiseiKakuGo-W5"
pdfEncoding="UniJIS-UCS2-HW-H"
isPdfEmbedded="false"

明朝の場合

pdfFontName="HeiseiMin-W3"
pdfEncoding="UniJIS-UCS2-HW-H"
isPdfEmbedded="false"

エンコーディングの設定
UniJIS-UCS2-H Adobe-Japan1のUnicodeエンコーディング
UniJIS-UCS2-V UniJIS-UCS2-Hの縦書きエンコーディング
UniJIS-UCS2-HW-H UniJIS-UCS2-Hと同じ、ただし英文字を半角に置き換える
UniJIS-UCS2-HW-V UniJIS-UCS2-HW-Hの縦書きエンコーディング

参考:http://www.moriwaki.net/wiki/index.php?JasperReports

その他

iReport側の設定でクラスパスにiTextAsian.jarを追加するとフォント設定で参照できるようになる。
さらにデザイナ上のプロパティからpdfFontNameとかの設定で指定できる。

POJOを使ったデータソース

Java側でデータソース(明細部分のデータのこと)でDtoやEntity使えば楽やん?てことで。
DBクエリも渡せるみたいだけど、精神衛生上気持ち悪いし。

JRDataSource datasource = dataSourceFactory(details);

JasperPrint print = JasperFillManager.fillReport(jasper, param, datasource);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, filename);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.exportReport();

protected JRDataSource dataSourceFactory(List<Object> list) {
    if (list == null || list.isEmpty()) {
        return null;
    }

    JRDataSource datasource = null;

    if (list != null && list.size() > 0) {
        if (list.get(0) instanceof Map) {
            datasource = new JRMapCollectionDataSource(list);
        } else {
            datasource = new JRBeanCollectionDataSource(list);
        }
    }
    return datasource;
}

手抜きファクトリメソッドを作ってみた。
JRDataSourceインタフェースの実装クラスがListの要素によって対応するのがあるらしい。
だもんでリストの中身をみて実装クラスを替えてやる。
Listの中身がPOJOて決め撃ちならJRBeanCollectionDataSourceでいいし。
そこはけーすばいけーすで。
ここが違ってるとPDFに出力したときにnullにしかならないというorz


iReportのマニュアルて有償しかない?
オンラインドキュメントはわかりづらいし…。