Showing posts with label pdf. Show all posts
Showing posts with label pdf. Show all posts

Friday, 8 January 2016

DOWNLOAD PDF'S AS ZIP FILE FROM LIST VIEW OF THE OBJECT



                 When salesforce is as easy as telling 1, 2, 3 it is also as tough as cooking Biryani(tough for bachelor's). I found it difficult when I want to download Selected Records PDF(Invoice PDF) from List view of the Object. Hopefully I solved so I thought it would be nice to help others for the same scenario. so,

HOW TO DOWNLOAD PDF'S AS ZIP FILE FROM LIST VIEW OF THE OBJECT

Here am using INVOICE object, api name is Invoice__c.
  1. First create visualforce page that render as pdf for help refer Create PDF with Salesforce
  2. (Optional) Add visualforce custom button to detail page of the record for help refer How to add Detail Page Visualforce button.
  3. Create Apex class that  returns a error messages as JSON Format
     public class DownloadInvoiceResponse {
         //Normal Status Code
          private static String API_STATUS_NORMAL = '200';
         //Error Status Code
          private static String API_STATUS_ERROR  = '400';
          // Normal JSON Response
         public static string normalJson( Object respData ) {
                Map<String, Object> response = new Map<String, Object>();
                response.put('status', API_STATUS_NORMAL);
                if( respData != null )
                response.put('data', respData);
                return json.serialize( response );
     
          }
          // Error JSON Response
         Public static String errorJson( String message ) {
                Map<String, Object> response = new Map<String, Object>();
                response.put('status', API_STATUS_ERROR );
                if( message != null )
                response.put('error', message);
                return json.serialize( response );
         }
    }

     
      4. Create a Apex class with WEBSERVICE Method to return List of pdf's as JSON format

global class DownloadInvoice
{
   private static String API_STATUS_NORMAL = '200';

   webService static string getAttachmentByParentId(string sfdcId)
    {      
         List<id> ids = new List<id>();
         if(string.isempty(sfdcId))  {
            return DownloadInvoiceResponse.errorJson('Parameter sfdcId is required.');
        }
   
        string[] idsArray = sfdcId.split(',');
        for(integer i=0; i<idsArray.size();i++)
        {
           ids.add(idsArray[i]);
        }
     
        List<Invoice__c> invList = New List<Invoice__c>();
        invList = [Select id, name, Print_Invoice__c,Account__r.name from Invoice__c where ID IN: ids];
        List<Attachment> attInsert = new List<Attachment>();
        if(invList.size() > 0){
         
            for(Invoice__c invc : invList){

//pdf file
                PageReference pdf = new PageReference('/apex/InvoicePDF?id='+invc.id);
                Attachment attach = new Attachment();
                if (attach == null) attach = new Attachment();
                Blob body;
                try {                  
                        body = pdf.getContentAsPDF();                    
                 }
                catch (VisualforceException e) {
                    String msg2 = e.getMessage();
                    return DownloadInvoiceResponse.errorJson( msg2 );
                 }
                attach.Body = body;
                attach.name= invc.name+'.PDF';
                attach.IsPrivate = false;
                attach.ParentId = invc.id;
                attach.contentType = 'application/pdf';
                attInsert.add(attach);
            }          
        }
     
        Insert attInsert;

        set<String> remainingsIdsSet=new set<String>();
        List<attachment> attachmentList = new List<attachment>();
   
          for(attachment att: attInsert) {                      
                String parentId=att.ParentId;
                remainingsIdsSet.add(parentId);                
           }
             String remainingIds=null;
             List<String> remainingIdList=new List<String>(remainingsIdsSet);
             for(integer i=0;i<remainingIdList.size();i++){
                 if(i==0){
                     remainingIds=remainingIdList.get(i);
                 }else{
                     remainingIds=remainingIds+','+remainingIdList.get(i);
                  }              
             }
           
             List<Object> dataList = new List<Object>();
             for(Attachment at :attachmentList)
             {
                Map<StringString> atMap = new Map<StringString>();
                atMap.put( 'Name', at.Name );
                atMap.put( 'Body', EncodingUtil.base64Encode( at.body ));
                datalist.add( atMap );
           
             }
             
                 Map<String, Object> response = new Map<String, Object>();
                 response.put('status', API_STATUS_NORMAL);
                 if( datalist != null ){
                     response.put('data',datalist);
                     response.put('id', remainingIds);
                 }
                 return json.serialize( response );
     }

     5. Add webservice method to save the file to Document

   webService static String saveToDocument( String zipFileData, String fileName ){
        try{
            String userId = UserInfo.getUserId();
            List<Document> docList = [SELECT Id, Name, FolderId, Body FROM Document WHERE                                                              Name = :fileName AND FolderId = :userId];
            Document doc = new Document();
            if( docList == null || docList.size() == 0 ) {
                doc.Name = fileName;
                doc.FolderId = UserInfo.getUserId();
                doc.Body = EncodingUtil.base64Decode( zipFileData );
                insert doc;
               }
            else {
                doc = docList.get(0);
                doc.Body = EncodingUtil.base64Decode( zipFileData );
                update doc;
            }
            return DownloadInvoiceResponse.normalJson( doc.Id );
        } catch ( Exception ex ) {
            return DownloadInvoiceResponse.errorJson( ex.getMessage() );
        }
    }

    5. Now Goto,

  1. View fields of the object.
  2. Scroll down to Custom Buttons, Links and Actions.
  3. Click on New.
  4. Create a new List Button. 
  5. Select Onclick Javascrip from DropDown.
  6. Now Place below Javascript that calls the webservice methods.



   {!REQUIRESCRIPT("/resource/jqueryInvoice")}
   {!REQUIRESCRIPT("/resource/JSzipfileInvoice")}
   {!REQUIRESCRIPT("/soap/ajax/30.0/connection.js")}
   {!REQUIRESCRIPT("/soap/ajax/30.0/apex.js")}

   var records = {!GetRecordIds($ObjectType.Invoice__c)};
   var newRecords = [];

   var SelectedIds='';
   var fileDatafinal;
   for(var i=0;i < records.length; i++)
   {
   SelectedIds+=records[i]+",";
   }
   SelectedIds=SelectedIds.substring(0,SelectedIds.length - 1);

   if(SelectedIds.length > 0){

   alert(' Please wait until end of the process ');
   var response = sforce.apex.execute("DownloadInvoice","getAttachmentByParentId",                                                  {sfdcId:SelectedIds});

   var respObj = JSON.parse(response);
   if( respObj['status'] != '200' )
   {
   alert( respObj['error'] );
   }
   else
   {
   var fileData = respObj['data'];
   SelectedIds=respObj['id'];
   downloadZip(fileData);
   }
   }
   else
   {
   alert('Please select atleast one record');
   }

   function downloadZip( fileData) {

   var fileName = 'Attachments.zip';
   var zip = new JSZip();
   for( var k in fileData ) {
   zip.file(fileData[k]['Name'], fileData[k]['Body'].toString(),{base64: true});
   }
   content = zip.generate();
   response = sforce.apex.execute("DownloadInvoice","saveToDocument",{zipFileData:content,                               fileName:fileName});

   var fileObj = JSON.parse(response);
   if( fileObj['status'] != '200' ) {
   alert( fileObj['error'] );
   return;
   }
   var docId = fileObj['data'];
   alert('Please confirm to download Zip file');
   window.location = '/servlet/servlet.FileDownload?file=' + docId;
   try {
   for (var n=0; n<records.length; n++){
   var sv = new sforce.SObject("Invoice__c");
   sv.id = records[n];
   newRecords.push(sv);
   }
   result = sforce.connection.update(newRecords);
   }
   catch (e) {
   alert(e);
   }
   }


   That's it Happy Downloading.
   You can download the jqueryInvoice and JSzipfileInvoice here. Click On Download


   Hope this helps you.

   See you next time. Thanks!!.

DETAIL PAGE BUTTON TO SHOW PDF FILE IN SALESFORCE

       
                    Salesforce is as easy as telling 1, 2, 3. Salesforce visualforce is allow us to create a PDF in simple keyword called renderAs
                    
HOW TO SHOW CUSTOM BUTTON THAT DISPLAYS PDF

                    Ok, lets start with creating your visualforce page that renderAs PDF and Add custom button to detail page of the object.

Am using INVOICE object  and the Api Name is Invoice__c.

1. Create Visualforce and name as InvoicePDF.vfp


     <apex:page standardController="Invoice__c"  showHeader="false" sidebar="false"                                 renderAs="PDF">

              //do what you want
              ...........
                         {!Invoice__c.Name}
              .............
             //do what you want

</apex:page>


renderAs="PDF" - This will render the visualforce page as PDF.

2. Add the Custom Button(Visualforce button named InvoicePDF.vfp) to Detail Page.(Optional)

     Goto,
  1. Invoice Object 
  2. Scroll down to Buttons, Links and Actions.
  3. Click new.
  4. Name the Button.
  5. Click on Detail Page Button.
  6. Select Visualforce Page from Dropdown. 
  7. Select InvoicePDF from the list.
  8. Click on Save and Add to PageLayout.


Recommanded : DOWNLOAD PDF'S AS ZIP FILE FROM LIST VIEW OF THE OBJECT


That's it you have done it. Hope it helps you. Thanks.

See you back. Happy Smile!!.