Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

AEM Forms - Fillable PDFs - Fill data with AEM Java API

Avatar

Level 1

Hi All, I am pretty new to this forum. I am exploring AEM forms quick start installation. My requirement is, we have few fillable PDF forms which I want to access by API and fill with data using Adobe AEM Forms JAVA API. Please advise the API/jars/libraries to use to achieve my requirement.

I uploaded the one of fillable pdf forms to AEM Quick start publish website which I need to access with adobe library java api.

Please help.

Thank you!

Ashok

1 Accepted Solution

Avatar

Correct answer by
Level 10
4 Replies

Avatar

Level 10

I know back in LC Days  we could do this using Java code like this...

I am checking to see if this still works like this...

/*

* This Java Quick Start uses the following JAR files

* 1. adobe-forms-client.jar

* 2. adobe-livecycle-client.jar

* 3. adobe-usermanager-client.jar

*

*  (Because Forms quick starts are implemented as Java servlets, it is

*  not necessary to include J2EE specific JAR files - the Java project

*  that contains this quick start is exported as a WAR file which

*  is deployed to the J2EE application server)

*  These JAR files are located in the following path:

* <install directory>/Adobe/Adobe LiveCycle ES2/LiveCycle_ES_SDK/client-libs/common

*

* For complete details about the location of these JAR files,

* see "Including LiveCycle ES2 library files" in Programming with LiveCycle ES2

*/

import java.io.IOException;

import javax.servlet.Servlet;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.adobe.livecycle.formsservice.client.*;

import java.util.*;

import java.io.ByteArrayOutputStream;

import java.io.InputStream;

import com.adobe.idp.Document;

import com.adobe.idp.dsc.clientsdk.ServiceClientFactory;

import com.adobe.idp.dsc.clientsdk.ServiceClientFactoryProperties;

import org.w3c.dom.Element;

import javax.xml.parsers.*;

import javax.xml.transform.*;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

public class RenderDynamicForm extends HttpServlet implements Servlet {

    public void doGet(HttpServletRequest req, HttpServletResponse resp)

        throws ServletException, IOException {

            doPost(req,resp);

    }

   

    public void doPost(HttpServletRequest req, HttpServletResponse resp)

        throws ServletException, IOException {

           

            //Render a dynamic purchase order form

            //Create an org.w3c.dom.Document object

            org.w3c.dom.Document myDom = createDataSource();

                       

            //Convert the org.w3c.dom.Document object

            //to a com.adobe.idp.Document object

            com.adobe.idp.Document formData = convertDataSource(myDom);

           

            //Render the dynamic form using data located within the

            //com.adobe.idp.Document object

            renderPOForm(resp,formData);

     }

    

    

     //Creates an org.w3c.dom.Document object

     private org.w3c.dom.Document createDataSource()

