Reflex iText Sample

基本説明 (2/3)

テンプレート構造

  • テンプレート例 (helloworld2.html)
    <?xml version="1.0" encoding="UTF-8" ?>
    <html>
    <head>
    
    <!-- linkタグにスタイルシートを指定できます -->
    <link rel="stylesheet" href="jp/reflexworks/test/template/helloworld2.css" media="all" type="text/css"></link>
    
    </head>
    <body>
    
    <div class="_page" style="pagesize:A4; orientation:portrait;">
        <table>
            <tr>
                <td>
                    <span id="greeting" class="set1" />    <!-- class属性にスタイルシートの定義を指定 -->
                </td>
            </tr>
            <tr>
                <td>
                    <span id="set2">    <!-- id属性にスタイルシートの定義を指定 -->
                       Hello World 2
                    </span>
                </td>
            </tr>
        </table>
    </div>
    
    </body>
    </html>
    
    

テンプレートの構成

  1. xmlファイルの定義
  2. <html> タグ
  3. <head> タグ ・・・ スタイルシートを定義する場合、このタグ内に指定します。
  4. <body> タグ ・・・ ページ構造を定義します。

ページ構造

  1. 基底要素

    <div class="_page">

  2. 第一レベル要素

    <table> <tr> <td>

    <div class="_rectangle">

    <div class="_line">

    <img>

    など。

    第一レベル要素はすべて左下点を基準とする絶対座標で指定することができます。

  3. 第二レベル要素

    <span>

    <div>

    <p>

    <a>

    <ul>

    <ol>

    <img>

    など。

    第二レベル要素は第一レベル要素からの相対位置座標となります。

注意点

tableタグの子要素にtableタグを指定することはできません。

ページ設定

<div class="_page">タグ(以下、pageタグとします)には、以下のような定義を行います。

ページに関する定義

  1. ページの大きさ (pagesize)
  2. ページの向き (orientation)
  3. 余白サイズ (left, right, top, bottom)
  4. ページ全体のフォント、文字色、文字サイズ (font, color, fontsize)
  5. ページ全体の罫線色 (linecolor)
  6. ページ番号、偶数ページ・奇数ページ、最終ページ (id)
  7. ページ番号を出力するかどうか (footer)

PDF文書全体に関する定義

  1. PDF文書のプロパティ情報 (title, author, subject, keywords)
  2. PDF文書の暗号化 (encryption)
  3. デジタル署名 (certificate)

    PDF文書全体に関する定義は、pageタグに指定がある場合に適用されます。複数ページに指定がある場合は上書きされるため、最後に定義したページの内容が適用されます。

ページ制御

Reflex iTextでは、エンティティに格納されているデータを元にPDFを出力します。 エンティティがListの場合はListの要素数分ページを出力します。 もしくはエンティティの項目がList1個しかなく、Listの項目名がエンティティの名称と前方一致している場合も同様に、Listの要素数分ページを出力します。 ただし、エンティティがnullの場合またはListが0件の場合は、1ページのみ出力します。

例) ページ分割するパターン

以下の例では、「page」の要素数分ページを出力します。

  • エンティティ
    public class PageList {
    
        public static List page;    // 項目がList1個で、項目名がクラス名と前方一致している
    
    }
    
    
  • XML
    <pageList>
        <page>    <!-- 2階層目の項目名が1階層目の項目名と前方一致している -->
            ・・・・・
        </page>
    
            ・・・・・
    
    </pageList>
    
    
  • JSON
    {"pageList" :
        {"page" :
            [・・・・・,
             ・・・・・
            ]
        }
    }
    
    

例) ページ分割しないパターン

以下の例では、1ページのみ出力されます。

  • エンティティ
    public class PageList {
    
        public static List pageInfo;    // 項目名がクラス名と前方一致していない
    
    }
    
    
  • XML
    <pageList>
        <pageInfo>    <!-- 2階層目の項目名が1階層目の項目名と前方一致していない -->
            ・・・・・
        </pageInfo>
    
            ・・・・・
    
    </pageList>
    
    
  • JSON
    {"pageList" :
        {"pageInfo" :
            [・・・・・,
             ・・・・・
            ]
        }
    }
    
    

このとき、どのpageタグの内容を出力するかというのを Listのインデックスとオフセット(後述)、pageタグのid属性で判断します。

id属性に指定できる内容は以下の通りです。_page-xxxのxxxに様々なバリエーションを指定できます。

  1. ページ番号

    例) _page-1, _page-2

  2. 偶数・奇数ページ

    _page-even(偶数), _page-odd(奇数)

  3. 最終ページ

    _page-last

  4. デフォルトページ

    指定なし (id属性を省略します)

  5. 固有名 ・・・ ページを構成する一部(後述)

    例) _page-header, _page-sign

ページの判定

  • ページカウンタ = Listのインデックス + オフセット

    オフセットとは、1から始まるページ調整数です。

    算出されたページカウンタは、以下の順番でテンプレートの条件にマッチするかどうかを判定します。

    1. データが最後の場合、最終ページ
    2. ページ番号
    3. 偶数・奇数ページ
    4. デフォルトページ

nodata

例えば裏面印刷を行いたい場合など、ページカウンタはカウントさせながら、データをスキップさせたい場合があります。 カレントのデータで次のページを印刷したい場合は、pageタグにnodata属性を指定します。

この属性を指定すると、ページカウンタはカウントされますが、 Listのインデックスはそのままでオフセットが加算され、次のページの処理においてカレントデータが適用されます。

ページ番号

pageタグにfooter="true"属性を定義すると、ページ下部にページ番号を表示します。

ページ番号表示では、footer="true"が定義されているページのみカウントされますので注意してください。

