3.8 サンプルプログラム(3) - 複数のページレイアウトを組み合わせてPDFを生成
概要
1ページ目と2ページ目以降で異なるレイアウトの帳票を生成します。
レイアウト・デザイナガイド『10.3 サンプルレイアウト(2) - 1ページ目とそれ以降で異なるレイアウトの出力』
では、1種類のドキュメントレイアウトと1種類のページレイアウトでPDFを生成しました。
<flow-area>を用いて1ページ目だけにレイアウトヘッダを表示することで、2ページ目以降と表示が異なる帳票を生成しています。
それに対し本サンプルでは、1種類のドキュメントレイアウトと2種類のページレイアウトでPDFを生成します。
2種類のページレイアウトにそれぞれ<fo:table>を使用し、ドキュメントレイアウトで設定したデータソースを2つのページレイアウトで共有しています。
<flow-area>でもデータソースを共有することが可能ですが、後述のようにmaxrows属性、numbertablesrepeated属性は<fo:table>に存在する属性となります。
<flow-area>と<fo:table>については、XMLページレイアウトタグ リファレンス『第9章 繰り返し制御』
を参照してください。
HashtableType
1ページ目に設定する「company」のデータをHashtableType で生成します。
ここではサンプルデータ(Sample3.txt) から"=" を区切りとし、左辺の値をKEY に、右辺の値をVALUE としてHashtableType に設定しています。
RecordType
1ページ目と2ページ目以降の繰り返し表に設定するデータをRecordType で生成します。
RecordType はHashtableType が1レコード分のデータであるのに対し、複数レコードを保持するList の役割を果たします。
1ページ目のfo:tableタグに『maxrows="10"』が指定されており、これは最大行数が
10 行までということを意味します。さらに『numbertablesrepeated="
1"』と指定することで複数レコードのデータ数が『max-rows』の値を超えた場合の繰り返し回数を指定します。
従って1ページ目には10 行分の行を1回だけ作成します。
2ページ目のfo:tableには、1ページ目の続きのデータ(11レコード目以降)が続けて表示されます。
fo:tableタグに『maxrows="20"』が指定されており、さらに『numbertablesrepeated="
3"』と指定しているため、20行を3ページまで表示します。
サンプル構成
項目 | ファイルパス |
---|---|
ドキュメントレイアウトサンプル |
<biz-Stream_home>/sample/java/Sample3-doc.xml
![]() |
ページレイアウトサンプル |
<biz-Stream_home>/sample/java/Sample3-layout1.xml
![]() |
<biz-Stream_home>/sample/java/Sample3-layout2.xml
![]() |
|
ソースサンプル |
<biz-Stream_home>/sample/java/Sample3.java
![]() |
出力結果サンプル |
<biz-Stream_home>/sample/java/Sample3.pdf
![]() |
ソースサンプル
import java.io.FileNotFoundException; import java.io.IOException; 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.datatypes.StringType; import com.brainsellers.xml.fo.datasource.ResourceException; public class Sample3 { // XMLファイル名 private String xml_file = "${base-dir}/sample/java/Sample3-doc.xml"; // PDFファイル名 private String pdf_file = "${base-dir}/sample/java/Sample3.pdf"; public static void main(String argv[]) { new Sample3(); System.exit(0); } /** * コンストラクタ */ public Sample3() { // データの取得 HashtableType hashtable_data = this.getHashtableData(); RecordType record_data = this.getRecordData(); try { // (1) 入出力共にファイル名で指定する XMLSuper xml = new JaxpXML(xml_file, pdf_file); // (2) レイアウト情報(XML)の解析を行う xml.parse(); // (3) DataSourceを設定する // 帳票全体に設定する項目 xml.setDataSource("hashtable-data", hashtable_data); // 繰り返しを要する項目 xml.setDataSource("record-data", record_data); // (4) 座標計算を行う xml.calcDataSize(); // (4) PDFを生成する xml.toPDF(); // (5) PDFを出力する xml.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ResourceException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * データの取得 * * @return データを格納したHashtableType */ public HashtableType getHashtableData() { HashtableType data = new HashtableType(); data.put("company", "サンプル・レイアウト株式会社"); return data; } /** * データの取得 * * @return データを格納したRecordType */ public RecordType getRecordData() { RecordType data = new RecordType(); for (int idx = 1; idx < 40; idx++) { HashtableType hash = new HashtableType(); hash.put("製品コード", new StringType("製品コード" + idx)); hash.put("製品名", new StringType("製品名" + idx)); hash.put("数量", new StringType("" + idx * 10)); hash.put("単価", new StringType("" + idx * 100)); hash.put("金額", new StringType("" + idx * 1000)); data.add(hash); } return data; } }
出力結果
