function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Vaibhav DesaleVaibhav Desale 

Docusign API Error

Hi Everyone I am trying to intigrate docusign with salesforce. I am having one problem in my class when I am sending attachments of record. Code works fine when the record page is render as pdf.

I want to send attachments attached to  a record.

Apex class:
public with sharing class SendToDocuSignController {
    private final Opportunity opportunity;
   public String envelopeId {get;set;}
    private String accountId = '73ed93ba-5334-4983-9ba8-1515169d273a';
    private String userId = 'da3249f7-7f1c-4279-a3d6-989f016889b2';
    private String password = 'vaibhav939';
    private String integratorsKey = 'cf12560e-1211-4d73-a374-d8e649d8ae9d';
    private String webServiceUrl 
        = 'https://demo.docusign.net/api/3.0/dsapi.asmx?op=CreateAndSendEnvelope';
    
    public SendToDocuSignController(ApexPages.StandardController controller)
    {
        this.opportunity= [SELECT Id FROM Opportunity where id = :controller.getRecord().Id  ];
        envelopeId = 'Not sent yet';
        
        SendNow();
    }

   public void SendNow()
    {
        DocuSignAPI.APIServiceSoap dsApiSend 
            = new DocuSignAPI.APIServiceSoap();
        dsApiSend.endpoint_x = webServiceUrl;

        //Set Authentication
        String auth = '<DocuSignCredentials><Username>'+ userId 
            +'</Username><Password>' + password 
            + '</Password><IntegratorKey>' + integratorsKey 
            + '</IntegratorKey></DocuSignCredentials>';
        System.debug('Setting authentication to: ' + auth);
            
        dsApiSend.inputHttpHeaders_x = new Map<String, String>();
        dsApiSend.inputHttpHeaders_x.put('X-DocuSign-Authentication', 
            auth);
 
        DocuSignAPI.Envelope envelope = new DocuSignAPI.Envelope();
        envelope.Subject = 'Please Sign this Contract: ' 
            + contract.ContractNumber;
        envelope.EmailBlurb = 'This is my new eSignature service,'+ 
            ' it allows me to get your signoff without having to fax, ' +
            'scan, retype, refile and wait forever';
        envelope.AccountId  = accountId; 
         // Render the contract
        System.debug('Rendering the contract');
        //PageReference pageRef = new PageReference('/apex/RenderContract');
       // pageRef.getParameters().put('id',opportunity.Id);
       // Blob pdfBlob = pageRef.getContent();     
       
       Attachment att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE Parentid = :opportunity.Id LIMIT 1];
       Blob pdfBlob = att.Body; 
 // Document
        DocuSignAPI.Document document = new DocuSignAPI.Document();
        document.ID = 1;
        document.pdfBytes = EncodingUtil.base64Encode(pdfBlob);
        document.Name = 'Contract';
        document.FileExtension = 'docx';
        envelope.Documents = new DocuSignAPI.ArrayOfDocument();
        envelope.Documents.Document = new DocuSignAPI.Document[1];
        envelope.Documents.Document[0] = document;
        
        // Recipient
        System.debug('getting the contact');
        //Contact contact = [SELECT email, FirstName, LastName 
         //   from Contact where id = :contract.CustomerSignedId];
        DocuSignAPI.Recipient recipient = new DocuSignAPI.Recipient();
        recipient.ID = 1;
        recipient.Type_x = 'Signer';
        recipient.RoutingOrder = 1;
        recipient.Email = 'vaibhav123desale@gmail.com';
        recipient.UserName = contact.FirstName + ' ' + contact.LastName;
        // This setting seems required or you see the error:
        // "The string '' is not a valid Boolean value. 
        // at System.Xml.XmlConvert.ToBoolean(String s)" 
        recipient.RequireIDLookup = false;      
         envelope.Recipients.Recipient = new DocuSignAPI.Recipient[1];
        envelope.Recipients.Recipient[0] = recipient;
       // Tab
        DocuSignAPI.Tab tab1 = new DocuSignAPI.Tab();
        tab1.Type_x = 'SignHere';
        tab1.RecipientID = 1;
        tab1.DocumentID = 1;
        tab1.AnchorTabItem = new DocuSignAPI.AnchorTab();
        tab1.AnchorTabItem.AnchorTabString = 'By:';
DocuSignAPI.Tab tab2 = new DocuSignAPI.Tab();
        tab2.Type_x = 'DateSigned';
        tab2.RecipientID = 1;
        tab2.DocumentID = 1;
        tab2.AnchorTabItem = new DocuSignAPI.AnchorTab();
        tab2.AnchorTabItem.AnchorTabString = 'Date Signed:';
          envelope.Tabs = new DocuSignAPI.ArrayOfTab();
        envelope.Tabs.Tab = new DocuSignAPI.Tab[2];
        envelope.Tabs.Tab[0] = tab1;        
        envelope.Tabs.Tab[1] = tab2;        
       System.debug('Calling the API');
        try {
            DocuSignAPI.EnvelopeStatus es 
            = dsApiSend.CreateAndSendEnvelope(envelope);
            envelopeId = es.EnvelopeID;
        } catch ( CalloutException e) {
            System.debug('Exception - ' + e );
            envelopeId = 'Exception - ' + e;
        }
      
    }
}

 Error :-
The DocuSign EnvelopeId:Exception - System.CalloutException: Web service callout failed: WebService returned a SOAP Fault: The specified Anchor Tab string was not found in the document. Anchor Tab String "By:" not found.Anchor Tab String "Date Signed:" not found. faultcode=soap:Client faultactor=https://demo.docusign.net/api/3.0/dsapi.asmx?op=CreateAndSendEnvelope

I have refered this link:-
http://developer.force.com/cookbook/recipe/accessing-docusign-api-from-salesforcecom-to-send-contracts-for-esignatures

Please help me out to solve the issue. 
Thanks in advance.