Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Jacky_Liu
Product and Topic Expert
Product and Topic Expert
In my blog Configure the SAP BTP Cloud Foundry Environment Subaccount with SAP Forms Service by Adobe and Test ... 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 obt....  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

 
5 Comments
Faidzal_Thalith
Explorer
0 Kudos
Hi jackyliu02,

To use Digital Signature, do we require to have Adobe Interactive form license?
Jacky_Liu
Product and Topic Expert
Product and Topic Expert
0 Kudos
Hi ,faidzal.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 .
ramonlee5
Explorer
0 Kudos

Hi @Jack,

We have uploaded the server signature as from the above.

 

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 sign error from postman

ADS Server Signature Uploaded

 

Any idea what could be the cause of it.

Thanks,

RL

ramonlee5
Explorer
0 Kudos

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?

Jacky_Liu
Product and Topic Expert
Product and Topic Expert
0 Kudos

Hi, Ramon,

Theoritically, it is possible.  Every employee has prepared a private key with password owned by her/his self . Develope an application which involve a workflow with a PDF attachment .  When the employee click a button to sign the PDF, the application will use employee private key to sign the PDF and upload the PDF into BTP SDM . But how to control the Private key in Adobe service is some process controlled by manual .

Best regards!

Jacky Liu