     {

        org.w3c.dom.Document document = null;

       

        try

        {

            //Create DocumentBuilderFactory and DocumentBuilder objects

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder = factory.newDocumentBuilder();

            //Create a new Document object

            document = builder.newDocument();

            //Create the root element and append it to the XML DOM

            Element root = (Element)document.createElement("transaction");

            document.appendChild(root);

           

            //Create the header element

            Element header = (Element)document.createElement("header");

            root.appendChild(header);

            //Create the txtPONum element and append it to the

            //header element

            Element txtPONum = (Element)document.createElement("txtPONum");

            txtPONum.appendChild(document.createTextNode("8745236985"));

            header.appendChild(txtPONum);

            //Create the dtmDate element and append it to the

            //header element   

            Element dtmDate = (Element)document.createElement("dtmDate");

            dtmDate.appendChild(document.createTextNode("2007-02-08"));

            header.appendChild(dtmDate);

           

            //Create the orderedByAddress element and append

            //it to the header element

            Element orderedByAddress =(Element)document.createElement("orderedByAddress");

            orderedByAddress.appendChild(document.createTextNode("222, Any Blvd"));

            header.appendChild(orderedByAddress);

            //Create the txtOrderedByPhone element and append

            //it to the header element

            Element txtOrderedByPhone = (Element)document.createElement("txtOrderedByPhone");

            txtOrderedByPhone.appendChild(document.createTextNode("(555) 555-2334"));

            header.appendChild(txtOrderedByPhone);

            //Create the txtOrderedByFax element and append

            //it to the header element

            Element txtOrderedByFax = (Element)document.createElement("txtOrderedByFax");   

            txtOrderedByFax.appendChild(document.createTextNode("(555) 555-9334"));

            header.appendChild(txtOrderedByFax);

            //Create the txtOrderedByContactName element and append

            //it to the header element

            Element txtOrderedByContactName = (Element)document.createElement("txtOrderedByContactName");

            txtOrderedByContactName.appendChild(document.createTextNode("Frank Jones"));

            header.appendChild(txtOrderedByContactName);

            //Create the deliverToAddress element and append

            //it to the header element

            Element deliverToAddress = (Element)document.createElement("deliverToAddress");

            deliverToAddress.appendChild(document.createTextNode("555, Any Blvd"));

            header.appendChild(deliverToAddress);

            //Create the txtDeliverToPhone element and append

            //it to the header element

            Element txtDeliverToPhone = (Element)document.createElement("txtDeliverToPhone");

            txtDeliverToPhone.appendChild(document.createTextNode("(555) 555-9098"));

            header.appendChild(txtDeliverToPhone);

            //Create the txtDeliverToFax element and append

            //it to the header element

            Element txtDeliverToFax = (Element)document.createElement("txtDeliverToFax");

            txtDeliverToFax.appendChild(document.createTextNode("(555) 555-9000"));

            header.appendChild(txtDeliverToFax);

            //Create the txtDeliverToContactName element and

            //append it to the header element

            Element txtDeliverToContactName = (Element)document.createElement("txtDeliverToContactName");

            txtDeliverToContactName.appendChild(document.createTextNode("Jerry Johnson"));

            header.appendChild(txtDeliverToContactName);

            //Create the detail element and append it to the root

            Element detail = (Element)document.createElement("detail");

            root.appendChild(detail);

            //Create the txtPartNum element and append it to the

            //detail element

            Element txtPartNum = (Element)document.createElement("txtPartNum");

            txtPartNum.appendChild(document.createTextNode("00010-100"));

            detail.appendChild(txtPartNum);

            //Create the txtDescription element and append it

            //to the detail element

            Element txtDescription = (Element)document.createElement("txtDescription");

            txtDescription.appendChild(document.createTextNode("Monitor"));

            detail.appendChild(txtDescription);

            //Create the numQty element and append it to

            //the detail element

            Element numQty = (Element)document.createElement("numQty");

            numQty.appendChild(document.createTextNode("1"));

            detail.appendChild(numQty);

            //Create the numUnitPrice element and append it

            //to the detail element

            Element numUnitPrice = (Element)document.createElement("numUnitPrice");

            numUnitPrice.appendChild(document.createTextNode("350.00"));

            detail.appendChild(numUnitPrice);

            //Create another detail element named detail2 and

            //append it to root

            Element detail2 = (Element)document.createElement("detail");

            root.appendChild(detail2);

            //Create the txtPartNum element and append it to the

            //detail2 element

            Element txtPartNum2 = (Element)document.createElement("txtPartNum");

            txtPartNum2.appendChild(document.createTextNode("00010-200"));

            detail2.appendChild(txtPartNum2);

            //Create the txtDescription element and append it

            //to the detail2 element

            Element txtDescription2 = (Element)document.createElement("txtDescription");

            txtDescription2.appendChild(document.createTextNode("Desk lamps"));

            detail2.appendChild(txtDescription2);

            //Create the numQty element and append it to the

            //detail2 element

            Element numQty2 = (Element)document.createElement("numQty");

            numQty2.appendChild(document.createTextNode("3"));

            detail2.appendChild(numQty2);

            //Create the NUMUNITPRICE element

            Element numUnitPrice2 = (Element)document.createElement("numUnitPrice");

            numUnitPrice2.appendChild(document.createTextNode("55.00"));

            detail2.appendChild(numUnitPrice2);

          }

     catch (Exception e) {

              System.out.println("The following exception occurred: "+e.getMessage());

           }

    return document;

     }

    

    

     //Converts an org.w3c.dom.Document object to a

     //com.adobe.idp.Document object

