9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SAP Forms by Adobe使ってみた

Last updated at Posted at 2019-12-15

はじめまして。初投稿になります。
鬼瓦と申します。

※この記事は、SAP Advent Calendar 2019 の15日目の記事として投稿しています。

はじめに

SAP Cloud Platform(SCP)で帳票生成サービスが存在し、こちら触ってみたので、紹介します。
その名もSAP Cloud Platform Forms by Adobeです。
仕事でもいくつか帳票ツール触ってきましたが、これは使いやすいと思いました。
以下、個人的に感じたメリットです。

  • "Adobe"と名前がついているので、デザイン系すごそう、それっぽい
  • サービス名に"SAP"とついているが、SAPのERPが無いと動かないことは無く、ODataサービスがあるので、呼出元環境問わない
  • GUIの帳票レイアウトツールが存在する
  • サーバにレイアウトファイルをULする際、専用UIが存在し、レイアウトULも簡単
今回は、プログラミングのリハビリ、Node.js触ってみたい、という動機で、ローカルPCのNode.js環境から呼び出してみました。

開発環境

  • ローカル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

使い方

環境構築

サーバ立てて、ソフトウェアインストールして、、、は、クラウドサービスなので不要です!

  1. サービス有効化
    何がともあれ、まずは、ここからです。
    Neo環境にログイン後、サービスからFroms by Adobeが存在するので、こちらを有効化します。
    image.png

  2. OAuth認証設定
    クライアント設定時のポイントとしては、サブスクリプションを"formsprocessing/adsrestapi"にすることです。
    IFbA_OAuth.png

  3. 帳票レイアウト作成
    グラフィカルに帳票レイアウト作成できます!
    ツールも直感的で、操作がわかりやすいです。Adobe感あります。
    image.png

  4. 帳票レイアウトファイルUL
    3.で作った帳票レイアウトファイルですが、利用するには、サーバにULする必要があります。
    とはいえ、UL用画面があるので簡単です!
    Rest APIからわざわざULする、なんかサーバに直接ログインしてレイアウトファイルコピペする、、、ということはありません。
    サービス画面の下の方にいくつかメニューが並んでいます。
    REST APIテンプレートストアUIから帳票レイアウトをULできます。
    template.png
    "Create From"ボタンからフォームを作成し、右枠のTEMPLATES部分から先程作成した帳票レイアウトをULします。
    image.png

以上で、準備完了です。

テスト用コード

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の帳票ファイルが作成されました。
image.png

終わりに

以前、仕事で帳票ツール使うとなると、、、、
帳票サーバ立ち上げるの大変、、、、
修正する際はそもそもレイアウト編集用ツールが無くて大変、、、、
等々あったのですが、、、、
こちらは、両者とも簡単でとても便利でした!
SAPに限らず、カスタム開発でも使っていけそうです!

参考リンク

SAP Forms by Adobe REST API

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?