Problem: System.VisualforceException: Getting content from within triggers is currently not supported.

Description: This Visualforce exception occurs when we use getContent method in the trigger of sobject.

Here is the code for which we got this exception:

Trigger code:

trigger updateStatus on sobject (before update) {
  List List = new  List();
  for(sobject term : Trigger.new){
    sobject oldOpp = Trigger.oldMap.get(term.Id);
    if(term.Payment_Status__c =='Paid'){
      Messaging.SingleEmailMessage emailTobeSent = new Messaging.SingleEmailMessage();
      PageReference pdf =  Page.templateCOI; //Replace attachmentPDF with the page you have rendered as PDF
      pdf.getParameters().put('Id',term.Id);
      pdf.setRedirect(true);
      Attachment attach = new Attachment();
      Blob b;
      b = pdf.getContent();// Exception: Getting content from within triggers is currently not supported
      attach.Body = b;
      attach.Name = 'name';
      attach.IsPrivate = false;
      attach.ParentId = term.Id;
      insert attach;
      Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment();
      efa.setFileName('Confirmation of Insurance.pdf');
      efa.setBody(b);
      List  listEmailMembers = new List();
      listEmailMembers.add(Email);
      emailTobeSent.setToAddresses(listEmailMembers);
      emailTobeSent.setSubject('Subject');
      emailTobeSent.setHtmlBody('body');
      emailTobeSent.setFileAttachments(new Messaging.EmailFileAttachment[] {efa}); // Sends the email
      Messaging.SendEmailResult [] r1 = Messaging.sendEmail(new   Messaging.SingleEmailMessage[] {emailTobeSent});
    }
  }
}

Solution: To resolve this exception, we need to use getContent method in apex class with future method.

Here is the code for this:

Trigger code:
trigger updateStatus on sobject (before update) {
  List List = new  List();
  for(sobject term : Trigger.new){
  sobject oldOpp = Trigger.oldMap.get(term.Id);
  if(term.Payment_Status__c =='Paid'){
  sendPDFEmail.sendPDF(term.Id,term.Email__c);
  }
  }
}

Apex Class code:

Public class sendPDFEmail{
@future
public static void sendPDF(String Id,String Email){
  Messaging.SingleEmailMessage emailTobeSent = new Messaging.SingleEmailMessage();
  PageReference pdf =  Page.templateCOI;
  pdf.getParameters().put('Id',Id);
  pdf.setRedirect(true);
  Attachment attach = new Attachment();
  Blob b ;
  b = pdf.getContent();
  attach.Body = b;
  attach.Name = 'name';
  attach.IsPrivate = false;
  attach.ParentId = Id;
  insert attach;
  Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment();
  efa.setFileName('Confirmation of Insurance.pdf');
  efa.setBody(b);
  List  listEmailMembers = new List();
  listEmailMembers.add(Email);
  emailTobeSent.setToAddresses(listEmailMembers);
  emailTobeSent.setSubject(‘subject’');
  emailTobeSent.setHtmlBody('body');
  emailTobeSent.setFileAttachments(new Messaging.EmailFileAttachment[] {efa});           
  Messaging.SendEmailResult [] r1 = Messaging.sendEmail(new Messaging.SingleEmailMessage[] {emailTobeSent});
}
}