2014年10月14日火曜日

【ウランバ機能紹介!】請求書一括出力機能の技術的実装方法紹介

ウランバで複数ページのPDFの出力はVisualforceで行っています。
PDFを作成する際に必要なもの:
Visualforceのapex:pageタグのrenderAsにpdfを指定してPDFを出力すると、VisualforceがPDFとしてレンダリングされます。
この際に、印刷用のスタイルシートが使えます。

ウランバで使用しているのは、@pageセレクタとpage-break-beforeです。
@pageセレクタは印刷時のページ設定を行うセレクタで、sizeで紙の縦横の大きさをインチ単位等で指定できます(ウランバではA4にしています)。
page-break-beforeは印刷時の改ページ設定で、alwaysに設定すると、その要素を表示する際に常に改ページするようになります。
これらのタグを使用してPDFの形を整えます。

実装するときの考え方:
ウランバで出しているような、請求書等の帳票類は基本的に、常に出すヘッダ・ヘッダ・本文・フッタ・常に出すフッタの5つに分かれています。
常に出すヘッダとヘッダの違いは、常に出すヘッダは全てのページに出すのに対して、ヘッダは最初のページにだけ出すという事です。
常に出すフッタとフッタの違いも同様に、全てのページに出すが出さないかの違いです。
本文は何行もあるリストの形をとります(例えば、請求書なら請求品目のリスト)
Visualforceのapex:repeatタグをネストさせてテンプレートを作ると、下記のようになります
<apex:repeat> // <- ページ単位のリピート
  <div> // <- ここにpage-break-beforeをつけて改ページする
    <div> // <- 常に出すヘッダ
    </div>
    <div> // <- ヘッダ。JSPと違いifタグが無い為、必要の無いページではスタイルシートでdisplay:noneとして消す
    </div>
    <apex:repeat> // <- 本文のリピート。あらかじめ何行分入るか計算しておき、1ページに入る分だけリストに入れておく
      <div> // <- 本文(1行分)
      </div>
    </apex:repeat>
    <div> // フッタ。JSPと違いifタグが無い為、必要の無いページではスタイルシートでdisplay:noneとして消す
    </div>
    <div> // 常に出すフッタ
    </div>
  </div>
</apex:repeat>
複数の請求書を出す場合、もう一段階、請求書単位でのリピートをします
コントローラ側は請求書・ページ・本文の行のクラスをVisualforceの表示内容に沿って実装します。

松本隆志
2014/10/10

0 件のコメント:

コメントを投稿