3.9 サンプルプログラム(4) - 複数のドキュメントレイアウトでPDFを生成
概要
1つの帳票デザインを、複数のパーツに分割することでアプリケーションのメンテナンス性を高めることができます。
これは、ページレイアウトのみでなくドキュメントレイアウトにも適用することができます。
たとえば、出力項目が異なる数種類の帳票デザインがあり、それらを組み合わせて1つのPDFとして出力する場合、ドキュメントレイアウト、ページレイアウトをそれぞれ独立して作成することができます。
サンプル構成
ソースサンプル
import java.io.FileNotFoundException;
import java.io.IOException;
import com.brainsellers.pdf.PDFRuntimeException;
import com.brainsellers.xml.JaxpXML;
import com.brainsellers.xml.common.XMLSuper;
import com.brainsellers.xml.datatypes.HashtableType;
import com.brainsellers.xml.datatypes.RecordType;
import com.brainsellers.xml.page.PDFEngine;
public class Sample4 {
public static void main(String args[]) {
new Sample4(args);
System.exit(0);
}
public Sample4(String args[]) {
try {
// (1) 出力ファイル名を指定してPDFエンジンのインスタンスを生成する
PDFEngine pdf = new PDFEngine("${base-dir}/sample/java/Sample4.pdf");
// (2) レイアウトXMLファイルパスと出力先を指定する
XMLSuper xml1 = new JaxpXML("${base-dir}/sample/java/Sample4-doc1.xml", pdf);
XMLSuper xml2 = new JaxpXML("${base-dir}/sample/java/Sample4-doc2.xml", pdf);
XMLSuper xml3 = new JaxpXML("${base-dir}/sample/java/Sample4-doc3.xml", pdf);
// (3) レイアウト情報(XML)の解析を行う
xml1.parse();
xml2.parse();
xml3.parse();
// (4) 用紙サイズ、セキュリティ等の文書情報はドキュメントレイアウトで定義するので
// アプリケーションでは設定しません。改ページ処理も必要ありません。
// (5) 各ページレイアウトに応じたデータソースをセットする
xml1.setDataSource("app-resource", getRecord1(1));
xml2.setDataSource("app-resource", getRecord2(1));
xml3.setDataSource("app-resource", getRecord3(1));
// (6) 座標計算を行う
xml1.calcDataSize();
xml2.calcDataSize();
xml3.calcDataSize();
// (7) PDFを生成する
xml1.toPDF();
xml2.toPDF();
xml3.toPDF();
// (8) データソースをリセットする (繰り返す場合には必要)
xml1.reset();
xml2.reset();
xml3.reset();
// (9) PDFを出力する
pdf.close();
} catch (PDFRuntimeException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* ダミーのデータソースを生成する (page1用)
*
* @param idx
* 添え字
* @return 配列のデータソース
*/
private RecordType getRecord1(int idx) {
RecordType rec = new RecordType();
for (int i = 0; i <idx * 20; i++) {
HashtableType table = new HashtableType();
table.put("製品コード", "製品コード" + ":" + i);
table.put("製品名", "製品名" + ":" + i);
table.put("数量", "数量" + ":" + i);
rec.add(table);
}
return rec;
}
/**
* ダミーのデータソースを生成する (page2用)
*
* @param idx
* 添え字
* @return 配列のデータソース
*/
private RecordType getRecord2(int idx) {
RecordType rec = new RecordType();
for (int i = 0; i <idx * 20; i++) {
HashtableType table = new HashtableType();
table.put("製品コード", "製品コード" + ":" + i);
table.put("製品名", "製品名" + ":" + i);
table.put("単価", "単価" + ":" + i);
rec.add(table);
}
return rec;
}
/**
* ダミーのデータソースを生成する (page3用)
*
* @param idx
* 添え字
* @return 配列のデータソース
*/
private RecordType getRecord3(int idx) {
RecordType rec = new RecordType();
for (int i = 0; i < idx * 20; i++) {
HashtableType table = new HashtableType();
table.put("製品コード", "製品コード" + ":" + i);
table.put("数量", "数量" + ":" + i);
table.put("金額", "金額" + ":" + i);
rec.add(table);
}
return rec;
}
}
出力結果
