Skip to Content
Technical Articles
Author's profile photo Jacky Liu

PDF Digital Signature with BTP SAP Forms Service by Adobe and Test with Postman

In my blog Configure the SAP BTP Cloud Foundry Environment Subaccount with SAP Forms Service by Adobe and Test with Postman, we can render a pdf document with BTP ADS(SAP Forms Service by Adobe).  Some customers need to use interactive PDF form and need use digital signature for filled  interactive PDF form.   If you require additional document security such as certification or digital signatures, you can obtain other credentials from a Certificate Authority (CA). You install and configure other credentials the same way that you install the Adobe Reader Rights certificate.  But for testing purpose I will use self signed certificate . I will demo the testing steps as the following.

 

Step 1 prepare selfsigned certificate in format P12 by using openssl .

Step 2 upload p12 file and create server credential .

Step 3 adjust the xdp file to make the text field user enter and add signature field by using sap adobe livecycle designer.

 

 

Step 4 create form and upload template in Step 3 in Ads as

step 5 in blog

 

Step 5 render pdf as interactive form as step 6 in blog , but we need to change the form type as interactive

Step 6  sign the pdf document from step 5 .

 

Step 7 get signature base on signed pdf document .

The end.

 

Thank you for your time!

Best regards!

 

Jacky Liu

 

