第4回:アプリケーションに組み込む

 
はじめに
   こんにちは。ビーブレイクシステムズの横井です。iReport編の最終回となる今回は、第3回で作成した見積書をJavaアプリケーションやWebアプリケーションへ組み込む方法について説明します。

   ここで第2回の説明を思い出して、頭の中を整理していただきたいと思います。実際の帳票出力処理はJasperReportsが行っていますので、アプリケーションに組み込む場合はiReportで作成したテンプレートXMLとJasperReportsを利用することになります。


JasperReportsのデータ変換

   組み込み方法の説明の前に、JasperReportsのデータ変換の流れについて説明します。JasperReportsでは以下の図のように3段階のステップを経て帳票を出力しており、それぞれのステップの状態をファイルに保存しておくこともできます。例えば、動的なデータのバインドが不要な帳票であれば、あらかじめ(3)の.jrprintファイルを用意しておくことで、出力にかかる時間を短縮することができます。逆に、毎回コンパイルから行うようなコーディングをすると、必要以上にリソースを消費し、処理時間も長くなります。

データ変換の流れ
図:データ変換の流れ



PDF出力

   それではJasperReportsを使用した出力プログラムについて見て行きましょう。第3回で作成した見積書を顧客名付きで出力するプログラムについて説明します。なお、ここで紹介するプログラムの白文字部分は環境に応じて変更してください。

見積書を顧客名付きで出力
import java.sql.*;
import java.util.*;
import net.sf.jasperreports.engine.*;

/**
* JasperReportのサンプル
*
* コンパイル~データのバインド~出力の全ステップを行う
*/
public class JasperSample1 {

public static void main(String[] args) {
// テンプレートXMLファイルのパス
String templatePath = "./template/estimate.jrxml";
// 出力するPDFファイルのパス
String destPath = "./output/JasperSample1.pdf";

Connection con = null;
try {
// (1)テンプレートXMLのコンパイル
JasperReport jasperReport = JasperCompileManager.compileReport(templatePath);

// (2)パラメータの生成
Map paramMap = new HashMap();
paramMap.put("CLIENT_NAME", "ビーブレイクシステムズ");

// (3)データソースの生成
Class.forName("org.postgresql.Driver");
con = DriverManager.getConnection(
"jdbc:postgresql://hostname:port/instance", "user","pass");

// (4)データの動的バインド
JasperPrint print = JasperFillManager.fillReport(jasperReport, paramMap, con);

// (5)PDFへ出力
JasperExportManager.exportReportToPdfFile(print, destPath);

} catch (Exception ex) {
ex.printStackTrace();
}
finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

   上記のプログラムを実行すると、第3回に作成した見積書が出力されます。このプログラムでは、先ほど説明した流れが分かりやすいように、コンパイル、バインド、出力の全ステップをプログラムで行っています。

pdf  出力した見積書 (35.2 KB)
上記のプログラムから作成したものです。こちらを参考にしながら作成してみてください。

 
(1)テンプレートXMLのコンパイル

   テンプレートXMLを読み込んでJasperReportオブジェクトを生成しています。結果を.jasperファイルへ出力する場合は、"JasperCompileManager.compileReportToFile()"を使用します。


(2)パラメータの生成

   (4)データの動的バインドで使用するパラメータを生成しています。今回のプログラムでは、見積書の宛て名部分で使用する"CLIENT_NAME"というパラメータを設定しています。


(3)データソースの生成

   (4)データの動的バインドで使用するデータソースを生成しています。今回はJDBCをデータソースとして使用するので、JDBCのコネクションを生成しています。


(4)データの動的バインド

   JasperReportオブジェクトに(2)、(3)で作成したデータをバインドして帳票のイメージを作成しています。コンパイル済みの.jasperファイルを読み込んでデータをバインドする場合は、"JasperFillManager.fillReport()"の第1引数に.jasperファイルのパスを指定します。

   また、バインドした結果を.jrprintファイルに出力する場合は、"JasperFillManager.fillReportToFile()"を使用します。


(5)PDFへ出力

   バインドした結果のJasperPrintオブジェクトと出力先のパスからPDFを出力しています。なお、.jasperファイルを読み込んで出力する場合は、以下のようにシンプルに記述できます。

JasperPrintからPDFを出力
import java.sql.*;
import java.util.*;
import net.sf.jasperreports.engine.*;

/**
* JasperReportのサンプル
*
* .jasperファイルを読み込んでPDFに出力する
*/
public class JasperSample2 {

public static void main(String[] args) {
// コンパイル済みファイルのパス
String jasperPath = "./template/estimate.jasper";
// 出力するPDFファイルのパス
String destPath = "./output/JasperSample2.pdf";

Connection con = null;
try {
// パラメータの作成
Map paramMap = new HashMap();
paramMap.put("CLIENT_NAME", "ビーブレイクシステムズ");

// データソースの生成
Class.forName("org.postgresql.Driver");
con = DriverManager.getConnection(
"jdbc:postgresql://hostname:port/instance", "user","pass");

// PDFへ出力(内部的にデータのバインドと出力を行っている)
JasperRunManager.runReportToPdfFile( jasperPath, destPath, paramMap, con);
} catch (Exception ex) {
ex.printStackTrace();
}
finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

 
その他の出力形式

   PDFへの出力については分かっていただけたと思いますので、その他の出力方法について説明します。JasperReportsでは出力形式ごとに出力処理クラス(Exporter)と、出力時のオプションを指定するための出力パラメータクラス(ExporterParameter)が用意されています。PDF出力の例では出力処理クラスは出てきませんでしたが、出力処理で内部的に利用されています。以下の表に出力処理クラスと出力パラメータクラスの一覧をしめします。

出力処理クラス出力パラメータクラス対応出力形式
JRCsvExpoterJRCsvExporterParameterCSV出力用Exporter
JRGraphics2DExporterJRGraphics2DExporterParameterGraphics2D出力用Exporter
JRHtmlExporterJRHtmlExporterParameterHTML出力用Exporter
JRPdfExporterJRPdfExporterParameterPDF出力用Exporter
JRPrintServiceExporterJRPrintServiceExporterParameterプリンタ出力用Exporter
JRXlsExporterJRXlsExporterParameterExcel出力用Exporter
JRXmlExporterJRXmlExporterParameterXML用Exporter

表:出力パラメータクラス一覧


   出力処理クラスの基本的な使い方は、どの出力処理クラスでもそれほど変わりませんので、プリンタ出力の場合を例にとって説明します。

プリンタ出力
// データの動的バインド
JasperPrint print = JasperFillManager.fillReport(jasperPath, paramMap, con);

// (1)プリンタ用出力クラスの生成
JRPrintServiceExporter exporter = new JRPrintServiceExporter();

// (2)出力対象のJasperPrintの設定
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);

// (3)印刷プリンタをプリンタ名で指定
HashPrintServiceAttributeSet printAttribute = new HashPrintServiceAttributeSet();
printAttribute.add( new PrinterName("FinePrint 2000", Locale.getDefault()));
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, printAttribute);

// (4)出力の実行
exporter.exportReport();
(1)プリンタ用出力クラスの生成

   出力形式に応じて、対応する出力処理クラスを生成します。


(2)出力対象のJasperPrintの設定

   出力処理クラスを使用して出力するJasperPrintオブジェクトを設定します。


(3)印刷プリンタをプリンタ名で指定

   ここが出力処理クラスを使用するときのポイントとなる部分です。今回はプリンタから印刷するため、JRPrintServiceExporterParameterのパラメータを指定しています。このように出力処理クラスにどのようなパラメータを渡すかで、出力処理クラスの振る舞いを変更することができます。これだけだとイメージが掴みづらいかもしれませんので、以下にもうひとつパラメータ設定の例をしめします。

パスワード付きPDFの出力
// Exporterの生成
JRPdfExporter exporter = new JRPdfExporter();

// 出力オブジェクトの設定
exporter.setParameter( JRPdfExporterParameter.JASPER_PRINT, print);
// 出力先の設定
exporter.setParameter( JRPdfExporterParameter.OUTPUT_FILE_NAME, destPath);
// パスワード保護を有効にする
exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
// パスワードの設定
exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD, "jasper");
exporter.setParameter(JRPdfExporterParameter.OWNER_PASSWORD, "reports");

// 出力の実行
exporter.exportReport();

