SAP Forms by Adobe를 사용해 보았습니다.

19980 단어 adobeSAPIFbA
만나서 반갑습니다. 첫 투고가 됩니다.
악마라고합니다.

※이 기사는 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

  • 사용법



    환경 구축



    서버를 세우고, 소프트웨어를 설치하고,,, 클라우드 서비스이므로 필요하지 않습니다!
  • 서비스 활성화
    무엇이든, 우선, 여기에서입니다.
    Neo 환경에 로그인한 후 서비스에서 Froms by Adobe가 존재하므로 여기를 활성화합니다.
  • OAuth 인증 설정
    클라이언트 설정 시의 포인트로서는, 서브스크립션을 "formsprocessing/adsrestapi"로 하는 것입니다.
  • 서식 레이아웃 작성
    그래픽으로 서식 레이아웃을 만들 수 있습니다!
    도구도 직관적이며 조작이 알기 쉽습니다. Adobe 느낌이 있습니다.
  • 서식 레이아웃 파일 UL
    3.에서 만든 서식 레이아웃 파일이지만 사용하려면 서버에 UL해야합니다.
    하지만 UL용 화면이 있으므로 간단합니다!
    Rest API에서 일부러 UL하는, 뭔가 서버에 직접 로그인하여 레이아웃 파일 copipe,,, 라고 하는 것은 없습니다.
    서비스 화면 아래쪽에 몇 가지 메뉴가 늘어서 있습니다.
    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에 한정하지 않고, 커스텀 개발에서도 사용할 수 있을 것 같습니다!

    참고 링크



    SAP Forms by Adobe REST API

    좋은 웹페이지 즐겨찾기