In this step-by-step guide, we’ll briefly see steps on how to add text to PDF in Salesforce Apex using PDF.co. Initially, we’ll go through all the basic steps on salesforce integration. Later we’ll also see the code and demo video. Let’s get started!

Step by step guide:

1. Create two remote site settings in the Salesforce Org like below.


Please note that the URL is “https://api.pdf.co”.


Please note that the URL is “https://pdf-temp-files.s3.amazonaws.com”.

2. Create an apex class in Salesforce like below and paste the code there. Once you log in to the Salesforce org, you will see the screen like below and click on “Developer Console”.

Create an apex class. For this, click on “Files” then “New” then “Apex Class”.

Write the class name “Program” and click “Ok”. Now copy the Program file code in this file.
Similarly, create a new file with the name “ProgramTest” and copy the code.

3. In the Program file, please add the PDF.co API key by replacing the ‘”*****************************************’;.

4. To Verify the code, please open the execute Anonymous window and call the method like below.

Then Click on “Execute”.

5. Now, Search Files from the “App Launcher”.

You will see the resulting PDF file there.

Source Code Files:

AddTextToTheExistingPDF.cls

public class Program {
    
    public static void fetchDataAndCreatePDF()
    {
        String API_KEY = '*****************************************';       
        string SourceFileUrl = 'https://bytescout-com.s3.amazonaws.com/files/demo-files/cloud-api/pdf-edit/sample.pdf';
        string Pages = '';
        string Password = '';
        String DestinationFile = 'result';
        string Type = 'annotation';
        Integer X = 400;
        Integer Y = 600;
        string Text = 'APPROVED';
        string FontName = 'Times New Roman';
        Decimal FontSize = 24;
        string FontColor = 'FF0000';
        Map<string, Object> parameters = new Map<string, Object>();
        parameters.put('name', DestinationFile);
        parameters.put('password', Password);
        parameters.put('pages', Pages);
        parameters.put('url', SourceFileUrl);
        parameters.put('type', Type);
        parameters.put('x', X);
        parameters.put('y', Y);
        parameters.put('text', Text);
        parameters.put('fontname', FontName);
        parameters.put('size', FontSize);
        parameters.put('color', FontColor);
        
        string jsonPayload = Json.serialize(parameters);
        try
        {
            string url = 'https://api.pdf.co/v1/pdf/edit/add';
            HttpRequest req = new HttpRequest();
            req.setBody(jsonPayload);
            req.setHeader('x-api-key', API_KEY);
            req.setHeader('Content-Type', 'application/json');
            req.setEndpoint(url);
            req.setMethod('POST');
            req.setTimeout(60000);
            Http http = new Http();
            HTTPResponse res = http.send(req);
            if(res.getStatusCode() == 200) 
            {
                System.Debug('res ' + res);
                Map<String, Object> deserializedBody =  (Map<String, Object>)JSON.deserializeUntyped(res.getBody());
                String urlVal = (String)deserializedBody.get('url');
                downloadPDFAndStore(urlVal, DestinationFile);
            }
            else
            {
                System.debug('Success Response ' + res.getBody());
                System.Debug(' Status ' + res.getStatus());
                System.Debug(' Status Code' + res.getStatusCode());
                System.Debug(' Status String' + res.toString());
            }
           
        }
        catch(Exception ex)
        {
            String errorBody = 'Message: ' + ex.getMessage() + ' -- Cause: ' + ex.getCause() + ' -- Stacktrace: ' + ex.getStackTraceString();
            System.Debug(errorBody);
        }
    }

