logo

サイト内検索
ココログ最強検索 by 暴想

最近のトラックバック

無料ブログはココログ

« Facebook APIで出来ない事:Pageによる他のPageへの投稿 | トップページ | VisualForcePDFの改ページについて_2:ページラッパー制御編 »

VisualForcePDFの改ページについて_1:基本編

全国三千万…もいるかは分かりませんが、SFDC技術者の皆様、こんにちは。

SalesForceを利用したシステム構築をするとき、帳票作成に躓いてはいませんか?
実はSalesForce、HTMLをPDFに変換する機能が標準で組み込まれています。

とりあえず<apex:page>タグに、「renderAs="pdf"」とつけてみましょう。


<普通のVisualForce画面>
Kihon1before

<renderAs="pdf"を設定>
Kihon1after

わおすごい、何の変哲もないHTMLがいとも簡単にPDF化することが出来ました!!

おしまい。


……だったらとてもとても幸せなのですが、事はそう上手くは行きません。

理由は実際に見たほうが早いでしょう。
以下のDIV要素を、該当のVisualForceに貼りつけて保存してください。

<div style="height:1200px; border:1px solid black; background-color:#ccccff;" />

するとこのようになります。
Kihon2break

Divが底を突き抜けて、次のページまで貫いてしまいました。

1ページに収まらなかった分は上手いこと改ページしてくれないのです。
また厳密なHeight調整もかなり難しい上ほぼ不可能です。

つまりrenderAs="pdf"だけでは、1ページ帳票しかPDF化を保証してくれません。

実際利用するなら…
Kihon3risoukei

こんな形が理想型なのですが、これでは諦めるしか…。




と、嘆いていたのも昔の話。

先日以下のような情報が米SalesForceに投稿されました。
Creating Professional PDF Documents with CSS and Visualforce

簡単にいえば『VisualForcePDFを改ページ表示できた!』というもの。
今回はこれについて、掻い摘んで説明してみようと思います。

※基本的に上記リンクに描いてあることを噛み砕んでいる物です。







さて、上記リンクのソースを利用すると概ね次のような表現ができると思います。
Ws000006






これはスタイルシート『page-break-after:always;』によるものです。

PDFにこれを仕込むと、仕込んだ要素直後に空白のページが1つ出来ます。
Ws000001






ではこの空白部分に再度『page-break-after:always;』を当てはめていけば・・・?
最終的に次のようになります。
Ws000002






これが改ページの基本的考え方です。

ただし改ページするのはpage-break-after:always;が指定された要素の直後です。
つまり1ページの表示データが、1ページのHeightを上回る形で1ページを表現すると…
Ws000003






このようになります。
page-break-after:always;要素直後に空白のページが1つ出来るのであって、
はみ出したページを自動的に改ページするものではありません。

なので1ページに収める実装は、自ら行う必要があります。

これらは指示通り、1ページあたりのレコード表示数を事前に限定することで可能としています。




ちなみに最後ページの空白を消す方法は2パターンあります。
  1.最後のページだけpage-break-after:always;を適用しない
  2.最後のページだけpage-break-afterを always から avoid に設定する。

どちらにしろ『最後のページに』というのが肝になります。




===========================ー
さて実際にデータを作る場合、そのレコードの構成は List<List<SObject>> となります。
これは…

  List<SObject>は実データのリスト。1ページあたりの表示データ
  List<List<SObject>>はページのリスト。Addされるのは1ページのデータ=List<SObject>。

という形になっています。

検索後1ページあたりの表示件数で検索結果をList<SObject>に切り出し、
これを集めたものを画面上に表示します。

また先述のとおり1ページ当たりの表示件数は自身で調整し、
画面からはみ出さないようにしましょう。






VisualForceは上記リストを利用するため、ループ系を2重に設置します。

ソース例

<apex:repeat value="List<List<SObject>>" var="List<SObject>">
    <div style="page-break-after:always;">
        ~ヘッダーが必要な場合はここに記述~
        <apex:pageBlockTable value="List<SObject>" var="SObjcect">
            ~実装~
        </apex:pageBlockTable>
    </div>
</apex:repeat>

基本形はこのようになります。



では良きSalesForceライフを。

« Facebook APIで出来ない事:Pageによる他のPageへの投稿 | トップページ | VisualForcePDFの改ページについて_2:ページラッパー制御編 »

Salesforce」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1482716/40695492

この記事へのトラックバック一覧です: VisualForcePDFの改ページについて_1:基本編:

« Facebook APIで出来ない事:Pageによる他のPageへの投稿 | トップページ | VisualForcePDFの改ページについて_2:ページラッパー制御編 »