8
5

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 5 years have passed since last update.

Box上でPDFファイル変換(Node.js編)

Last updated at Posted at 2018-03-11

#概要
この記事は、@daichiiiiiiiさんの下記記事を参考にNode.jsで実装したものです。
リスペクト記事

box上のオフィスファイルをPCにダウンロードせずにPDF変換する
https://qiita.com/daichiiiiiii/items/12c2bb163fe013f400a9

#3/21 更新
チームに見せたところ、
「ファイル上書きじゃなくて、別ファイルとしてアップロードするようにしてほしい」
と言われたので、別ファイルとしてアップロードする方法に編集しました。

#環境構築
##Box
###Box Developer Account作成
1. https://developer.box.com/へアクセスし、右上のメニューからSignUpする。
image.png
2. 確認メールが送られます。
image.png
3. メールの確認をします。
image.png
4. Boxのログイン画面が表示されるので、ログインします。
5. 設定が完了したら、Developerコンソールへアクセスします。
https://app.box.com/developers/console

###新規アプリケーションの作成
1. [アプリの新規作成]をクリックします。
image.png
2.[カスタムアプリ]を選択して、[次へ]をクリックします。
image.png
3.認証方法では、[標準OAuth2.0(ユーザー認証)]を選択して、[次へ]をクリックします。
image.png
4.アプリケーションに適当な名前をつけて[アプリの作成]をクリックします。
5.DeveloperTokenが発行されますが、ここでは使わないので、[アプリの表示]をクリックします。
image.png

###Web App Integrationの作成
1.作成したアプリケーションを開きます。
2.左のメニュー[統合]をクリックし、[新しいWebアプリ統合を作成]をクリックします。
必要な情報を入力していきます。
詳細な情報はBoxのドキュメントを参照してください。

Box Developers > Docs > Web Application Integrations
 https://developer.box.com/docs/box-web-application-integrations

  • アプリ情報
    image.png
    image.png

  • コールバック設定
    [クライアントコールバックのURL]は後に作成するHerokuのURLを入れるため、ここではダミーでhttps://localhostなどとダミーの値を入れておきます。
    image.png

  • コールバックパラメータ
    image.png

  • 認証
    image.png

  • 統合ステータス
    image.png

全て設定が終わったら右上の[変更を保存]をクリックし保存します。

##Heroku
###Heroku環境構築
Herokuは日本語の資料がありましたので、こちらのサイトを参考にして環境構築をしてください。

https://github.com/herokaijp/devcenter/wiki/quickstart

この時点では、「ステップ 3: ログイン」まで実施すれば大丈夫です。

###Herokuアプリケーション作成
1.HerokuCLIを使ってHerokuにログインします。

$ heroku login
Enter your Heroku credentials.
Email: <your email address>
Password (typing will be hidden): 
Logged in as <your email address>

2.Herokuでアプリケーションを作成します。
アプリケーション名は、Herokuの中で一意である必要があります。

$ heroku apps:create <アプリケーション名>
Creating ⬢ <アプリケーション名>... done
https://<アプリケーション名>.herokuapp.com/ | https://git.heroku.com/<アプリケーション名>.git 

3.Gitリポジトリを初期化します。

$ git init

4.リモートリポジトリとしてHerokuを追加します。

$ git remote add heroku https://git.heroku.com/<アプリケーション名>.git

5.Git管理対象外ファイル(.gitignore)を作成します。

.gitignore
.DS_Store
.gitignore
npm-debug.log
node_modules

6.Herokuがプログラム起動する際に実行するファイル(Procfile)を作成します。

web: node server.js

Herokuアプリケーションへ環境変数をセット

Boxの認証情報をHeroku環境変数としてセットしておきます。
セットする資格情報は下記の通りです。

KEY 補足
BOX_CLIENT_ID アプリのClient ID
BOX_CLIENT_SECRET アプリのClient Secret

Herokuへ環境変数を登録するコマンドは下記です。

$ heroku config:set <KEY>="<VALUE>"

#プログラミング
次は、server.jsへコードを書き、デプロイします。

##コーディング
BoxのNode.js SDKを利用します。

