May 28, 2022

Generate PDF in Salesforce For free without any app (2022)

Generate PDF in Salesforce

In every business generating PDF files from invoices, bills, articles, reports, etc. is necessary. As a PDF (portable document file), we can keep it offline for later consumption instead of viewing the same detail using the network.

In this post, we will explain how to Generate PDF in Salesforce on button click. In this implementation, we will show Generate PDF button in Salesforce on the Account details page. After clicking a button, a PDF will be generated.

Salesforce has in-build PDF generation tool, that can generate PDF document dynamically without using any third party app. Later generated PDF can be saved as File on Salesforce Record or can be sent via Email.

Steps to generate pdf in Salesforce

  1. Create a Static Resource (optional)
  2. Create a VF page
  3. Create a button to Generate PDF

What you need before start

  1. Your Company Logo image (PNG/JPEG) : Logo will appear on top of generated PDF
  2. Working Salesforce Org

Let's Start generating pdf in Salesforce

Create a Static Resource for your company logo:

To create a static resource:

  1. From Setup, enter Static Resources in the Quick Find box, then select Static Resources.
  2. Click New.
  3. In the Name text box, enter the text "companyLogo".
  4. Next to the File text box, click Browse to navigate to a local copy of your Company Logo.
  5. Set the Cache Control to public.
  6. Click Save.
create static resource

Create a Visualforce Page:

VFPage

To create Visualforce pages :

  1. From Setup, enter Visualforce Pages in the Quick Find box, then select Visualforce Pages.
  2. Click New.
  3. In the Label text box, enter the text "MyFirstPDF". (The same name will be entered into the name)
  4. Copy and paste the below code
  5. Click Quick Save to save your changes and continue editing your page. Your Visualforce markup must be valid before you can save your page.
<apex:page id="MyFirstPDF" standardController="Account" renderAs="pdf">
    <body>
        
         <div class="" style="min-height: 2in;">
            <!-- SECTION: header w/ company address and logo -->
            <table class="header-table">
                <tr>
                    <td style="width: 75%">
                        <apex:image width="2.75in" url="{!$Resource.companyLogo}"/>
                    </td>
                    <td style="">
                        <table style="width: 2.8in;border: solid 1px black; border-collapse: separate; ">
                            <tr>
                                <td style="text-align: center; font-size: 16pt; font-weight: bold; border-bottom: solid 1px black"
                                    colspan="2">Invoice Summary
                                </td>
                            </tr>

                            <tr>
                                <td>&nbsp;&nbsp;Date:</td>
                                <td style="text-align:right;"> 
       								{!DAY(TODAY())}-{!MONTH(TODAY())}-{!YEAR(TODAY())}&nbsp;&nbsp;
                                </td>
                            </tr>
                            <tr>
                                <td>&nbsp;&nbsp;Account:</td>
                                <td style="text-align:right;">Jack-Rich&nbsp;&nbsp;</td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </table>
        </div>
        <table >
            <tr>
                <td >Address:</td>
                <table Style="padding-left: 90px;">
                    <tr>
                        <td>
                            Jack-Rich
                        </td>
                    </tr>                       
                    <tr>
                        <td>
                            1704 Weeksville Road
                        </td>
                    </tr>
                    <tr> 
                        <td>
                           Elizabeth City, 27909
                        </td>
                    </tr>                     
                </table>
            </tr>
        </table>
        <br/>
        <br/>
        <br/>
        <div style="min-height: 5.7in;">
            <table style="width: 100%;">
                 <tr>
                    <th>Date</th>
                    <th>Billing</th>
                    <th>Email</th>                    
                    <th style="text-align:right;">Paid Amount</th>
                    <th style="text-align:right;">Due Amount</th>
                    <th style="text-align:right;">Total Amount</th>
                  </tr>
                  <tr>
                    <td>01-01-2022</td>
                    <td>000001</td>
                    <td>example@gmail.com</td>                  
                    <td style="text-align: right;">$1000</td>
                    <td style="text-align: right;">$9000</td>
                    <td style="text-align: right;">$10000</td>
                  </tr>
                  <tr>
                    <td>04-01-2022</td>
                    <td>000002</td>
                    <td>example1@gmail.com</td>                   
                    <td style="text-align: right;">$2500</td>
                    <td style="text-align: right;">$8500</td>
                    <td style="text-align: right;">$11000</td>
                  </tr>
                  <tr>
                    <td>11-02-2020</td>
                    <td>000003</td>
                    <td>example2@gmail.com</td>                   
                    <td style="text-align: right;">$4000</td>
                    <td style="text-align: right;">$8000</td>
                    <td style="text-align: right;">$12000</td>
                  </tr>
                <tr>
                    <td>17-03-2020</td>
                    <td>000004</td>
                    <td>example3@gmail.com</td>                    
                    <td style="text-align: right;">$4400</td>
                    <td style="text-align: right;">$6000</td>
                    <td style="text-align: right;">$10400</td>
                  </tr>
                <tr>
                    <td>09-04-2020</td>
                    <td>000005</td>
                    <td>example4@gmail.com</td>                 
                    <td style="text-align: right;">$7000</td>
                    <td style="text-align: right;">$2000</td>
                    <td style="text-align: right;">$9000</td>
                  </tr>
                <tr>
                    <td><b>Total</b></td>
                    <td></td>
                    <td></td>
                    <td style="text-align: right;"><b>$19300</b></td>
                    <td style="text-align: right;"><b>$33500</b></td>
                    <td style="text-align: right;"><b>$51400</b></td>
                  </tr>
             </table>
         </div>   
      	 <div class="footer" style="">
         <hr/>
            <table align="center" style="width: 100%;">   
                <tr>
                    <td colspan="2" style="font-size: 10pt; color: green;">
                        <table style="width: 100%; border-collapse: collapse; border: 1px solid black; ">
                            <tr>
                                <td style="text-align: left;">Arrify</td>                         
                                <td style="text-align: right;">www.arrify.com</td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </table>      
       </div>
    </body>
