Technical Articles
Build Digital Document Platform Backend Service On BTP with BTP Ads Sdm Print Service
Digital document platform can be used to handle the following requirements:
- Generate PDF documents base on predefined formate with business data .
- Sign the PDF documents with own certificate.
- Send the PDF documents by Email .
- Store the PDF document into document management system .
- Print the PDF document to a specific local printer .
We can build Digital Document Platform Backend Service On BTP with BTP SAP Forms Service by Adobe (ADS) SAP Document Service(SDM) SAP Print Service .
The blog is based on the following blogs:
- Use SAP Cloud SDK to render PDF document with BTP SAP Forms Service by Adobe rest API
- Test BTP SAP Print Service With Postman
- Query Create And Delete Document From BTP Document Management Service In SAPUI5
Prerequisite:
- You have finished ADS initial setup
- You have finished Print Service initial setup
- You have finished Initial Setup for Document Management Service, Integration Option.
- You have finished Onboarding Repository.
Steps:
1, Create destination for ADS, SDM, Print Service.
ADS destination
Print Service destination
SDM destination
2, Adapt variant of ADS, SDM Print service destination and SDM repository id. Adapt sending email account and password .
The following is the code of server.js
const {ServiceApi} = require( './service');
const express = require('express');
const app = express();
const xsenv = require('@sap/xsenv');
const fs = require('fs');
const base64 = require('base64topdf');
xsenv.loadEnv();
const services = xsenv.getServices({
uaa: { label: 'xsuaa' }
});
const xssec = require('@sap/xssec');
const passport = require('passport');
passport.use('JWT', new xssec.JWTStrategy(services.uaa));
app.use(passport.initialize());
app.use(passport.authenticate('JWT', {
session: false
}));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.get('/srv', function (req, res) {
if (req.authInfo.checkScope('$XSAPPNAME.User')) {
res.status(200).send('adsUnify');
} else {
res.status(403).send('Forbidden');
}
});
app.post('/srv/pdfplatform', function (req, res) {
ServiceApi.render(req.body.render).then( pdf=>{
if(req.body.sign){
req.body.sign.pdf = pdf;
ServiceApi.sign(req.body.sign).then(spdf=>{
base64.base64Decode(spdf,'render.pdf');
const content = fs.readFileSync('render.pdf');
const blob = new Blob([content], {type: 'application/pdf'});
if(req.body.email){
ServiceApi.semail(content,req.body.email.attachname,req.body.email.sendto,req.body.email.subject,req.body.email.ebody).then((info=>{
console.log('email sent successfully');
})).catch(err=>{console.log(err)});
};
if(req.body.cmis){
ServiceApi.createDoc(blob,req.body.cmis.name,req.body.cmis.path).then(cmisresp=>{
console.log(cmisresp.succinctProperties);
}).catch(err=>{
console.log(err);
});
};
if(req.body.print){
// fs.close();
ServiceApi.print(content, req.body.print).then(result=>{
console.log('uploaded into print queue ' + req.body.print.qname)
}).catch(err=>{
console.log(err);
});
};
let raw = fs.createReadStream('render.pdf');
res.writeHead(200, 'ok');
raw.pipe(res);
fs.rm('render.pdf',()=>{
console.log('file deleted successfully');
});
}).catch(err=>{
console.log(err);
res.status(500).send(err);
});
}else{
base64.base64Decode(pdf,'render.pdf');
const content = fs.readFileSync('render.pdf');
if(req.body.print){
ServiceApi.print(content, req.body.print).then(result=>{
console.log('uploaded into print queue ' + req.body.print.qname)
}).catch(err=>{
console.log(err);
});
}
if(req.body.cmis){
const blob = new Blob([content], {type: 'application/pdf'});
ServiceApi.createDoc(blob,req.body.cmis.name,req.body.cmis.path).then(cmisresp=>{
console.log(cmisresp.succinctProperties);
}).catch(err=>{
console.log(err);
})
};
if(req.body.email){
ServiceApi.semail(content,req.body.email.attachname,req.body.email.sendto,req.body.email.subject,req.body.email.ebody).then((info=>{
console.log('email sent successfully');
})).catch(err=>{console.log(err)});
};
let raw = fs.createReadStream('render.pdf');
res.writeHead(200, 'ok');
raw.pipe(res);
fs.rm('render.pdf',()=>{
console.log('file deleted successfully');
});
}
}).catch(err=>{
console.log(err);
res.status(500).send(err);
});
});
app.get('/srv/user', function (req, res) {
if (req.authInfo.checkScope('$XSAPPNAME.User')) {
res.status(200).json(req.user);
} else {
res.status(403).send('Forbidden');
}
});
const port = process.env.PORT || 5001;
app.listen(port, function () {
console.info('Listening on http://localhost:' + port);
});
3, Build and deploy application .
4, Test with postman:
We use the following JSON as request body:
{"render":{
"embedFont": 0,
"formLocale": "en_US",
"formType": "interactive",
"taggedPdf": 1,
"xdpTemplate": "labelprint3/labelprint3",
"xmlData": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGZvcm0xPgogICA8TGFiZWxGb3JtPgogICAgICA8RGVsaXZlcnlJZD44MDAwMzExPC9EZWxpdmVyeUlkPgogICAgICA8UG9zaXRpb24+MDAxMDwvUG9zaXRpb24+CiAgICAgIDxNYXRlcmlhbE5vPk0xMDAwMDE8L01hdGVyaWFsTm8+CiAgICAgIDxRdWFudGl0eT4xMjM0NTYuMzIxPC9RdWFudGl0eT4KICAgICAgPFBhY2thZ2U+UDExMTExMTwvUGFja2FnZT4KICAgICAgPFFSQ29kZT4wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTwvUVJDb2RlPgogICA8L0xhYmVsRm9ybT4KICAgPExhYmVsRm9ybT4KICAgICAgPERlbGl2ZXJ5SWQ+ODAwMDMxMjwvRGVsaXZlcnlJZD4KICAgICAgPFBvc2l0aW9uPjAwMTA8L1Bvc2l0aW9uPgogICAgICA8TWF0ZXJpYWxObz5NMTAwMDAyPC9NYXRlcmlhbE5vPgogICAgICA8UXVhbnRpdHk+MTIzNDU4LjMyMTwvUXVhbnRpdHk+CiAgICAgIDxQYWNrYWdlPlAxMTExMTI8L1BhY2thZ2U+CiAgICAgIDxRUkNvZGU+MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk8L1FSQ29kZT4KICAgPC9MYWJlbEZvcm0+CiAgIDxMYWJlbEZvcm0+CiAgICAgICA8RGVsaXZlcnlJZD44MDAwMzEzPC9EZWxpdmVyeUlkPgogICAgICA8UG9zaXRpb24+MDAxMzwvUG9zaXRpb24+CiAgICAgIDxNYXRlcmlhbE5vPk0xMDAwMDM8L01hdGVyaWFsTm8+CiAgICAgIDxRdWFudGl0eT4xMjM0NTguMzIxPC9RdWFudGl0eT4KICAgICAgPFBhY2thZ2U+UDExMTExMzwvUGFja2FnZT4KICAgICAgPFFSQ29kZT4wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTwvUVJDb2RlPgogICA8L0xhYmVsRm9ybT4KICAgPExhYmVsRm9ybT4KICAgIDxEZWxpdmVyeUlkPjgwMDAzMTE8L0RlbGl2ZXJ5SWQ+CiAgICA8UG9zaXRpb24+MDAxMDwvUG9zaXRpb24+CiAgICA8TWF0ZXJpYWxObz5NMTAwMDAxPC9NYXRlcmlhbE5vPgogICAgPFF1YW50aXR5PjEyMzQ1Ni4zMjE8L1F1YW50aXR5PgogICAgPFBhY2thZ2U+UDExMTExMTwvUGFja2FnZT4KICAgIDxRUkNvZGU+MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk8L1FSQ29kZT4KIDwvTGFiZWxGb3JtPgogPExhYmVsRm9ybT4KICAgIDxEZWxpdmVyeUlkPjgwMDAzMTI8L0RlbGl2ZXJ5SWQ+CiAgICA8UG9zaXRpb24+MDAxMDwvUG9zaXRpb24+CiAgICA8TWF0ZXJpYWxObz5NMTAwMDAyPC9NYXRlcmlhbE5vPgogICAgPFF1YW50aXR5PjEyMzQ1OC4zMjE8L1F1YW50aXR5PgogICAgPFBhY2thZ2U+UDExMTExMjwvUGFja2FnZT4KICAgIDxRUkNvZGU+MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk8L1FSQ29kZT4KIDwvTGFiZWxGb3JtPgogPExhYmVsRm9ybT4KICAgICA8RGVsaXZlcnlJZD44MDAwMzEzPC9EZWxpdmVyeUlkPgogICAgPFBvc2l0aW9uPjAwMTM8L1Bvc2l0aW9uPgogICAgPE1hdGVyaWFsTm8+TTEwMDAwMzwvTWF0ZXJpYWxObz4KICAgIDxRdWFudGl0eT4xMjM0NTguMzIxPC9RdWFudGl0eT4KICAgIDxQYWNrYWdlPlAxMTExMTM8L1BhY2thZ2U+CiAgICA8UVJDb2RlPjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5PC9RUkNvZGU+CiA8L0xhYmVsRm9ybT4KIDxMYWJlbEZvcm0+CiAgICA8RGVsaXZlcnlJZD44MDAwMzExPC9EZWxpdmVyeUlkPgogICAgPFBvc2l0aW9uPjAwMTA8L1Bvc2l0aW9uPgogICAgPE1hdGVyaWFsTm8+TTEwMDAwMTwvTWF0ZXJpYWxObz4KICAgIDxRdWFudGl0eT4xMjM0NTYuMzIxPC9RdWFudGl0eT4KICAgIDxQYWNrYWdlPlAxMTExMTE8L1BhY2thZ2U+CiAgICA8UVJDb2RlPjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5PC9RUkNvZGU+CiA8L0xhYmVsRm9ybT4KIDxMYWJlbEZvcm0+CiAgICA8RGVsaXZlcnlJZD44MDAwMzEyPC9EZWxpdmVyeUlkPgogICAgPFBvc2l0aW9uPjAwMTA8L1Bvc2l0aW9uPgogICAgPE1hdGVyaWFsTm8+TTEwMDAwMjwvTWF0ZXJpYWxObz4KICAgIDxRdWFudGl0eT4xMjM0NTguMzIxPC9RdWFudGl0eT4KICAgIDxQYWNrYWdlPlAxMTExMTI8L1BhY2thZ2U+CiAgICA8UVJDb2RlPjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5PC9RUkNvZGU+CiA8L0xhYmVsRm9ybT4KIDxMYWJlbEZvcm0+CiAgICAgPERlbGl2ZXJ5SWQ+ODAwMDMxMzwvRGVsaXZlcnlJZD4KICAgIDxQb3NpdGlvbj4wMDEzPC9Qb3NpdGlvbj4KICAgIDxNYXRlcmlhbE5vPk0xMDAwMDM8L01hdGVyaWFsTm8+CiAgICA8UXVhbnRpdHk+MTIzNDU4LjMyMTwvUXVhbnRpdHk+CiAgICA8UGFja2FnZT5QMTExMTEzPC9QYWNrYWdlPgogICAgPFFSQ29kZT4wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTwvUVJDb2RlPgogPC9MYWJlbEZvcm0+CjwvZm9ybTE+"
} ,
"sign":{"credentialAlias": "jackysignature",
"signatureFieldName": "signature",
"reasonInfo": "approval",
"locationInfo": "Shanghai",
"contactInfo": "email@sap.com",
"pdf":""}
,
"print":{
"numberOfCopies": 1,
"username": "test user",
"qname": "plant2",
"metadata": {
"business_metadata": {
"business_user": "user1",
"object_node_type": "object_node_1"
},
"version": 1.2
},
"printContents": [
{
"objectKey": "",
"documentName": "dn80000095"
}
]
},
"cmis": {
"name": "dn80000095",
"path": "adobeservice"
},
"email":{
"sendto": "email@sap.com",
"subject": "Digital Document Platform",
"ebody": "Digital Document Platform body",
"attachname": "dn80000095.pdf"
}
}
Check result in email:
check result in document management service:
check result in print service:
Note:
You can combine the following 5 abilities base on real requirements
1, Generate PDF documents base on predefined formate with business data .(required)
2, Sign the PDF documents with own certificate. (optional)
3, Send the PDF documents by Email .(optional)
4, Store the PDF document into document management system .(optional)
5, Print the PDF document to a specific local printer .(optional)
For example, we only need 1, 2, 3, we can use the following JSON
{"render":{
"embedFont": 0,
"formLocale": "en_US",
"formType": "interactive",
"taggedPdf": 1,
"xdpTemplate": "labelprint3/labelprint3",
"xmlData": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGZvcm0xPgogICA8TGFiZWxGb3JtPgogICAgICA8RGVsaXZlcnlJZD44MDAwMzExPC9EZWxpdmVyeUlkPgogICAgICA8UG9zaXRpb24+MDAxMDwvUG9zaXRpb24+CiAgICAgIDxNYXRlcmlhbE5vPk0xMDAwMDE8L01hdGVyaWFsTm8+CiAgICAgIDxRdWFudGl0eT4xMjM0NTYuMzIxPC9RdWFudGl0eT4KICAgICAgPFBhY2thZ2U+UDExMTExMTwvUGFja2FnZT4KICAgICAgPFFSQ29kZT4wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTwvUVJDb2RlPgogICA8L0xhYmVsRm9ybT4KICAgPExhYmVsRm9ybT4KICAgICAgPERlbGl2ZXJ5SWQ+ODAwMDMxMjwvRGVsaXZlcnlJZD4KICAgICAgPFBvc2l0aW9uPjAwMTA8L1Bvc2l0aW9uPgogICAgICA8TWF0ZXJpYWxObz5NMTAwMDAyPC9NYXRlcmlhbE5vPgogICAgICA8UXVhbnRpdHk+MTIzNDU4LjMyMTwvUXVhbnRpdHk+CiAgICAgIDxQYWNrYWdlPlAxMTExMTI8L1BhY2thZ2U+CiAgICAgIDxRUkNvZGU+MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk8L1FSQ29kZT4KICAgPC9MYWJlbEZvcm0+CiAgIDxMYWJlbEZvcm0+CiAgICAgICA8RGVsaXZlcnlJZD44MDAwMzEzPC9EZWxpdmVyeUlkPgogICAgICA8UG9zaXRpb24+MDAxMzwvUG9zaXRpb24+CiAgICAgIDxNYXRlcmlhbE5vPk0xMDAwMDM8L01hdGVyaWFsTm8+CiAgICAgIDxRdWFudGl0eT4xMjM0NTguMzIxPC9RdWFudGl0eT4KICAgICAgPFBhY2thZ2U+UDExMTExMzwvUGFja2FnZT4KICAgICAgPFFSQ29kZT4wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTwvUVJDb2RlPgogICA8L0xhYmVsRm9ybT4KICAgPExhYmVsRm9ybT4KICAgIDxEZWxpdmVyeUlkPjgwMDAzMTE8L0RlbGl2ZXJ5SWQ+CiAgICA8UG9zaXRpb24+MDAxMDwvUG9zaXRpb24+CiAgICA8TWF0ZXJpYWxObz5NMTAwMDAxPC9NYXRlcmlhbE5vPgogICAgPFF1YW50aXR5PjEyMzQ1Ni4zMjE8L1F1YW50aXR5PgogICAgPFBhY2thZ2U+UDExMTExMTwvUGFja2FnZT4KICAgIDxRUkNvZGU+MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk8L1FSQ29kZT4KIDwvTGFiZWxGb3JtPgogPExhYmVsRm9ybT4KICAgIDxEZWxpdmVyeUlkPjgwMDAzMTI8L0RlbGl2ZXJ5SWQ+CiAgICA8UG9zaXRpb24+MDAxMDwvUG9zaXRpb24+CiAgICA8TWF0ZXJpYWxObz5NMTAwMDAyPC9NYXRlcmlhbE5vPgogICAgPFF1YW50aXR5PjEyMzQ1OC4zMjE8L1F1YW50aXR5PgogICAgPFBhY2thZ2U+UDExMTExMjwvUGFja2FnZT4KICAgIDxRUkNvZGU+MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk8L1FSQ29kZT4KIDwvTGFiZWxGb3JtPgogPExhYmVsRm9ybT4KICAgICA8RGVsaXZlcnlJZD44MDAwMzEzPC9EZWxpdmVyeUlkPgogICAgPFBvc2l0aW9uPjAwMTM8L1Bvc2l0aW9uPgogICAgPE1hdGVyaWFsTm8+TTEwMDAwMzwvTWF0ZXJpYWxObz4KICAgIDxRdWFudGl0eT4xMjM0NTguMzIxPC9RdWFudGl0eT4KICAgIDxQYWNrYWdlPlAxMTExMTM8L1BhY2thZ2U+CiAgICA8UVJDb2RlPjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5PC9RUkNvZGU+CiA8L0xhYmVsRm9ybT4KIDxMYWJlbEZvcm0+CiAgICA8RGVsaXZlcnlJZD44MDAwMzExPC9EZWxpdmVyeUlkPgogICAgPFBvc2l0aW9uPjAwMTA8L1Bvc2l0aW9uPgogICAgPE1hdGVyaWFsTm8+TTEwMDAwMTwvTWF0ZXJpYWxObz4KICAgIDxRdWFudGl0eT4xMjM0NTYuMzIxPC9RdWFudGl0eT4KICAgIDxQYWNrYWdlPlAxMTExMTE8L1BhY2thZ2U+CiAgICA8UVJDb2RlPjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5PC9RUkNvZGU+CiA8L0xhYmVsRm9ybT4KIDxMYWJlbEZvcm0+CiAgICA8RGVsaXZlcnlJZD44MDAwMzEyPC9EZWxpdmVyeUlkPgogICAgPFBvc2l0aW9uPjAwMTA8L1Bvc2l0aW9uPgogICAgPE1hdGVyaWFsTm8+TTEwMDAwMjwvTWF0ZXJpYWxObz4KICAgIDxRdWFudGl0eT4xMjM0NTguMzIxPC9RdWFudGl0eT4KICAgIDxQYWNrYWdlPlAxMTExMTI8L1BhY2thZ2U+CiAgICA8UVJDb2RlPjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5PC9RUkNvZGU+CiA8L0xhYmVsRm9ybT4KIDxMYWJlbEZvcm0+CiAgICAgPERlbGl2ZXJ5SWQ+ODAwMDMxMzwvRGVsaXZlcnlJZD4KICAgIDxQb3NpdGlvbj4wMDEzPC9Qb3NpdGlvbj4KICAgIDxNYXRlcmlhbE5vPk0xMDAwMDM8L01hdGVyaWFsTm8+CiAgICA8UXVhbnRpdHk+MTIzNDU4LjMyMTwvUXVhbnRpdHk+CiAgICA8UGFja2FnZT5QMTExMTEzPC9QYWNrYWdlPgogICAgPFFSQ29kZT4wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTwvUVJDb2RlPgogPC9MYWJlbEZvcm0+CjwvZm9ybTE+"
} ,
"sign":{"credentialAlias": "jackysignature",
"signatureFieldName": "signature",
"reasonInfo": "approval",
"locationInfo": "Shanghai",
"contactInfo": "email@sap.com",
"pdf":""},
"email":{
"sendto": "email@sap.com",
"subject": "Digital Document Platform",
"ebody": "Digital Document Platform body",
"attachname": "dn80000095.pdf"
}
}
If you are interested in this , please contact your BTP Customer success manager with this blog. We will provide futher support .
The Ends!
Thank you for your time!
Best regards!
Jacky Liu