Expand my Community achievements bar.

Learn about Edge Delivery Services in upcoming GEM session

How to validate PDF document with JAVA

Avatar

Level 1

Hi,

Is there any way to write JAVA app that will validate PDFs through/with LC API ? I was traying with code:

...

ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
FormsServiceClient formsClient = new FormsServiceClient(myFactory);
      
FormsResult renderedForm = renderPDF(formName, xmlData, url, formsClient);        
           
RenderOptionsSpec processSpec = new RenderOptionsSpec();
//processSpec.setValidationReporting(5);
processSpec.setLocale("pl_PL");
FormsResult formOut = formsClient.processFormSubmission(renderedForm.getOutputContent(),"CONTENT_TYPE=application/pdf","",processSpec);

System.out.println(formOut.getValidationErrorsList().toString());

...

//Rendering method

private static FormsResult renderPDF(String formName,String  xmlData, String url, FormsServiceClient formsClient) throws RenderFormException, DSCException, UnsupportedEncodingException {
       
         PDFFormRenderSpec pdfFormRenderSpec = new PDFFormRenderSpec();
         pdfFormRenderSpec.setCacheEnabled(new Boolean(false));
         pdfFormRenderSpec.setXMLData(true);
         pdfFormRenderSpec.setStandAlone(true);
         pdfFormRenderSpec.setLinearizedPDF(true);
                 
         URLSpec urlSpec = new URLSpec();
         urlSpec.setContentRootURI(url);

         String credentialAlias = CREDENTIAL_ALIAS;
         String credentialPassword = CREDENTIAL_PASSWORD;
       
         ReaderExtensionSpec reOptions = new ReaderExtensionSpec();
         reOptions.setReCredentialAlias(credentialAlias);
         reOptions.setReCredentialPassword(credentialPassword);
         reOptions.setReExpImp(true);
         reOptions.setReFillIn(true);
         reOptions.setReDigSig(true);

         Document inputData = new Document(xmlData.getBytes("UTF-8"));
         /*return renderedForm = formsClient.renderPDFForm(formName,inputData,pdfFormRenderSpec,urlSpec,null);*/
         return formsClient.renderPDFFormWithUsageRights(formName,inputData,pdfFormRenderSpec,reOptions,urlSpec);
    }

but in formOut.getValidationErrorsList() i still get:

[8/2/10 12:03:46:728 GMT+01:00] 0000002c SystemOut     O --------------------Validation------------
[8/2/10 12:03:46:728 GMT+01:00] 0000002c SystemOut     O <document state="active" senderVersion="3" persistent="false" senderPersistent="false" passivated="false" senderPassivated="false" deserialized="true" senderHostId="127.0.0.1/172.16.133.24/172.16.134.24" callbackId="0" senderCallbackId="0" callbackRef="null" isLocalizable="false" isTransactionBound="false" defaultDisposalTimeout="600" disposalTimeout="600" maxInlineSize="65536" defaultMaxInlineSize="65536" inlineSize="0" contentType="null" length="-1"><cacheId/><localBackendId/><globalBackendId/><senderLocalBackendId/><senderGlobalBackendId/><inline></inline><senderPullServantJndiName>adobe/idp/DocumentPullServant/adobews_anathNode01Cell_anathNode02_server1</senderPullServantJndiName><attributes/></document>

without any errors. I was looking around (google,forum and Adobe Develop Connection) but no luck . Is it posible to make it that way ?

Ps.

It's my first post so (if i did something wrong ) be gentle. And ... sorry for my poor english .

4 Replies

Avatar

Former Community Member

Is it possible there are no errors to report?

Steve

Avatar

Level 1

I test it on wrong PDF too (Acrobat Reader declare errors) and stiil the same

Avatar

Level 1

I modified code for rendering form and for validating and I start to get erros on output, but that is not complete list

<document state="active" senderVersion="3" persistent="false" senderPersistent="false" passivated="false" senderPassivated="false"
deserialized="true" senderHostId="127.0.0.1/172.16.133.24/172.16.134.24" callbackId="0" senderCallbackId="0" callbackRef="null"
isLocalizable="false" isTransactionBound="false" defaultDisposalTimeout="600" disposalTimeout="600" maxInlineSize="65536"
defaultMaxInlineSize="65536" inlineSize="342" contentType="text/xml" length="-1">
<cacheId/>
<localBackendId/>
<globalBackendId/>
<senderLocalBackendId/>
<senderGlobalBackendId/>
<inline>
    <?xml version="1.0" encoding="UTF-8"?>
    <validationErrors>
    <m d="2010-08-04T10:05:48.897+02:00" ref="...