</apex:page>

Create a Detail Page Button on the Account to generate PDF:

To Create a Button on Account

CreateVFButton 1 1
  1. From Setup, click Object Manager, then click Account.
  2. Click Buttons, Links, and Actions, then click New Button or Link.
  3. Name the button "Generate PDF".
  4. Select Detail Page Button.
  5. Set Content Source "Visualforce Page"
  6. Select content "MyFirstPDF"
  7. Click Save, then click OK. Now add it to the Account page layout.
  8. Click Page Layouts, then click Account Layout.
  9. From the Buttons category in the palette, drag "Generate PDF" into the Custom Buttons area on the page layout.
  10. Click Save. OK! Now let’s test it.
  11. From the App Launcher, find and select Sales, then click the Accounts tab.
  12. Open an account record.
  13. In the highlights panel, not only do you see the fields from the object’s compact layout, but you also see an actions menu. The actions menu is a combination of the standard buttons, custom buttons, and actions from the page layout.
  14. Expand the actions menu, and select Generate PDF. The browser opens a new window or tab that shows you the PDF. 

Fonts supported By Salesforce PDF Generation

Visualforce PDF rendering supports a limited set of fonts. To ensure that PDF output renders as you expect, use the supported font names. For each typeface, the first font-family name listed is recommended.

Typefacefont-family Values
Arial Unicode MSArial Unicode MS
Helveticasans-serif, SansSerif, Dialog
Timesserif Times
Couriermonospace Courier Monospaced DialogInput
Supported fonts - Salesforce PDF Generation
  • These rules apply to server-side PDF rendering. Viewing pages in a web browser can have different results.
  • Text styled with a value not listed here uses Times. For example, if you use the word “Helvetica,” it renders as Times because that’s not a supported value for the Helvetica font. We recommend using “sans-serif”.
  • Arial Unicode MS is the only multibyte font available. It’s the only font that provides support for the extended character sets of languages that don’t use the Latin character set.
  • Arial Unicode MS doesn’t support bold or italic.
  • Web fonts aren’t supported when the page is rendered as a PDF file. You can use web fonts in your Visualforce pages when they’re rendered normally.

Custom Code vs Third-Party Apps for PDF generation

Parameter Custom Code S-Docs PDF Butler
Setup Cost $250 - $400 (Based on document) $200 $160
Subscription Cost
(For 10 Users)
$0 $125/Month*
(*Anual Contract)
$140/Month
Speed Fastest Moderate Slow
Security Most Secure
(No external service)
Moderate Depends on Their Server
Updates Not Needed Need to install update in every release

Salesforce PDF Generation Limits:

  • The maximum response size when creating a PDF file must be less than 15 MB before being rendered as a PDF file. This limit is the standard limit for all Visualforce requests.
  • The maximum file size for a generated PDF file is 60 MB.
  • The maximum total size of all images included in a generated PDF is 30 MB.
  • PDF rendering doesn’t support JavaScript-rendered content.
  • Rendering a Visualforce page as a PDF file is intended for pages designed and optimized for print.

Generate PDF Using Third-Party App:

There are multiple apps that can generate PDFs in Salesforce. Most of them are paid and pull data from Salesforce to their server and output will be pushed back to Salesforce. This method took some extra time compared to native Salesforce PDF generation. Also, there are some data security issues.

Top apps on app exchange:

Conga Composer

Tag line: Efficiently create and manage your documents in Salesforce

Pricing: Starting from $200/month ($20/user/month with 10 minimum users required)


Sdocs

Tag Line: Native Document Generation & E-Signature: PDF, Word, XLS, Email, Reports

Pricing: Starting from $1500/Year (1-10 Users $1,500)

Frequently Asked Questions (FAQs)

Can Salesforce generate PDF in Lightning?

PDF in salesforce can be generated easily without using any other app. That can work in Salesforce Lightning as well as Salesforce Classic.

What does it cost to generate PDF in Salesforce?

Cost depends on how you generate PDF. By using a third-party app there will be a monthly cost (per user based) along with the initial setup cost. By using visualforce, it's completely free from monthly cost, it requires initial setup only.

Conclusion

Generating a PDF within Salesforce can be done with VisualForce and Apex. It is very easy (even for those with very little VisualForce and Apex experience). You are able to generate any Salesforce page as a PDF by adding the renderAs attribute to the component, and specifying “pdf” as the rendering service.

We first need to create a Visualforce page that will have the PDF Content. Below is the simple Visualforce page that will display Account details with the help of the Account Standard Controller.

Official document about visualforce