【Salesforce】バッチ処理でPDFファイルを保存する
Sallesforceから請求書を発行したい場合、月末処理で作成してSalesforce上に保存したい場合があります。
Apexのバッチ処理によって月末にまとめてPDFを作成する方法をメモします。
事前に保存するPDF帳票を作成する必要があります。
テスト用に取引先の情報を表示するだけのPDF用ページを作成します。
<apex:page id="Page" standardController="Account" standardStylesheets="false" showHeader="false" sidebar="false" applyHtmlTag="false" > <head> <style> @page { size: 8.27in 11.69in; padding: 0; } body { font-family: Arial Unicode MS; font-size: 10pt; text-align: left; } </style> </head> <body> <apex:form id="Form"> <apex:pageblock > <apex:pageBlockSection title="取引先情報" columns="2"> <apex:pageBlockSectionItem > <apex:outputlabel for="Name" value="取引先名" /> <apex:outputfield id="Name" value="{!Account.Name}" /> </apex:pageBlockSectionItem> <apex:pageBlockSectionItem ></apex:pageBlockSectionItem> <apex:pageBlockSectionItem > <apex:outputlabel for="Fax" value="fax" /> <apex:outputfield id="Fax" value="{!Account.Fax}" /> </apex:pageBlockSectionItem> <apex:pageBlockSectionItem > <apex:outputlabel for="Phone" value="電話番号" /> <apex:outputfield id="Phone" value="{!Account.Phone}" /> </apex:pageBlockSectionItem> </apex:pageBlockSection> </apex:pageblock> </apex:form> </body> </apex:page>
今回はコントローラのクラスを指定していませんが、もちろん指定したページでも大丈夫です。
PDFにするため、PDFで日本語が表示できる形式のページにする必要があります。
バッチ処理クラスです。
/** * 取引先を表示したページをPDFにするバッチ */ global class CreatePDFBatch implements Database.Batchable<sObject> { /** * 前処理 * 取引先レコードを取得する */ global Database.QueryLocator start(Database.BatchableContext BC){ String query; try{ // カスタム設定取得用 query = ' '; query += ' select '; query += ' Id, '; query += ' Name'; query += ' from '; query += ' Account '; }catch(Exception e){ system.debug('【エラー】' + e.getMessage()); system.debug('【エラー】' + e.getStackTraceString()); } return Database.getQueryLocator(query); } /** * 実処理 * 取引先を元にPDFを作成する */ global void execute(Database.BatchableContext BC, List<Account> accountList){ List<Attachment> attachmentList; String fileNameTemplate; try{ // ファイル名のテンプレートを作成する fileNameTemplate = '_' + Date.today().Month() + '月.pdf'; // 添付ファイルリストを作成する attachmentList = new List<Attachment>(); // 取得した取引先のIDからPDFを作成する for(Account acc : accountList){ Attachment tmpAttachment; PageReference pr; // PDFにするページを作成する pr = Page.AccoutView; pr.getParameters().put('id', acc.Id); // 添付ファイルを作成する tmpAttachment = new Attachment(); tmpAttachment.Name = acc.Name + fileNameTemplate; tmpAttachment.ParentId = acc.Id; tmpAttachment.Body = pr.getContentAsPDF(); // リストに追加する attachmentList.add(tmpAttachment); } // 添付ファイルを保存する insert attachmentList; }catch(Exception e){ system.debug('【エラー】' + e.getMessage()); system.debug('【エラー】' + e.getStackTraceString()); } } /** * 終了処理 * 特に何もしない */ global void finish(Database.BatchableContext BC){} }
すべての取引先を取得しています。
Page.AccoutViewで上で作成したVisualforceのページを取得し、取引先のIDを指定しています。
作成したPageReferenceのインスタンスの「getContentAsPDF」メソッドを使用することで、PDFファイルのBodyを取得できます。
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/apex_System_PageReference_methods.htm
添付ファイルの親を取引先に指定してInsertしています。
一応、スケジューラのクラスも記述します。
/** * 取引先の情報を表示したPDFを作成するバッチのスケジューラ */ global class CreatePDFBatchScheduler implements Schedulable { global void execute(SchedulableContext sc) { CreatePDFBatch batch = new CreatePDFBatch(); // バッチ呼び出し database.executebatch(batch, 200); } }
バッチサイズを200に指定していますが、PDFファイルにする対象のページが大きい場合はエラーが出る可能性があります。
エラーが出る場合はバッチサイズを下げて処理を行いましょう。
既に帳票用のVisualforceページが存在する場合はバッチ処理を作成するだけなので、すぐに作ることが出来そうですね。
ちなみに、作成したPDFファイルはドキュメントに保存することもできるので、そのあたりはお好みです。
今回は分かりやすいように取引先の添付ファイルに設定しました。
No comments.