Assigned Tags

      4 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Ahmad Faidzal Abdullah Thalith
      Ahmad Faidzal Abdullah Thalith

      Hi Jacky Liu,

      To use Digital Signature, do we require to have Adobe Interactive form license?

      Author's profile photo Jacky Liu
      Jacky Liu
      Blog Post Author

      Hi ,Ahmad Faidzal Abdullah Thalith

      We only need use SAP Forms Service by Adobe, no need additional license for Adobe Interactive form . This blog id for SAP Forms Service by Adobe in SAP BTP , Not for the  SAP ADS On-Premise.

      Best regards!

      Jacky Liu .

      Author's profile photo Ramon Lee
      Ramon Lee

      Hi @Jack,

      We have uploaded the server signature as from the above.

      ADS%20Server%20Signature%20Uploaded

       

      Step 2: When attempting to sign from Postman it ran into this error.

      Begin trace\n Adobe Document Services Wed Jan 10 01:18:07 UTC 2024 Trace Results:\n Correlation ID: d3c54f74-ca0b-4c19-40f9-eb63857f130b\n Validation of input streams: execution time = 49 ms.\n Locating stream: PDFDocument and loading into a DOM\n \n \n Using Versions:\n ADS: 1200.20231018005618.0.CLOUD\n XMLFM: 1200.20231018002107.0\n EGS: 1200.20231018004406.0\n String: Trace = 4\n String: Username = AdobeSAPCPUser\n Stream: PDF\n Stream: PDFDocument\n Processing PDFDocument instructions\n Locating stream: PDFDocument and loading into a DOM\n Stream = PDF\n Stream = PDFOut.pdf\n Created a new reference to the DataManager\n Discovering requested operations\n Tenant (04c68aa6-b9ad-4693-a552-a43ddd3aee77) is licensed: true\n Saved input stream, size: 554872 to temporary file: 4896693916994132131.tmp\n Checking request semantics\n Request initialization (including DOM construction and validation) processing elapsed time = 379 ms.\n Begin operation: Sign, elapsed time = 379 ms.\n Credential: ServerSignature\n Validate PDFDocumentXML request for Sign: Sign request: \n field name = signature\n reason = approval\n location = null\n contact info = joe.block@epiuse.com.au\n credential alias = ServerSignature\n Retrieving password for credential: ServerSignature\n com.adobe.livecycle.signatures.client.types.exceptions.InvalidArgumentException: ALC-DSS-303-014 Subject name and the subject alt name missing. (in the operation : getSubjectName)\nProcessing exception during a \"Sign\" operation.\n Request start time: Wed Jan 10 01:18:07 UTC 2024\ncom.adobe.ProcessingException: com.adobe.livecycle.signatures.client.types.exceptions.InvalidArgumentException: ALC-DSS-303-014 Subject name and the subject alt name missing. (in the operation : getSubjectName)\n \n Exception Stack Trace:\n com.adobe.ProcessingException: com.adobe.livecycle.signatures.client.types.exceptions.InvalidArgumentException: ALC-DSS-303-014 Subject name and the subject alt name missing. (in the operation : getSubjectName)\n \tat com.adobe.ads.request.ADSRequest.processOperations(ADSRequest.java:593)\n \tat com.adobe.ads.request.ADSRequest.process(ADSRequest.java:218)\n \tat com.adobe.AdobeDocumentServicesEJB.processRequest(AdobeDocumentServicesEJB.java:290)\n \tat com.adobe.AdobeDocumentServicesEJB.rpDataSec(AdobeDocumentServicesEJB.java:201)\n \tat com.adobe.AdobeDocumentServicesEJB.rpDataSec(AdobeDocumentServicesEJB.java:184)\n \tat sun.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)\n \tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n \tat java.lang.reflect.Method.invoke(Method.java:498)\n \tat org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205)\n \tat org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186)\n \tat org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:191)\n \tat org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:102)\n \tat sun.reflect.GeneratedMethodAccessor107.invoke(Unknown Source)\n \tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n \tat java.lang.reflect.Method.invoke(Method.java:498)\n \tat org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205)\n \tat org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186)\n \tat org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:85)\n \tat org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:252)\n \tat org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:212)\n \tat org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:265)\n \tat org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:260)\n \tat org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:89)\n \tat org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:347)\n \tat com.sun.proxy.$Proxy188.rpDataSec(Unknown Source)\n \tat com.adobe.ads.ws.impl.AdobeDocuementServiceWS_EJBImpl.rpDataSec(AdobeDocuementServiceWS_EJBImpl.java:109)\n \tat adobedocumentservicessecwsd.AdobeDocumentServicesSecViImplBean.rpData(AdobeDocumentServicesSecViImplBean.java:46)\n \tat sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source)\n \tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n \tat java.lang.reflect.Method.invoke(Method.java:498)\n \tat org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)\n \tat org.apache.cxf.jaxws.JAXWSMethodInvoker.performInvocation(JAXWSMethodInvoker.java:66)\n \tat org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)\n \tat org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.invoke(AbstractJAXWSMethodInvoker.java:232)\n \tat org.apache.cxf.jaxws.JAXWSMethodInvoker.invoke(JAXWSMethodInvoker.java:85)\n \tat org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:74)\n \tat org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)\n \tat java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\n \tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\n \tat org.apache.cxf.interceptor.ServiceInvokerInterceptor$2.run(ServiceInvokerInterceptor.java:126)\n \tat org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)\n \tat org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:131)\n \tat org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)\n \tat org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)\n \tat org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)\n \tat org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)\n \tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)\n \tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)\n \tat org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)\n \tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:304)\n \tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)\n \tat javax.servlet.http.HttpServlet.service(HttpServlet.java:555)\n \tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:279)\n \tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)\n \tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)\n \tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\n \tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)\n \tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)\n \tat org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:65)\n \tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)\n \tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)\n \tat com.adobe.ads.cloud.cf.multitenancy.AllRequestFilter.doFilter(AllRequestFilter.java:103)\n \tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)\n \tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)\n \tat com.adobe.ads.cloud.cf.multitenancy.TenantRequestFilter.doFilter(TenantRequestFilter.java:170)\n \tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)\n \tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)\n \tat com.adobe.ads.cloud.cf.multitenancy.AllRequestFilter.doFilter(AllRequestFilter.java:103)\n \tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)\n \tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)\n \tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)\n \tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\n \tat org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)\n \tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:596)\n \tat com.sap.xs.security.container.XSSecurityAuthenticator.invoke(XSSecurityAuthenticator.java:63)\n \tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)\n \tat org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)\n \tat com.sap.xs.java.valves.ErrorReportValve.invoke(ErrorReportValve.java:68)\n \tat ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:256)\n \tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n \tat com.sap.xs.jdbc.datasource.valve.JDBCValve.invoke(JDBCValve.java:62)\n \tat com.sap.xs.security.TenantIdValve.invoke(TenantIdValve.java:33)\n \tat com.sap.xs.security.UserInfoValve.invoke(UserInfoValve.java:18)\n \tat com.sap.xs.statistics.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:43)\n \tat com.sap.xs.logging.catalina.RuntimeInfoValve.invoke(RuntimeInfoValve.java:42)\n \tat org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:765)\n \tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n \tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)\n \tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\n \tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)\n \tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1790)\n \tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\n \tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n \tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n \tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n \tat java.lang.Thread.run(Thread.java:838)\n Caused by: com.adobe.livecycle.signatures.client.types.exceptions.InvalidArgumentException: ALC-DSS-303-014 Subject name and the subject alt name missing. (in the operation : getSubjectName)\n \tat com.adobe.signatures.pdf.util.SigningUtils.getSubjectName(SigningUtils.java:172)\n \tat com.adobe.signatures.pdf.sign.SignCertifyImpl.prepareForSignOrCertify(SignCertifyImpl.java:1177)\n \tat com.adobe.signatures.pdf.sign.SignCertifyImpl.sign(SignCertifyImpl.java:350)\n \tat com.adobe.signatures.pdf.sign.SignCertifyImpl.sign(SignCertifyImpl.java:1628)\n \tat com.adobe.ads.dss.DocumentServicesWrapper.sign(DocumentServicesWrapper.java:1320)\n \tat com.adobe.ads.operation.Sign.execute(Sign.java:295)\n \tat com.adobe.ads.operation.ADSOperation.doWork(ADSOperation.java:101)\n \tat com.adobe.ads.request.ADSRequest.processOperations(ADSRequest.java:567)\n \t... 95 more\n \n End operation: Sign, elapsed time = 744 ms.\n End trace, total elapsed time = 744 ms.\n

      ADS%20sign%20error%20from%20postman

      ADS sign error from postman

      ADS Server Signature Uploaded

       

      Any idea what could be the cause of it.

      Thanks,

      RL

      Author's profile photo Ramon Lee
      Ramon Lee

      All good i have resolved this now. The issues was with the certificate generation process. Subject was omitted. The signing process is taking a long time.

      This electronic signature is somewhat static.

      We have a requirements where we requires different employees or customers, upon acceptance of an agreement, to put their digital signature or initials instead of printing out a large block certificate info. Can this be achieve with BTP Form Adobe Services?