https://github.com/box/box-node-sdk/

以下はサンプルプログラムです。
(あくまで動作を確認するためのサンプルなので、業務で使う場合はセキュリティ等の検討を十分に行ってください。
実稼働環境におけるベスト・プラクティス: セキュリティー)

server.js
//Import Modules
var restify = require('restify');
var expressSession = require('express-session');
var BOX_CLIENT_ID = process.env.BOX_CLIENT_ID;
var BOX_CLIENT_SECRET = process.env.BOX_CLIENT_SECRET;
var Promise = require('bluebird');
var fs = require('fs');
var BoxSDK = require('box-node-sdk');
var async = require('async');
var bodyParser = require('body-parser');
var basicAuth = require('basic-auth-connect');
var helmet = require('helmet');

// Setup Restify Server
var server = restify.createServer();
server.use(bodyParser.urlencoded({ extended: true }));
server.use(expressSession({ secret: 'keyboard cat', resave: true, saveUninitialized: false }));
server.use(helmet());

server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url);
});

server.post('/api/box', function(req, res){
  var msg = 'PDFファイルに変換しています。変換が完了したら、新しいバージョンとして上書きします。' ;
  res.header('Content-Type', 'text/plain;charset=utf-8');
  res.send(msg);
    // Boxからのリクエストを受け取る
    // Boxで[PDF変換]メニューをクリックすると、BoxからPOSTで下記のパラメータが渡されます。
  var authCode = req.body.auth_code;
  var fileId = req.body.file_id;
  var fileExtension = req.body.file_extension;
  var fileName = req.body.file_name;
  var pdffilename = (fileName).replace('.' + fileExtension, '.pdf');

  var sdk = new BoxSDK({
    clientID: BOX_CLIENT_ID,
    clientSecret: BOX_CLIENT_SECRET
  });

  var tokenInfo = {};
  var pdfurl = "";

  var promise = new Promise(function(resolve, reject){ 
    // コールバックパラメーターのauth_codeを使ってAccessTokenを取得
    sdk.getTokensAuthorizationCodeGrant(authCode, null, function(err, res) {
      if(err){
        reject(err);
      }
      tokenInfo = res;
      console.log(tokenInfo);
      resolve();
    });
  });

  promise.then(function(){
    // Representations APIを使って、PDFファイルをダウンロード
    // https://developer.box.com/v2.0/reference#get-representations
    var client = sdk.getBasicClient(tokenInfo.accessToken);
    client.files.getRepresentationContent(fileId, client.files.representation.PDF)
      .then(function(stream) {
        // Boxからダウンロードしたファイルを一時的にHerokuサーバーの/tmp配下にダウンロード
        var output = fs.createWriteStream("/tmp/" + fileName);
        stream.pipe(output);
        output.on('close', function(){
          //ファイル情報から親フォルダIDを取得
          client.files.get(fileId, null, function(err, res){
            if(err){
              reject(err);
            }
            var folderId = res.parent.id;
            //新しいファイルをアップロード
            client.files.uploadFile(folderId, pdffilename, fs.createReadStream("/tmp/" + fileName), function(err, res){
              if(err){
                reject(err);
              }
            });
          });
        });
      });
  }).catch((err) => { // エラーハンドリング
    console.error(err);
  });
});

デプロイ

Herokuへデプロイします。

$ git add . && git commit -m "<your message>" && git push heroku master

ログを確認する場合は、下記コマンドです。

$ heroku logs --tail

Boxへ[クライアントコールバックのURL]をセット

  1. BoxのDeveloperコンソールを開き、作成したアプリを開きます。
  2. [統合]メニューの[コールバック設定]の[クライアントコールバックのURL]に、HerokuのアプリケーションURL+エンドポイント(https://<アプリケーション名>.herokuapp.com/api/box)を入力し、[変更を保存]します。

テスト

[・・・]→[統合]→[PDF変換]をクリック!
image.png

PDFファイルがアップロードされたようです!
image.png

新しいファイルとしてPDFに変換されたファイルがアップロードされています!
image.png

無事、PDF変換に成功しました!

この機能、業務で使えたら便利ですね。

8
5
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
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?