</inline>
<senderPullServantJndiName>adobe/idp/DocumentPullServant/adobews_anathNode01Cell_anathNode02_server1</senderPullServantJndiName>
<attributes/>
</document>

it is cut in place where should be reference to wrong field.

<inline>
     <?xml version="1.0" encoding="UTF-8"?>
     <validationErrors>
     <m d="2010-08-04T10:05:48.897+02:00" ref="...
</inline>

I attach whole class after changes:

public class AdobeForm {
    private static final String CREDENTIAL_ALIAS  = "READER_EXC_CERT";
    private static final String IIOP = "iiop://localhost:2810";
    private static final String CREDENTIAL_PASSWORD = "pass";
    private static final String AS_USERNAME = "log";
    private static final String AS_PASSWORD = "pass";
    private static final String NO_ERRORS = "";
    public static byte[] renderForm(String formName,String  xmlData, String url){
        byte[] data = null;
        try
        {
            //JBOSS
/*            Properties connectionProps = new Properties();
            connectionProps.setProperty("DSC_DEFAULT_EJB_ENDPOINT", "jnp://localhost:1099");
            connectionProps.setProperty("DSC_TRANSPORT_PROTOCOL", "EJB");
            connectionProps.setProperty("DSC_SERVER_TYPE", "JBoss");
            connectionProps.setProperty("DSC_CREDENTIAL_USERNAME", "log");
            connectionProps.setProperty("DSC_CREDENTIAL_PASSWORD", "pass");*/

           // dla WebSphere
           
            Properties connectionProps = new Properties();
            connectionProps.setProperty("DSC_DEFAULT_EJB_ENDPOINT", IIOP);
            connectionProps.setProperty("DSC_TRANSPORT_PROTOCOL","EJB");         
            connectionProps.setProperty("DSC_SERVER_TYPE", "WebSphere");
            connectionProps.setProperty("DSC_CREDENTIAL_USERNAME", AS_USERNAME);
            connectionProps.setProperty("DSC_CREDENTIAL_PASSWORD", AS_PASSWORD);
           

            ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
            FormsServiceClient formsClient = new FormsServiceClient(myFactory);

            FormsResult renderedForm = renderPDF(formName, xmlData, url, formsClient, false);
           
            //test(renderedForm);
           
            Document renderedFormData = renderedForm.getOutputContent();
            InputStream inputStream = renderedFormData.getInputStream();
           
            // to pewnie trzeba poprawic na przepisywanie duzych danych
            int size = inputStream.available();
            data = new byte[size];
            inputStream.read(data);
            inputStream.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return data;

    }

    public static byte[] validateForm(String formName, String xmlData, String url){
        byte[] data = null;
        try
        {
            //JBOSS
            /*
            Properties connectionProps = new Properties();
            connectionProps.setProperty("DSC_DEFAULT_EJB_ENDPOINT", "jnp://localhost:1099");
            connectionProps.setProperty("DSC_TRANSPORT_PROTOCOL", "EJB");
            connectionProps.setProperty("DSC_SERVER_TYPE", "JBoss");
            connectionProps.setProperty("DSC_CREDENTIAL_USERNAME", "administrator");
            connectionProps.setProperty("DSC_CREDENTIAL_PASSWORD", "password");*/

           
            // dla WebSphere
            Properties connectionProps = new Properties();
            connectionProps.setProperty("DSC_DEFAULT_EJB_ENDPOINT", IIOP);
            connectionProps.setProperty("DSC_TRANSPORT_PROTOCOL","EJB");         
            connectionProps.setProperty("DSC_SERVER_TYPE", "WebSphere");
            connectionProps.setProperty("DSC_CREDENTIAL_USERNAME", AS_USERNAME);
            connectionProps.setProperty("DSC_CREDENTIAL_PASSWORD", AS_PASSWORD);
           
           
            ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
            FormsServiceClient formsClient = new FormsServiceClient(myFactory);
           
            FormsResult renderedForm = renderPDF(formName, xmlData, url, formsClient, true);        
           
            RenderOptionsSpec processSpec = new RenderOptionsSpec();
            processSpec.setValidationUI(0);
            processSpec.setValidationReporting(10);
            processSpec.setCacheEnabled(true);
            //processSpec.setXMLData(true);
            //processSpec.setDebugEnabled(true);
            /*processSpec.setLocale("pl_PL");
           
            processSpec.setStandAlone(true);*/
           
            FormsResult formOut = formsClient.processFormSubmission(renderedForm.getXMLData(),
                    "I=application/pdf&CONTENT_TYPE=application/vnd.adobe.xdp+xml",
                    "",processSpec);
/*            Document inputData = new Document(xmlData.getBytes("UTF-8"));
            FormsResult formOut = formsClient.processFormSubmission(inputData,
                    "CONTENT_TYPE=application/pdf&CONTENT_TYPE=application/vnd.adobe.xdp+xml&CONTENT_TYPE=text/xml",
                    "",processSpec);*/
            test(formOut);
            // to pewnie trzeba poprawic na przepisywanie duzych danych
            InputStream inputStream = formOut.getOutputContent().getInputStream();
            int size = inputStream.available();
            data = new byte[size];
            inputStream.read(data);
            inputStream.close();

            System.out.println("Dane: "+(new String(data)));
            System.out.println("------------------------------------------");
            System.out.println("OutputXML: "+formOut.getOutputXML());
           
            return NO_ERRORS.getBytes();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return NO_ERRORS.getBytes();
    }
   
    private static void test(FormsResult formOut) {
        if(formOut != null)
        {
            System.out.println("------------------------------------------");
            System.out.println("--------------------Validation------------");
            System.out.println(formOut.getValidationErrorsList());
            System.out.println("------------------------------------------");
            System.out.println("------------------------------------------");   
        }
        else
            System.out.println("-------------------FORMOUT NULL-----------------------");   
    }
   
    @SuppressWarnings("unused")
    private static void showData(String xmlData, String formName, String url) {
        System.out.println("------------------XML------------------------");
        System.out.println("XML: "+xmlData);
        System.out.println("Form: "+formName);
        System.out.println("URL: "+url);
        System.out.println("------------------XML------------------------");
    }
   
    private static FormsResult renderPDF(String formName,String  xmlData, String url, FormsServiceClient formsClient, boolean renderedForm) throws RenderFormException, DSCException, UnsupportedEncodingException {
       
         URLSpec urlSpec = new URLSpec();
         urlSpec.setContentRootURI(url);
       
         PDFFormRenderSpec pdfFormRenderSpec = new PDFFormRenderSpec();
         pdfFormRenderSpec.setCacheEnabled(true);
         pdfFormRenderSpec.setXMLData(true);
/*       pdfFormRenderSpec.setDebugEnabled(true);
         pdfFormRenderSpec.setLocale("pl_PL");
         //without rights
         if(renderedForm)//see bellow
             pdfFormRenderSpec.setLinearizedPDF(true); */

         System.out.println("RenderServlet formName "+formName);  

         String credentialAlias = CREDENTIAL_ALIAS;
         String credentialPassword = CREDENTIAL_PASSWORD;
       


         Document inputData = new Document(xmlData.getBytes("UTF-8"));
         if(renderedForm)
             return formsClient.renderPDFForm(formName,inputData,pdfFormRenderSpec,urlSpec,null);
         else
         {
             ReaderExtensionSpec reOptions = new ReaderExtensionSpec();
             reOptions.setReCredentialAlias(credentialAlias);
             reOptions.setReCredentialPassword(credentialPassword);
             reOptions.setReExpImp(true);
             reOptions.setReFillIn(true);
             reOptions.setReDigSig(true);
             pdfFormRenderSpec.setStandAlone(true);

             return formsClient.renderPDFFormWithUsageRights(formName,inputData,pdfFormRenderSpec,reOptions,urlSpec);
         }
         //[8/4/10 11:10:55:928 GMT+01:00] 0000002a CommonGibsonU W com.adobe.livecycle.formsservice.logging.FormsLogger logMessage ALC-FRM-001-048: Forms with Rights cannot be linearized.
    }
}

Avatar

Level 1

And BTW, maybe someone knows example with this kind of validation.