ページ制御サンプル

  • テンプレート (pagesample.html)
    <?xml version="1.0" encoding="UTF-8" ?>
    <html>
    <head>
    </head>
    <body>
    
    <div class="_page" id="_page-1" style="pagesize:A5; orientation:landscape; nodata; footer:true; fontsize:18;">
        <table>
            <tr>
                <td>
                    <span>
                        会社だより
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-2" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <table>
            <tr>
                <td>
                    <span>
                        会社だより 裏面
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span>
                        コラム
                    </span>
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-3" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <table>
            <tr>
                <td>
                    <span>
                        部署だより
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-4" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <table>
            <tr>
                <td>
                    <span>
                        課だより
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-last" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <table>
            <tr>
                <td>
                    <span>
                        編集後記
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    </body>
    </html>
    
    
  • エンティティ (PageList.java)
    package jp.reflexworks.test.model;
    
    import java.util.List;
    import java.util.ArrayList;
    
    public class PageList {
    
        public static List page;    // 項目がList1個で、項目名がクラス名と前方一致しているので、この要素数分ページを出力する
    
        static {
            page = new ArrayList();
    
            Page pageData = new Page();
            pageData.word = "社長からの言葉";      // 1件目
            page.add(pageData);
    
            pageData = new Page();
            pageData.word = "部長からの言葉";      // 2件目
            page.add(pageData);
    
            pageData = new Page();
            pageData.word = "編集者からのひとこと";  // 3件目
            page.add(pageData);
        }
    
    }
    
    
  • エンティティ (Page.java)
    package jp.reflexworks.test.model;
    
    public class Page {
    
        public String word;
    
    }
    
    
  • XML (pagelist.xml)
    <pageList>
        <page>    <!-- 2階層目の項目名が1階層目の項目名と前方一致しているので、2階層目の要素数分ページを出力する -->
            <word>社長からの言葉</word>
        </page>
        <page>
            <word>部長からの言葉</word>
        </page>
        <page>
            <word>編集者からのひとこと</word>
       </page>
    </pageList>
    
    
  • JSON (pagelist.json)
    {"pageList" :
        {"page" :
            [{"word" : "社長からの言葉"},
             {"word" : "部長からの言葉"},
             {"word" : "編集者からのひとこと"}
            ]
        }
    }
    
    
  • サンプル実行
  • Reflex iText 実行結果
    PageSample実行結果
  • 解説
    1. エンティティのListから1件目(インデックス(0))を取り出します。

      インデックス(0) + オフセット(1) = ページカウンタ(1) なので、id="_page-1"のページを採用します。

      nodataが指定されているので、インデックスはそのままで、オフセットを+1します。

    2. エンティティのListから1件目(インデックス(0))を取り出します。

      インデックス(0) + オフセット(2) = ページカウンタ(2) なので、id="_page-2"のページを採用します。

      インデックスを+1します。

    3. エンティティのListから2件目(インデックス(1))を取り出します。

      インデックス(1) + オフセット(2) = ページカウンタ(3) なので、id="_page-3"のページを採用します。

      インデックスを+1します。

    4. エンティティのListから3件目(インデックス(2))を取り出します。

      Listの最後のデータなので、id="_page-last"のページを採用します。

ページの再利用 (includeマクロ)

pageタグでページの一部分を定義したものを、includeマクロを使って本体のページに取り込むことができます。

id属性に名前を固定値で定義し、includeマクロ(<div class="_include">)のvalue属性に名前を指定します。

  • 注意点

    ページの一部分は、取り込む本体のページより前の行で定義しておく必要があります。 ページ制御のバリエーションで使用した名前(_page-xxx)以外を指定してください。

includeマクロサンプル

  • テンプレート (includesample.html)
    <?xml version="1.0" encoding="UTF-8" ?>
    <html>
    <head>
    </head>
    <body>
    
    <div class="_page" id="_page-logo">    <!-- 繰り返し使用する部分を定義(ページのidは「logo」になることに注意) -->
        <table cols="2">
            <tr>
                <td>
                    <img src="jp/reflexworks/test/image/vteclogo.jpg" width="100.0" height="45.0" />
                </td>
                <td>
                    <span style="size:20;">
                      【 社報 】
                    </span>
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-1" style="pagesize:A5; orientation:landscape; nodata; footer:true; fontsize:18;">
        <div class="_include" value="logo" />    <!-- id="_page-logo"の部分を再利用します -->
        <table>
            <tr>
                <td>
                    <span>
                        会社だより
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-2" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <div class="_include" value="logo" />    <!-- id="_page-logo"の部分を再利用します -->
        <table>
            <tr>
                <td>
                    <span>
                        会社だより 裏面
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span>
                        コラム
                    </span>
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-3" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <div class="_include" value="logo" />    <!-- id="_page-logo"の部分を再利用します -->
        <table>
            <tr>
                <td>
                    <span>
                        部署だより
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-4" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <div class="_include" value="logo" />    <!-- id="_page-logo"の部分を再利用します -->
        <table>
            <tr>
                <td>
                    <span>
                        課だより
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    <div class="_page" id="_page-last" style="pagesize:A5; orientation:landscape; footer:true; fontsize:18;">
        <div class="_include" value="logo" />    <!-- id="_page-logo"の部分を再利用します -->
        <table>
            <tr>
                <td>
                    <span>
                        編集後記
                    </span>
                </td>
            </tr>
            <tr>
                <td>
                    <span id="word" />
                </td>
            </tr>
        </table>
    </div>
    
    </body>
    </html>
    
    
  • エンティティ は上記 PageList.java, Page.java を使用。XMLの場合pagelist.xmlを使用。JSONの場合pagelist.jsonを使用。
  • Reflex iText 実行結果
    IncludeSample実行結果

前へ << >> 次へ