http://www.ponpo.com/jrs/jpn/intoro.html
http://jasperforge.org/jaspersoft/opensource/business_intelligence/ireport/index.php
http://itextpdf.sourceforge.net/
!!!iReportの起動オプション
-cp:p D:\data\Development_tools\java\JDBC\oracle\ojdbc6.jar
でクラスパスを指定して起動できる。
!!!iReport & JasperReports で日本語を表示する方法
!!フォントをPDFに埋め込まない方法
!注意点
半角文字列の長さが正しく計算されないことがあるので注意。
個人的にはフォントをPDFに埋め込む方法を推奨する。
!iTextAsian.jarを取得
http://itextpdf.sourceforge.net/
から iTextAsian.jar をダウンロード
※必要に応じて iTextAsianCmaps.jar もダウンロードする
{{ref iTextAsian.jar}}
{{ref iTextAsianCmaps.jar}}
{{word コンパイルの時にクラスパスに追加するく,red}}
!iReport で Pdf Font name を設定する
,,
,HeiseiKakuGo-W5,ゴシック
,HeiseiMin-W3,明朝
のいずれか
!iReport で Pdf Encoding の設定する
,,
,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の縦書きエンコーディング
のいずれか
!!PDF にフォントを埋め込む方法(Font extentionを使う)
!説明
http://d.hatena.ne.jp/dojum/20121108
http://dev.classmethod.jp/server-side/java/jasperreports-tutorial/
PDFにフォントを埋め込む方法で現在推奨されている方法。
PDF font nameや Pdf encoding は非推奨になっている。
!iReportへのフォント追加
*ツール -> オプションを選択
*iReport -> Fonts タブを選択
{{img Image1.png}}
*フォントを選択する
{{img Image2.png}}
*PDF用フォントの設定
{{img Image3.png}}
ここで選んだフォントはiReportのディレクトリ以下のfontsディレクトリへコピーされる。
!iReport でフォントを指定する
{{img Image4.png}}
PDF Font NameやPDF Encoding はいじらなくてよい。
!jasperreports Font extention の設定
以下の2つのファイルを作成する。
これらのファイルはiReportのfontsディレクトリに作成されているので、
自分で作成せずにコピーして編集しても良い。
jasperreports_extension.properties を作成して、
{{word 実行時のクラスパスが通ったパスへ配置する。,red}}
内容は、以下のとおり。
フォントを定義しているXMLのパスを指定する。
*jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ireport=fonts/irfonts.xml
フォント定義のXMLを作成する。
記載内容は以下の通り。
*irfonts.xml
{{word jasperreports_extension.propertiesやフォント定義のXML、フォントファイルのパスはクラスパスから検索される。,red}}
!!PDF にフォントを埋め込む方法(PDF Font Nameを直接指定する方法)
※推奨されていない
!iReport で Pdf font name を設定する
フォントを埋め込む場合は、 Pdf font name に 埋め込むフォントのファイル名を書く
例
ipag.ttf
{{word フルパスではなく、ファイル名(クラスパスからクラスローダが検索できるようなパス)を書く,#FF0000}}
{{word フォントファイルがある場所はクラスパスに追加する,#FF0000}}
フォントは、クラスパスからクラスローダによって検索されるので
フォントのパスが
project/font/ipag.ttf
にあって、クラスパスが
project
に通っている場合、フォント名は
font/ipag.ttf
と指定する。
!iReport で Pdf embedded を設定する
Pdf embeddedを
true
に設定する
!iReport で Pdf encoding を設定する
Pdf encoding を
,,
,Identity-H,横書き
,Identity-V,縦書き
に設定する
!!!使い方
{{ref jasper_test.zip}} サンプル
!新規レポートの設定
Expressionの記述言語を指定する。
もし、Expressionの記載言語をJavaにするには、レポートのプロパティのLanguageをJavaにする。
{{img Image5.png}}
{{img Image6.png}}
!基本
+ソースからもらうパラメータ、フィールドを必要に応じて追加する
+追加したパラメータ、フィールドを使ってTextFieldやサブフォーム、グラフを追加
※ソースコンパイル時にクラスが無いって表示されたときは、iReportのディレクトリ以下からjarファイルを探して、それっぽいjarファイルをクラスパスに追加。
+罫線は、各TextFieldを右クリックして、borderを設定すると楽
++Lineを引いたり、rectangleで罫線を付けてもいいけど、borderのほうが楽
!ソースからデータを渡す1
2次元配列からデータを出力するデータソースを作る
{{code Java,
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.JRRewindableDataSource;
import net.sf.jasperreports.engine.JRRuntimeException;
public class ArrayDataSource implements JRRewindableDataSource {
private int currentRow;
private Object[][] records;
private Object[] currentRecord;
private Map columnNamesMap = new HashMap();
public ArrayDataSource(Object[][] records, String[] columnNames) {
this.records = records;
if (columnNames != null) {
for (int i = 0; i < columnNames.length; i++) {
columnNamesMap.put(columnNames[i], Integer.valueOf(i));
}
}
currentRow = -1;
}
public boolean next() {
currentRow++;
return currentRow < records.length;
}
public Object getFieldValue(JRField jrField) {
Integer fieldIndex = (Integer)columnNamesMap.get(jrField.getName());
if (fieldIndex == null) {
throw new JRRuntimeException("Field \"" + jrField.getName() + "\" not found in data source.");
}
return records[currentRow][fieldIndex.intValue()];
}
public void moveFirst() {
currentRow = -1;
}
}
}}
出力する
{{code Java,
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.design.*;
import net.sf.jasperreports.view.JasperViewer;
import net.sf.jasperreports.engine.data.*;
import net.sf.jasperreports.engine.util.*;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import java.util.*;
import java.io.*;
public class test2 {
public static void main(String args[]){
try{
// JasperDesign jasperDesign = JRXmlLoader.load("report/report.jrxml");
// JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperReport jasperReport = (JasperReport)JRLoader.loadObject("report/report.jasper");
Map parameters = new HashMap();
parameters.put("Title", "Basic JasperReport");
parameters.put("MaxSalary", new Double(25000.00));
String[] header = new String[] {"name","cost"};
Object[][] data = new Object[3][2];
data[0][0] = "test1";
data[0][1] = "1000";
data[1][0] = "test2";
data[1][1] = "3000";
data[2][0] = "てすと";
data[2][1] = "4000";
ArrayDataSource ds = new ArrayDataSource(data,header );
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, ds);
// You can use JasperPrint to create PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "BasicReport.pdf");
} catch (Exception e){
e.printStackTrace();
}
}
}
}}
!ソースからデータを渡す2
3.7.6には ListOfArrayDataSource が追加された。
String[] header = new String[] {"name","cost"};
Vector vec = new Vector();
vec.add(new Object[]{"test", "100"});
vec.add(new Object[]{"test1","200"});
vec.add(new Object[]{"あいうえお","200"});
ListOfArrayDataSource ds = new ListOfArrayDataSource(vec,header );
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, ds);
と言う風に使えるはず・・・。
!ソースからデータを渡す3
Vector vec = new Vector();
HashMap map = new HashMap();
map.put("BU","001");
map.put("KA","A");
map.put("NAME","hoge");
map.put("COST",new Double(2));
vec.add(map);
map = new HashMap();
map.put("BU","001");
map.put("KA","A");
map.put("NAME","hoge2");
map.put("COST",new Double(2));
vec.add(map);
JRMapCollectionDataSource ds = new JRMapCollectionDataSource(vec);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, ds);
※$F{BU} や $F{KA}などを使えるように、iReportでフィールドを追加する
!サブレポート用のデータをソースから渡す
パラメータ用のMapに含めて渡してしまえばいい。
parameters.put("subdata",new JRMapCollectionDataSource(vec))
$P{subdata} を使えるように、iReportでパラメータを追加する
!グラフの使い方
円グラフの場合はこんな感じ。
vec = new Vector();
map = new HashMap();
map.put("項目","項目1");
map.put("value",1);
vec.add(map);
map = new HashMap();
map.put("項目","項目2");
map.put("value",2);
vec.add(map);
折れ線グラフの場合は
vec = new Vector();
map = new HashMap();
map.put("項目","項目1");
map.put("カテゴリ","カテゴリ1");
map.put("value",1);
vec.add(map);
map = new HashMap();
map.put("項目","項目1");
map.put("カテゴリ","カテゴリ2");
map.put("value",2);
vec.add(map);
map = new HashMap();
map.put("項目","項目2");
map.put("カテゴリ","カテゴリ1");
map.put("value",1);
vec.add(map);
map = new HashMap();
map.put("項目","項目2");
map.put("カテゴリ","カテゴリ2");
map.put("value",4);
vec.add(map);
な感じでデータを送る。Series に項目nを設定すると、項目毎にグループ化を行って出力される。
!プリンタ直印刷
PrintRequestAttributeSet atts = new HashPrintRequestAttributeSet();
atts.add(new NumberUp(2)); // Nアップの指定
atts.add(new Copies(5)); // 部数の指定
atts.add(MediaSizeName.ISO_A4); // サイズの指定
atts.add(OrientationRequested.PORTRAIT); // 縦方向
atts.add(SheetCollate.COLLATED); // ドキュメントを部単位で印刷コピー機でいうところのソート機能でしょうか?
atts.add(Sides.DUPLEX); // 両面印刷
PrintServiceAttributeSet atts2 = new HashPrintServiceAttributeSet();
atts2.add(new PrinterName("PDF Printer",Locale.getDefault()));
JRExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, atts);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE);
exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.TRUE);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, atts2);
exporter.exportReport();
!ページ数表示
http://74.125.153.132/search?q=cache:OrH57gRZFk4J:d.hatena.ne.jp/w650/20051101+jasperreports+%E3%83%9A%E3%83%BC%E3%82%B8%E6%95%B0&cd=1&hl=ja&ct=clnk&gl=jp
JasperReportにて各ページに“Page X of Y”(ex.1/2)みたいな記述を入れたい場合には、textField要素を二つ用意してそれぞれにPAGE_NUMBER変数を設定する。
そして現在ページ数のtextFieldには、evaluationTime="Now"とし、全体ページ数のtextFieldにはevaluationTime="Report"を指定する。
!複数のレポ−トを1つレポ−トに結合する
{{code Java,
public static JasperPrint connectJasperPrint(List printList){
JasperPrint basePrint = null;
JasperPrint currentPrint = null;
Iterator printIterator = printList.iterator();
Iterator pageIterator = null;
while(printIterator.hasNext()){
currentPrint = printIterator.next();
if (basePrint == null){
basePrint = currentPrint;
continue;
}
pageIterator = currentPrint.getPages().iterator();
while(pageIterator.hasNext()){
basePrint.addPage(pageIterator.next());
}
}
return basePrint;
}
}}
こんな感じで、ページを追加をする。
ただし、1ページ目のサイズに固定されるので注意。
!サイズの違うレポートを1つのPDFに結合する
{{code Java,
public static byte[] connectJasperPrintToPDF(List printList) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
JRPdfExporter jrPdfExporter = new JRPdfExporter();
jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);
jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, printList);
jrPdfExporter.exportReport();
return outStream.toByteArray();
}
}}
http://gendosu.jp/redmine/projects/25/wiki/JasperReports-%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E9%81%95%E3%81%86%E7%94%A8%E7%B4%99%E3%82%84%E3%80%81%E7%94%A8%E7%B4%99%E6%96%B9%E5%90%91%E3%81%AE%E9%81%95%E3%81%86%E7%89%A9%E3%82%92%E5%8D%98%E4%B8%80%E3%81%AEPDF%E3%81%A8%E3%81%97%E3%81%A6%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF?version=2
!テキストフィールドを自動的に折り返す
テキストフィールドでWordWrap機能を有効にすることができる。
http://stackoverflow.com/questions/10631806/jasperreport-wrap-text-to-show-long-text-in-textfield
Stretch With Overflow
を有効にすれば、自動的に折り返す。
また、枠(rectangle)に対しても stretchType を RelativeToBandHeight にすることで自動的に高さを変えることができる。
For rectangle :
For textField :
...
{{img Image7.png}}
!改行位置がずれる場合
http://kenichiro22.hatenablog.com/entry/20101208/1291779030
PDFを出力する際に、文字の改行位置がおかしくなることがある。
フォントやバージョンに左右されるような気がするが、詳しいことは不明。
解決策としてはJRPdfExporterのパラメータ"FORCE_LINEBREAK_POLICY"をtrueする。
(バージョンによってはパラメータの設定方法が変わっているかも)
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRPdfExporterParameter.FORCE_LINEBREAK_POLICY, Boolean.TRUE);
または、jrxmlファイルにpropertyを追加します。
{{category2 プログラミング言語,Java}}