Ajouter un bouton “générer un pdf” sur un objet Salesforce

Dès qu’on débute sur Salesforce, on se rend assez vite compte qu’une fonctionnalité manque cruellement dans l’outil : la génération de documents à partir d’un ou plusieurs objets. Bien entendu, certains éditeurs l’ont bien compris et vous aurez dans l’Appexchange un choix assez large d’outil de ce type. La plupart permettent l’édition de documents en pdf ou word que l’objet soit standard ou custom, l’envoi par mail directement de la plateforme, l’enregistrement immédiat du document en “Notes et Pièces jointes”…. Personnellement, j’ai une préférence pour un éditeur en particulier.

Mais, dans le cas de figure où vous n’avez pas forcément besoin de ces fonctionnalités, et que surtout, vous ne souhaitez payer un abonnement supplémentaire, je vous propose un tutoriel très simple à mettre en place. Il vous permettra de générer un document pdf avec des champs présélectionnés.

<apex:page standardController="Order" 
renderAs="pdf"
    applyBodyTag="false"
    sidebar="false">
    <head>
                <style type="text/css" media="print" height="2cm">
                       @page {
                                 @top-center {
                                       content: element(header);
                               }
                               @bottom-left {
                                     content: element(footer);
                               }
                            }
                                     div.header {
                                      padding: 5px;
                                      position: running(header);
                           }
                       div.footer {
                                display: block;
                             padding: 2px;
                               position: running(footer);
                      }
                                     .pagenumber:before {
                                        content: counter(page);
                       }
                                   .pagecount:before {
                             content: counter(pages);
                        }
                                             </style>
                    
              </head>


<!-- Ref de commande en en-tête et numéro de page en pied-->
           <div class="header">
              <div>Ref {!Order.OrderNumber} </div>
           </div>
           <div class="footer">
                <div><span class="pagenumber"/> / <span class="pagecount"/></div>
          </div>
          <div class="content">
               <p></p>
          </div>
          
<!-- Références de la commande-->
          <table>
          
          <!-- Infos Raison Sociale-->
            <tr><TD width="50%">
                    Temps Additionnel Voyages
                    <br />195 Chemin de Neyron 
                    <br />69140 Rillieux La Pape
                 </td>
                 <TD width="30%">
                 </td>
                                            
          <!-- Infos Client -->
                <TD width="20%">
                <apex:outputText value="{!Order.Account.Name}"/>
                <br /><apex:outputText value="{!Order.Account.BillingStreet}"/>
                <br /><apex:outputText value="{!Order.Account.BillingPostalCode} {!Order.Account.BillingCity}"/>
                <br /><apex:outputText value="{!Order.Account.Mail__c}"/>
                        
                    </td></TR>
                 <tr>                
                <td>&nbsp;</td>
            </tr><tr>                
                <td>&nbsp;</td>
            </tr><tr>                
                <td>&nbsp;</td>
            </tr>
                    
         <!-- Numéro et Date de commande -->
                 <tr><td colspan="3"><CENTER>
                                               <h2> Commande N° {!Order.OrderNumber} </h2>
                                             Date de commande :&nbsp;
                        <apex:outputText value="{0,date,dd'/'MM'/'yyyy}">
                            <apex:param value="{!order.EffectiveDate}" />
                        </apex:outputText>
                                      </center> </td></tr>
            </table>
            
            <br />
            <br />
            
<!-- Commentaire - n'apparait que si le champs Description est rempli-->
            <tr>                
                <td>&nbsp;</td>
            </tr>
            <tr>
                <td class="vtop borderOff" style="width:80%"> 
                <apex:outputPanel rendered="{!NOT(ISBLANK(Order.Description))}" layout="none"><b>Commentaires : </b><apex:outputText value="{!Order.Description}"/></apex:outputPanel>
   </td></tr>
   <tr>
   
            
<!-- Lignes de commande -->
               <td class="vtop" colspan="2">
                    <br />
                    
               <table width="650px" border="1" cellspacing="0" style = "fontweight:bold"> 
              
                     <tr>
                            <th align="center">
                                Nom du produit
                            </tH>
                           <th align="center">
                               {!$ObjectType.OrderItem.Fields.Quantity.Label}
                            </tH>
                            <th align="center">
                                {!$ObjectType.OrderItem.Fields.Unitprice.Label}
                            </tH>
                            <th align="center">
                                {!$ObjectType.OrderItem.Fields.Totalprice.Label}
                            </tH>
                           
                        </tr>
                        
                         
            <!-- Pour chaque ligne de commande -->
                    <apex:repeat value="{!Order.OrderItems}"
                                var="ligne" >
                          <tr>                         
                                    <td align="left">
                                        <apex:outputField value="{!ligne.Nom__c}"/>
                                        </td>
                                    <td align="center">
                                        <apex:outputField value="{!ligne.Quantity}"/>
                                    </td>
                                    <td align="center">
                                        <apex:outputField value="{!ligne.UnitPrice}"/>
                                    </td>
                                    <td align="center">
                                        <apex:outputField value="{!ligne.TotalPrice}"/>
                                    </td>
                          </tr>
                     </apex:repeat>
                             
           
           <!-- total -->
                         <tr>
                            <td class="borderOff" ></td>
                            <td colspan="2">
                                          
                            {!$ObjectType.Order.Fields.TotalAmount.Label}
                            </td>
                            <td align="center"  >
                            <apex:outputField value="{!Order.TotalAmount}"/>
                             </td>  
                        </tr>
                        </table>
                        </td>
            </tr>
            
            <!-- signature -->
            
            <br />
            <br />
            Nom et signature
            
             
</apex:page>

Cette page Visualforce est adaptée à l’objet “Commande”. Si vous souhaitez la mettre en place pour un autre objet, il vous suffit de remplacer tous les termes en bleu par le nom API de l’objet en question et de l’objet enfant/parent (OrderItem dans l’exemple) et ceux en orange par les champs que vous désirez faire remonter (Attention, si ce sont des champs custom, ne pas oubliez de rajouter __c à la fin).

Modèle de fichier pdf obtenu :

Leave a Reply