【Salesforce】バッチ処理でPDFファイルを保存する

【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.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です