biz-StreamマニュアルPDF出力ガイド第3章 サンプルプログラム3.8 サンプルプログラム(3) - 複数のページレイアウトを組み合わせてPDFを生成

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ページまで表示します。



ソースサンプル

  • default_value.propertiesで定義している変数${base-dir}は、biz-StreamのAPIだけが認識できる変数です。 以下のサンプルではJaxpXMLというbiz-Streamのクラスに対して${base-dir}を引数として指定しています。 biz-StreamのAPI以外では${base-dir}を認識いたしませんのでご注意ください。

ソースサンプル<biz-Stream_home>/sample/java/Sample3.java サンプル3

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

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";
    // データファイル名
    private String data_file = "C:/Program Files (x86)/brainsellers/biz-Stream 5.0.0/sample/java/Sample3.txt";

    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();
        if (this.data_file == null) {
            return data;
        }
        String strline = null;
        try {
            BufferedReader br = new BufferedReader(new FileReader(this.data_file));
            while ((strline = br.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(strline, "=");
                String token1;
                try {
                    token1 = st.nextToken();
                } catch (NoSuchElementException e) {
                    token1 = "";
                }
                StringType token2;
                try {
                    token2 = new StringType(st.nextToken());
                } catch (NoSuchElementException e) {
                    token2 = new StringType("");
                }
                data.put(token1, token2);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        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;
    }
}


出力結果

生成されるPDF <biz-Stream_home>/sample/java/Sample3.pdf サンプル3

サンプル3