あいれぽ
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の縦書きエンコーディング |
その他
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のマニュアルて有償しかない?
オンラインドキュメントはわかりづらいし…。