Quick Start (EJB mode): Digitally signing a XFA-based Form using the Java API

The following Java code example signs an interactive form that is rendered by the Forms service. The com.adobe.idp.Document instance that is returned by the Forms service is passed to the Signature service. The signed interactive form is saved as a PDF file named LoanXFASigned.pdf.

/* 
    * This Java Quick Start uses the following JAR files 
    * 1. adobe-signatures-client.jar 
    * 2. adobe-livecycle-client.jar 
    * 3. adobe-usermanager-client.jar 
    * 4. adobe-utilities.jar 
    * 5. adobe-forms-client.jar 
    * 6. jbossall-client.jar (use a different JAR file if the LiveCycle server is not deployed 
    * on JBoss) 
    * 7. jacorb.jar (use a different JAR file if the LiveCycle server is not deployed on JBoss) 
    * 8. jnp-client.jar (use a different JAR file if the LiveCycle server is not deployed on JBoss) 
    *  
    *  The JBoss files must be kept in the jboss\client folder. You can copy the client folder to  
    *  your local development environment and then include the 3 JBoss JAR files in your class path 
    *   
    *  These JAR files are located in the following path: 
    * <install directory>/sdk/client-libs/common 
    *  
    * The adobe-utilities.jar file is located in the following path: 
    * <install directory>/sdk/client-libs/jboss 
    *  
    * The jbossall-client.jar file is located in the following path: 
    * <install directory>/jboss/client 
    *  
    * If you want to invoke a remote LiveCycle server instance and there is a 
    * firewall between the client application and the server, then it is  
    * recommended that you use the SOAP mode. When using the SOAP mode,  
    * you have to include additional JAR files located in the following  
    * path 
    * <install directory>/sdk/client-libs/thirdparty 
    *  
    * For information about the SOAP  
    * mode and the additional JAR files that need to be included,  
    * see "Setting connection properties" in Programming  
    * with LiveCycle 
    *  
    * For complete details about the location of the LiveCycle JAR files,  
    * see "Including LiveCycle Java library files" in Programming  
    * with LiveCycle 
    */ 
import java.util.*; 
import java.io.File; 
import java.io.FileInputStream; 
 
import com.adobe.livecycle.formsservice.client.FormsResult; 
import com.adobe.livecycle.formsservice.client.FormsServiceClient; 
import com.adobe.livecycle.formsservice.client.PDFFormRenderSpec; 
import com.adobe.livecycle.signatures.client.*; 
import com.adobe.livecycle.signatures.client.types.*; 
import com.adobe.livecycle.signatures.pki.client.types.common.HashAlgorithm; 
import com.adobe.idp.Document; 
import com.adobe.idp.dsc.clientsdk.ServiceClientFactory; 
import com.adobe.idp.dsc.clientsdk.ServiceClientFactoryProperties; 
 
public class SignXFAForms { 
 
public static void main(String[] args) { 
         
    try 
    { 
      //Set connection properties required to invoke LiveCycle                                 
      Properties connectionProps = new Properties(); 
      connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://hiro-xp:1099"); 
     connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);           
      connectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss"); 
      connectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator"); 
         connectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password"); 
     
      //Create a ServiceClientFactory instance 
      ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps); 
 
      //Get the XFA form to sign 
      Document myForm = GetForm(myFactory); 
     
      //Sign the XFA form 
      SignXFA(myForm,myFactory);  
    } 
     
    catch (Exception ee) 
      { 
        ee.printStackTrace(); 
      } 
      } 
 
 
//Creates an interactive PDF form based on a XFA form 
private static Document GetForm(ServiceClientFactory myFactory) 
{ 
     
    try 
    { 
    //Create a FormsServiceClient object 
    FormsServiceClient formsClient = new FormsServiceClient(myFactory);  
 
    //Specify a PDF document to sign 
    FileInputStream fileInputStream = new FileInputStream("C:\\Adobe\LoanSigXFA.pdf");     
    Document xfaForm = new Document (fileInputStream); 
             
    //Retrieve form data 
    FileInputStream cData = new FileInputStream("C:\\Adobe\Loan.xml"); 
    Document oInputData = new Document(cData); 
                             
    //Cache the PDF form 
    PDFFormRenderSpec pdfFormRenderSpec = new PDFFormRenderSpec(); 
    pdfFormRenderSpec.setGenerateServerAppearance(true); 
             
    //Invoke the renderPDFForm2 method  
    FormsResult formOut = formsClient.renderPDFForm2( 
            xfaForm,               //formQuery 
            oInputData,             //inDataDoc 
            pdfFormRenderSpec,      //PDFFormRenderSpec 
            null,                //urlSpec 
            null            //attachments 
            ); 
 
    //Create a Document object that stores form data 
    Document myForm = formOut.getOutputContent(); 
    return myForm;  
} 
     
    catch (Exception ee) 
      { 
        ee.printStackTrace(); 
      } 
    return null;  
     
} 
 
//Sign the PDF document 
private static void SignXFA(Document doc, ServiceClientFactory myFactory) 
{ 
    try 
    { 
     
    //Create a SignatureServiceClient object 
     SignatureServiceClient signClient = new SignatureServiceClient(myFactory); 
         
     //Specify the name of the signature field 
     String fieldName = "SignatureField1"; 
 
     //Create a Credential object 
     Credential myCred = Credential.getInstance("secure"); 
 
     //Specify the reason to sign the document 
     String reason = "The document was reviewed"; 
 
     //Specify the location of the signer 
     String location  = "New York HQ";  
 
     //Specify contact information 
     String contactInfo = "Tony Blue"; 
 
     //Create a PDFSignatureAppearanceOptions object  
     //and show date information 
     PDFSignatureAppearanceOptionSpec appear = new  PDFSignatureAppearanceOptionSpec();  
     appear.setShowDate(true); 
     appear.setShowReason(true); 
         
     //Set revocation checking to false 
     java.lang.Boolean revCheck = new Boolean(true); 
     
     //Create an OCSPOptionSpec object to pass to the sign method 
     OCSPOptionSpec ocspSpec = new OCSPOptionSpec(); 
     
     //Create a CRLOptionSpec object to pass to the sign method 
     CRLOptionSpec crlSpec = new CRLOptionSpec(); 
     
     //Create a TSPOptionSpec object to pass to the sign method 
     TSPOptionSpec tspSpec = new TSPOptionSpec(); 
 
     //Sign the PDF document 
      Document signedDoc = signClient.sign( 
         doc, 
         fieldName, 
         myCred, 
         HashAlgorithm.SHA1, 
         reason, 
         location, 
         contactInfo, 
         appear, 
         revCheck, 
        ocspSpec, 
        crlSpec, 
        tspSpec); 
 
      //Save the signed PDF document                         
      File outFile = new File("C:\\Adobe\LoanXFASigned.pdf"); 
      signedDoc.copyToFile (outFile); 
} 
     
    catch (Exception ee) 
      { 
        ee.printStackTrace(); 
      } 
     } 
}