はじめに
SalesforceでPDF出力機能実装時に、表の指定の行数や条件で改ページしたいという要望があり、その際に実装した方法を備忘録として記録する。
前提
・表を出力する際に、指定の行数や条件で改ページする場合を想定する。
・本記事では、下記の赤字箇所の実装方法について記載する。
目次
1. 出力データ整形(Apexクラス)
2. PDFデータ作成(Visualforce)
1. 出力データ整形(Apexクラス)
1-1. 改ページ設定用の項目を定義
出力データ用カスタムクラスに、改ページ設定用の項目を追加する。
pdfOutput.cls
// 改ページ設定+明細リスト カスタムクラス
public class PdfList {
public String NewPageSetting {get; set;} //改ページ設定
public List<Data__c> DataList {get; set;} //明細リスト
}
1-2. 出力データ整形
出力データ整形時に、改ページしたいデータリストの改ページ項目に「page-break」を設定する。
下記ソースコードの例では、30レコード毎に改ページ設定を行っている。
pdfOutput.cls
public void getDataList() {
Integer maxDataNum = 30; //1ページ当りの最大行数
Integer dataCount = 0; // データ件数カウント
List<Data__c> lstData = new List<Data__c>();
List<Data__c> lstTmpData = new List<Data__c>();
List<PdfList> lstPdf = new List<PdfList>();
PdfList pdf = new PdfList();
// 明細リストを取得
String strQuery;
strQuery = 'SELECT Id,Name ';
strQuery += 'FROM Data__c ';
strQuery += 'ORDER BY Id';
lstData = Database.Query(strQuery);
// 明細リスト分ループしてページごとにリストを分割
for (Data__c datac :lstData) {
dataCount++;
lstTmpData.add(datac);
// 1ページの最大行数の場合
if (dataCount == maxDataNum) {
// ★★★改ページ設定★★★ +1ページ分のデータを取得
pdf.NewPageSetting = 'page-break';
pdf.DataList = lstTmpData;
lstPdf.add(pdf);
// 初期化
dataCount = 0;
lstTmpData = new List<Data__c>();
}
}
// 最終ページの処理
if (dataCount != 0) {
// ★★★改ページ設定★★★ +明細リスト(1ページ分)を取得
pdf.NewPageSetting = 'page-break';
pdf.DataList = lstTmpData;
lstPdf.add(pdf);
}
// 1ページ目の改ページ設定をクリア
lstPdf[0].NewPageSetting = '';
this.lstPdfOutput = lstPdf;
}
2. PDFデータ作成(Visualforce)
データリスト毎、明細リスト毎にループを行い、出力データを設定する。
その際、改ページ項目の内容に応じて、改ページを行う。
pdfOutput.page
<apex:page controller="pdfOutput" renderAs="pdf" applyhtmltag="false" showheader="false" cache="false">
<head>
<style>
#ページ設定は割愛
#改ページclass
.page-break {
page-break-after:always;
}
</style>
</head>
<body>
<!-- ページ毎ループ -->
<apex:repeat var="lpo" value="{!lstPdfOutput}">
<!-- ★★★改ページ★★★ -->
<p class="{!lpo.NewPageSetting}"/>
<!-- 一覧 -->
<table>
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
</tr>
</thead>
<tbody>
<!-- レコード毎ループ -->
<apex:repeat var="dl" value="{!lpo.DataList}">
<tr>
<td>{!dl.Id}</td>
<td>{!dl.Name}</td>
</tr>
</apex:repeat>
</tbody>
</table>
</apex:repeat>
</body>
</apex:page>