     private Document convertDataSource(org.w3c.dom.Document myDOM)

     {

        byte[] mybytes = null;

        

        try

        {

        //Create a Java Transformer object

        TransformerFactory transFact = TransformerFactory.newInstance();

        Transformer transForm = transFact.newTransformer();

        //Create a Java ByteArrayOutputStream object

        ByteArrayOutputStream myOutStream = new ByteArrayOutputStream();

        //Create a Java Source object

        javax.xml.transform.dom.DOMSource myInput = new DOMSource(myDOM);

   

        //Create a Java Result object

        javax.xml.transform.stream.StreamResult myOutput = new StreamResult(myOutStream);    

        //Populate the Java ByteArrayOutputStream object

        transForm.transform(myInput,myOutput);

        // Get the size of the ByteArrayOutputStream buffer

         int myByteSize = myOutStream.size();

   

        //Allocate myByteSize to the byte array

         mybytes = new byte[myByteSize];

            

        //Copy the content to the byte array

         mybytes = myOutStream.toByteArray();

        }

        catch (Exception e) {

          System.out.println("The following exception occurred: "+e.getMessage());

      }

    

     //Create a com.adobe.idp.Document object and copy the

     //contents of the byte array

     Document myDocument = new Document(mybytes);

     return myDocument;

     }

    

    

     //Render the purchase order form using the specified

     //com.adobe.idp.Document object

     private void renderPOForm(HttpServletResponse resp, Document formData)

     {

        try{

           

            //Set connection properties required to invoke LiveCycle ES2                               

            Properties connectionProps = new Properties();

            connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://localhost: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 object

            ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);

               

            //Create a FormsServiceClient object

            FormsServiceClient formsClient = new FormsServiceClient(myFactory);

       

            //Set the parameter values for the renderPDFForm method

            String formName = "Applications/FormsApplication/1.0/FormsFolder/PO.xdp"; 

                                                       

            //Cache the form

            PDFFormRenderSpec pdfFormRenderSpec = new PDFFormRenderSpec();

            pdfFormRenderSpec.setCacheEnabled(new Boolean(true));

       

            //Specify URI values that are required to render a form

            URLSpec uriValues = new URLSpec();

            uriValues.setApplicationWebRoot("http://localhost:8080/FormsQS");

            uriValues.setContentRootURI("repository:///");

            uriValues.setTargetURL("http://localhost:8080/FormsQS/HandleData");

                   

            //Invoke the renderForm method

            FormsResult formOut = formsClient.renderPDFForm(

                formName,               //formQuery

                formData,                 //inDataDoc

                pdfFormRenderSpec,      //PDFFormRenderSpec

                uriValues,                //urlSpec

                null                    //attachments

                );

               

            //Create a ServletOutputStream object

            ServletOutputStream oOutput = resp.getOutputStream();

       

            //Create a Document object that stores form data

            Document myData = formOut.getOutputContent();

       

            //Create an InputStream object

            InputStream inputStream = myData.getInputStream();

       

            //Write the data stream to the web browser

            byte[] data = new byte[4096];

            int bytesRead = 0;

            while ((bytesRead = inputStream.read(data)) > 0)

            {

                oOutput.write(data, 0, bytesRead);

            }

            }catch (Exception e) {

                 System.out.println("The following exception occurred: "+e.getMessage());

          }

     }

}

Avatar

Level 1

Thank you Donald for your reply.  I dont have the libraries & location listed by you in my installation.

* 1. adobe-forms-client.jar

* 2. adobe-livecycle-client.jar

* 3. adobe-usermanager-client.jar

install directory>/Adobe/Adobe LiveCycle ES2/LiveCycle_ES_SDK/client-libs/common

All I have is auther and publish version deployed using the jar AEM_6.3_Quickstart.jar

After extracting, folder crx-quikckstart was created with serveral subfolders in it and jar cq-quickstart-6.3.0-standalone-quickstart.jar.      And I dont see libraries like the one listed by you.

If possible, please advise the installation which I need to do to get the above libraries/folder structure. Thanks!

Somehow I managed to download jar aemfd-client-sdk-6.3.0.jar. But its just the API, dont have the acutal implementations.

Please advise.

Thanks

Avatar

Correct answer by
Level 10