Quick Start (SOAP 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 SOAP mode and contains the following JAR files 
    * in the class path: 
    * 1. adobe-signatures-client.jar 
    * 2. adobe-livecycle-client.jar 
    * 3. adobe-usermanager-client.jar 
    * 4. adobe-utilities.jar 
    * 5. jbossall-client.jar (use a different JAR file if the LiveCycle server is not deployed 
    * on JBoss) 
    * 6. activation.jar (required for SOAP mode) 
    * 7. axis.jar (required for SOAP mode) 
    * 8. commons-codec-1.3.jar (required for SOAP mode) 
    * 9.  commons-collections-3.1.jar  (required for SOAP mode) 
    * 10. commons-discovery.jar (required for SOAP mode) 
    * 11. commons-logging.jar (required for SOAP mode) 
    * 12. dom3-xml-apis-2.5.0.jar (required for SOAP mode) 
    * 13. jaxen-1.1-beta-9.jar (required for SOAP mode) 
    * 14. jaxrpc.jar (required for SOAP mode) 
    * 15. log4j.jar (required for SOAP mode) 
    * 16. mail.jar (required for SOAP mode) 
    * 17. saaj.jar (required for SOAP mode) 
    * 18. wsdl4j.jar (required for SOAP mode) 
    * 19. xalan.jar (required for SOAP mode) 
    * 20. xbean.jar (required for SOAP mode) 
    * 21. xercesImpl.jar (required for SOAP mode) 
    *  
    *  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 
    *  
    * SOAP required JAR files are located in the following path: 
    * <install directory>/sdk/client-libs/thirdparty 
    *  
    * 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 these additional JAR files 
    *  
    * For information about the SOAP  
    * mode, see "Setting connection properties" 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 SignXFAFormsSOAP { 
 
public static void main(String[] args) { 
         
    try 
    { 
     
     //Set connection properties required to invoke LiveCycle using SOAP mode                                 
     Properties connectionProps = new Properties(); 
     connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://hiro-xp:8080"); 
     connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_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(); 
      } 
     } 
}