クラウド型 ワークフロー

Office ドキュメントのプレビューを作る方法

Box の API を使って、PDF や PowerPoint などのオフィスドキュメントを HTML にコンバートします

 

Box は、Dropbox や Google ドライブと同じく、クラウドにファイルを保存することができる、クラウドストレージサービスです。ビジネス用途に強く、複数ユーザでのファイルの共有や、だれが閲覧可能かといったセキュリティの設定がしっかりしているという特徴を持っています。以前の投稿で、Questetra BPM Suite と Box との連携について触れました。その続きではなく、今回は Box View API という別の機能についての紹介です。

 

Box View API は、PDF や Word, PowerPoint などのオフィスドキュメントを HTML に変換するサービスです。HTML なので、端末を気にせず、Webページに埋め込むことができるメリットがあります。Boxも、ドキュメントをプレビューできる機能が提供されていますが、その部分だけを切り出してサービス化されていると考えて良いでしょう。

 

最後に、Box View API を呼び出すサンプルプログラムを記載します。Java で記述しています。プログラムは引数で指定したファイルを読み込み、 Box View API を呼び出して、Box にHTMLに変換するよう指示します。プログラムの処理が最後まで進むと、

https://view-api.box.com/1/sessions/9c5c……../view

のようなURL が出力されます。このURLにブラウザでアクセスすると、以下のようなページが表示されます。HTMLに変換された結果を埋め込めれば良いのですが、変換結果にアクセスできる時間には制限があるので、画面ダンプを埋め込みます。かなり綺麗に、変換されている印象です。

pptx_converted_by_box

 

詳細はプログラム中のコメントを見ていただくとして、やっていることは、Box が提供しているチュートリアルとほぼ同じです。プログラムで定義している定数 TOKEN は、Box View API にアクセスするための API Key の値です。これについては、こちらのドキュメントを参考に、取得するようにしてください。

本来は Web アプリケーション内で使われることを想定しているサービスでしょうが、今回はコマンドラインアプリケーションで簡単に試してみました。余裕があれば Web アプリケーションの形で試してみたいと思います。

 

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.Map;

import javax.activation.FileTypeMap;

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import com.google.common.collect.Maps;

public class BoxViewAPITest {
    /** トークン */
    private static final String TOKEN = "....";

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            return;
        }
        File file = new File(args[0]);

        ClientConnectionManager connectionManager = new PoolingClientConnectionManager();
        HttpClient httpClient = new DefaultHttpClient(connectionManager);
        //multipart/form-data でドキュメントをアップロード
        HttpPost post = new HttpPost("https://upload.view-api.box.com/1/documents");
        post.setHeader("Authorization", "Token " + TOKEN);
        MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,
                                                     null,
                                                     StandardCharsets.UTF_8);
        String contentType = FileTypeMap.getDefaultFileTypeMap()
                .getContentType(file.getName());
        System.out.println(String.format("file name:%s content-type: %s",
                                         file.getName(),
                                         contentType));
        entity.addPart("file", new FileBody(file,
                                            file.getName(),
                                            contentType,
                                            null));
        post.setEntity(entity);
        HttpResponse response = httpClient.execute(post);
        if (response.getStatusLine().getStatusCode() != 202) {
            // 応答が 202 でなければ、アップロード失敗
            System.err.println(response.getEntity());
            return;
        }
        //応答の JSON から document_id を取り出し
        String responseStr = IOUtils.toString(response.getEntity().getContent());
        System.out.println(responseStr);
        JSONObject jsonObj = (JSONObject) new JSONParser().parse(responseStr);
        String documentId = (String) jsonObj.get("id");

        while (true) {
            //変換が完了しているかどうかの確認
            post = new HttpPost("https://view-api.box.com/1/sessions");
            post.setHeader("Authorization", "Token " + TOKEN);
            Map<String, Object> params = Maps.newLinkedHashMap();
            params.put("document_id", documentId);
            params.put("duration", 5);
            String jsonStr = JSONObject.toJSONString(params);
            post.setEntity(new StringEntity(jsonStr,
                                            ContentType.APPLICATION_JSON));
            response = httpClient.execute(post);
            if (response.getStatusLine().getStatusCode() != 202) {
                //応答が 202 であれば、変換処理中として、3秒後に再確認
                break;
            }
            responseStr = IOUtils.toString(response.getEntity().getContent());
            System.out.println(responseStr);
            Thread.sleep(3000);
        }
        if (response.getStatusLine().getStatusCode() != 201) {
            //応答が 201 でなければ、変換失敗
            System.err.println(response.getEntity());
            return;
        }

        //応答の JSON から URL を取り出し
        responseStr = IOUtils.toString(response.getEntity().getContent());
        System.out.println(responseStr);
        jsonObj = (JSONObject) new JSONParser().parse(responseStr);
        jsonObj = (JSONObject) jsonObj.get("urls");
        System.out.println(jsonObj.get("view"));
    }
}
あわせて読みたい
15.野望・展望・志 の前の記事 クラウド導入の成否は支援企業がカギ!
15.野望・展望・志 の次の記事 「やり続ける」と言うコト
Hatanaka Akihiro の他の記事 Salesforce の顧客データを選択肢として使用する

アーカイブ

 RSS