   なお、プリンタの指定で悩む場合が多いようですので、現在設定されているプリントサービス情報を表示するプログラムを以下にしめします。悩んだときはこちらの出力結果を参考にしてください。

プリントサービス情報の出力
import javax.print.*;
import javax.print.attribute.*;

/**
* 現在設定されているプリントサービスの情報を出力する
*/
public class PrintServiceWriter {

public static void main(String[] args) {

// プリントサービス一覧の取得
PrintService[] myPrintServices = PrintServiceLookup.lookupPrintServices(null, null);

for( int cnt = 0; cnt < myPrintServices.length; cnt++){
System.out.println("=====Print Service [" + cnt + "]=====");
PrintService myPrintService = myPrintServices[ cnt];
PrintServiceAttributeSet attributeSet = myPrintService.getAttributes();

// プリントサービスの属性を出力
Attribute[] attr = attributeSet.toArray();

System.out.println("    ------Print Service Attirbute-----");
for (int i = 0; i < attr.length; i++) {
System.out.println( "    " + attr[i].getClass().toString() + "='" + attr[i] + "'");
}

// そのプリントサービスがサポートするフレバーを出力
DocFlavor[] glavors = myPrintService.getSupportedDocFlavors();

DocFlavor flavor;
System.out.println("    ------Print Service Flavor-----");
for (int i = 0; i < glavors.length; i++) {
flavor = glavors[i];
System.out.println("    " + flavor.toString());
}
}
}
}
(4)出力の実行

   設定したJasperPrintやパラメータの内容に従い出力を実行します。

 
Webアプリケーションへの組み込み
   最後にWebアプリケーションへの組み込み方法について説明します。設定に関してはJasperReportsのデモにwebappというWebアプリケーション用のデモが含まれていますので、そちらを参考にして行ってください。

   基本的な流れは今まで説明してきた内容と変わりませんので、ポイントとなる部分についてのみ説明します。

Webアプリケーションへの組み込み方法
// (1)byte[]としてPDFを生成
byte[] bytes = JasperRunManager.runReportToPdf( jasperPath, paramMap, con);

// (2)出力設定
response.setContentType("application/pdf");
response.setContentLength(bytes.length);

// (3)生成したbyte[]をストリームに出力
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
(1)byte[]としてPDFを生成

   ストリームに対して書き込むために、byte[]としてPDFを生成します。


(2)出力設定

   この部分は通常のサーブレットと同様にコンテンツのタイプとデータ長を設定しています。


(3)生成したbyte[]を出力

   生成した"ServletOutputStrem"に対して作成したbyte[]を書き込みます。


まとめ

   今回でiReportの説明は終了ですが、いかがでしたでしょうか。定型の帳票であれば、かなりの範囲がiReportでカバーできる事がお分かりいただけたのではないかと思います。次回からは、iReportのグラフ出力にも使われているJFreeChartというJavaからグラフを生成するためのライブラリについて説明します。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值