    @TestVisible
    private static void downloadPDFAndStore(String extFileUrl, String DestinationFile)
    {
        try
        {
            Http h = new Http(); 
            HttpRequest req = new HttpRequest(); 
            extFileUrl = extFileUrl.replace(' ', '%20'); 
            req.setEndpoint(extFileUrl); 
            req.setMethod('GET'); 
            req.setHeader('Content-Type', 'application/pdf'); 
            req.setCompressed(true); 
            req.setTimeout(60000); 
            //Now Send HTTP Request
            HttpResponse res  = h.send(req); 
            if(res.getStatusCode() == 200) 
            {
                blob fileContent = res.getBodyAsBlob();
                ContentVersion conVer = new ContentVersion();
                conVer.ContentLocation = 'S'; // to use S specify this document is in Salesforce, to use E for external files
                conVer.PathOnClient = DestinationFile + '.pdf'; // The files name, extension is very important here which will help the file in preview.
                conVer.Title = DestinationFile; // Display name of the files
                conVer.VersionData = fileContent;
                insert conVer;
                System.Debug('Success');
            }
            else
            {
                System.debug('Success Response ' + res.getBody());
                System.Debug(' Status ' + res.getStatus());
                System.Debug(' Status Code' + res.getStatusCode());
                System.Debug(' Status String' + res.toString());
            }
        }
        catch(Exception ex)
        {
            String errorBody = 'Message: ' + ex.getMessage() + ' -- Cause: ' + ex.getCause() + ' -- Stacktrace: ' + ex.getStackTraceString();
            System.Debug(errorBody);
        }
    }
}

AddTextToTheExistingPDFTest.cls

@isTest
public class ProgramTest
{
    private  testmethod static void testFetchDataAndCreatePDF()
    {
        Test.setMock(HttpCalloutMock.class, new ProgramTest.DocumentCreationMock());
        Program.fetchDataAndCreatePDF();
        List cv = [select Id from ContentVersion];
        System.assertEquals(1, cv.size());
    }

    private  testmethod static void testFetchDataAndCreatePDFException()
    {
        Program.fetchDataAndCreatePDF();
        List cv = [select Id from ContentVersion];
        System.assertEquals(0, cv.size());
    }
    
    private  testmethod static void testdownloadPDFAndStoreException()
    {
        Program.downloadPDFAndStore(null, null);
        List cv = [select Id from ContentVersion];
        System.assertEquals(0, cv.size());
    }

    public class DocumentCreationMock implements HttpCalloutMock {
        public HTTPResponse respond(HTTPRequest req) {
            HttpResponse res = new HttpResponse();
            String testBody = '{"hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","url":"https://pdf-temp-files.s3-us-west-2.amazonaws.com/0c336bfcef1a473d98492bda25d8da03/newDocument.pdf?X-Amz-Expires=3600&x-amz-security-token=FwoGZXIvYXdzEO7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDHWK1dY4d4lOgsheliKBATwE%2FZewASPTEnPxTn%2BOdYhP4h3gljAJfqbRvQptDX7wdWLmrBS7Tg4qTU6pAbxIdXChGPjBWpSbtiADJKmqkmyhkUmE8GSM1%2FGtJO6bga2pgzvFLXmzxjTf3%2BFNqwYOvbyApIZdVLoPpEKY6PlCflQtLTd30dhelm6xpB8pitbdhSjdz8KCBjIobVy%2Fjwybwp6OQgB%2FT6QkIo2dU07gtFREdn5jhRyvnS5lkccweBV1%2Bw%3D%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIA4NRRSZPHMV5P3JOS/20210316/us-west-2/s3/aws4_request&X-Amz-Date=20210316T124309Z&X-Amz-SignedHeaders=host;x-amz-security-token&X-Amz-Signature=95287bf3c007fed4c2c5aeea1ce75c846cc6c68b22aaf35175ebe41a105f54e1","pageCount":1,"error":false,"status":200,"name":"newDocument","remainingCredits":9913694,"credits":3}';
            res.setHeader('Content-Type', 'application/json');
            res.setBody(testBody);
            res.setStatusCode(200);
            return res;
        }
    }
}

Add Text to PDF – Demo Video

I hope this tutorial is helpful with your integration to PDF.co in Salesforce. Thank you!

Related Samples: