はじめまして。初投稿になります。
鬼瓦と申します。
※この記事は、SAP Advent Calendar 2019 の15日目の記事として投稿しています。
はじめに
SAP Cloud Platform(SCP)で帳票生成サービスが存在し、こちら触ってみたので、紹介します。
その名もSAP Cloud Platform Forms by Adobeです。
仕事でもいくつか帳票ツール触ってきましたが、これは使いやすいと思いました。
以下、個人的に感じたメリットです。
- "Adobe"と名前がついているので、デザイン系すごそう、それっぽい
- サービス名に"SAP"とついているが、SAPのERPが無いと動かないことは無く、ODataサービスがあるので、呼出元環境問わない
- GUIの帳票レイアウトツールが存在する
- サーバにレイアウトファイルをULする際、専用UIが存在し、レイアウトULも簡単
開発環境
-
ローカルPC Windows 10
Visual Studio Code
Node.js v12.13.1 LTS -
SAP Cloud Platform (Neo)環境
※1 現時点(2019/12/01)ではNeo環境のみ、Forms by Adobeサービスが利用可能です。 -
Adobe LiveCycle Designer 11
使い方
環境構築
サーバ立てて、ソフトウェアインストールして、、、は、クラウドサービスなので不要です!
-
サービス有効化
何がともあれ、まずは、ここからです。
Neo環境にログイン後、サービスからFroms by Adobeが存在するので、こちらを有効化します。
-
OAuth認証設定
クライアント設定時のポイントとしては、サブスクリプションを"formsprocessing/adsrestapi"にすることです。
-
帳票レイアウト作成
グラフィカルに帳票レイアウト作成できます!
ツールも直感的で、操作がわかりやすいです。Adobe感あります。
-
帳票レイアウトファイルUL
3.で作った帳票レイアウトファイルですが、利用するには、サーバにULする必要があります。
とはいえ、UL用画面があるので簡単です!
Rest APIからわざわざULする、なんかサーバに直接ログインしてレイアウトファイルコピペする、、、ということはありません。
サービス画面の下の方にいくつかメニューが並んでいます。
REST APIテンプレートストアUIから帳票レイアウトをULできます。
"Create From"ボタンからフォームを作成し、右枠のTEMPLATES部分から先程作成した帳票レイアウトをULします。
以上で、準備完了です。
テスト用コード
OAuth認証、Rest API呼び出しによるPDFファイル生成、PDFファイルのローカルファイルへの保存まで実装しました。
/**
* Authority EP Host
*/
const sAUTH_BASE_HOST = '<OAuth用Host>';
/**
* OAuth Token EP
*/
const sTOKEN_URI = '/oauth2/api/v1/token'
/**
* OAuth Client ID
*/
const sCLIENT_ID = '<OAuth用クライアントID>';
/**
* OAuth Client Secret
*/
const sCLIENT_SECRET = '<OAuth用クライアントシークレット>';
/**
* OAuth Grant Type
*/
const sGRANT_TYPE = 'client_credentials';
/**
* OAuth Grant Scope
*/
const sADS_SCOPE = 'generate-ads-output';
/**
* Forms by Adobe Base Host
* https://adsrestapiformsprocessing-<yoursubaccount>.<yourregionhost:[xxx.]hana.ondemand.com>
*/
const sPDF_SRV_HOST = '<Rest API用Host>'
/**
* PDF Generation URI
*/
const sPDF_RENDER_URI = '/ads.restapi/v1/adsRender/pdf'
/**
* PDF Render parameter
* The value means tepmlate file is read from SCP form/template storage.
*/
const sPDF_RENDER_PARAM = '?templateSource=storageName'
/**
* Generated PDF File Name in local PC
* */
const sPDF_FILE_NAME = 'test114.pdf'
/**
* PDF data (XML)
*/
const sPDF_DATA =
`<?xml version="1.0" encoding="UTF-8"?>
<form1>
<Page1>
<Form1>
<Text1>鬼瓦</Text1>
<Text2>ko-hei</Text2>
<Date1>20040606T101010</Date1>
</Form1>
</Page1>
</form1>
`;
/* Generate HTTP Client */
const fnRequest = require('request');
/* Generate Request Header */
let sAuthString = conv2Base64(sCLIENT_ID + ':' + sCLIENT_SECRET);
let oAuthHeaders = {
"Content-Type" : 'application/x-www-form-urlencoded',
"Authorization" : 'Basic ' + sAuthString
};
let sAuthBody = 'grant_type=' + sGRANT_TYPE + '&scope=' + sADS_SCOPE;
let oAuthOptions = {
"url" : sAUTH_BASE_HOST + sTOKEN_URI,
"method" : 'POST',
"headers" : oAuthHeaders,
"body" : sAuthBody,
"json" : true
};
/* Request token */
requestService('Authority', oAuthOptions, generatePDF);
/**
* Convert string as base64 format.
* @param {String} sTarget
* @return {String} Converted string as base64
*/
function conv2Base64(sTarget) {
return Buffer.from(sTarget).toString('base64');
}
/**
* HTTP Request
* @param {String} sLabel Console label
* @param {Object} oOptions Request option
* @param {Function} fnSuccess Called function when the request is called sucessfully
*/
function requestService(sLabel, oOptions, fnSuccess) {
fnRequest(oOptions, (oError, oResponse, oBody) => {
console.log('<---- ' + sLabel + ' ---->');
if (oError) {
console.log(oError);
return;
}
console.log('Successed');
fnSuccess(oResponse, oBody);
});
}
/**
* Get PDF file from SCP service.
* @param {*} oResponse HTTP Response
* @param {*} oBody HTTP Response Body
*/
function generatePDF(oResponse, oBody) {
const sToken = oBody.access_token;
let oPdfHeaders = {
"Content-Type" : 'application/json',
"Authorization" : 'Bearer ' + sToken
};
let oPdfBody = {
"xdpTemplate" : '<Form名>/<Tempalte名>', // 環境準備の4でULしたレイアウト
"xmlData" : conv2Base64(sPDF_DATA),
"formType" : 'Print',
"formLocale" : 'ja_JP',
"taggedPdf" : 0,
"embedFont" : 0
};
let oPdfOptions = {
"url" : sPDF_SRV_HOST + sPDF_RENDER_URI + sPDF_RENDER_PARAM,
"method" : 'POST',
"headers" : oPdfHeaders,
"body" : oPdfBody,
"json" : true
};
requestService('PDF Generation', oPdfOptions, outputPDFFile)
}
/**
* Output PDF to local pc from response body.
* @param {*} oResponse
* @param {*} oBody
*/
function outputPDFFile(oResponse, oBody) {
const oFileIO = require('fs');
console.log(oBody);
if (oBody.fileContent) {
let oBin_pdf = Buffer.from(oBody.fileContent, 'base64');
oFileIO.writeFile(sPDF_FILE_NAME, oBin_pdf, (err) => console.log(err));
} else {
console.log('PDF not generated.');
}
}
デモ
上記のテストコードを実行すると、以下の様なPDFがローカルに出力されます。
すごい簡単にPDFの帳票ファイルが作成されました。
終わりに
以前、仕事で帳票ツール使うとなると、、、、
帳票サーバ立ち上げるの大変、、、、
修正する際はそもそもレイアウト編集用ツールが無くて大変、、、、
等々あったのですが、、、、
こちらは、両者とも簡単でとても便利でした!
SAPに限らず、カスタム開発でも使っていけそうです!