PDFを操作するなら「Adobe Document Services API」が便利！

※この記事のアップデート版を以下で公開しています。最新情報はそちらをご覧ください！

https://qiita.com/ryos_adobe/items/7fb1041f908dd6139ca7

はじめに
--------

Adobe Document Servicesは、Acrobatなどのアプリケーションで提供されている、PDFを操作する機能を実装したクラウドサービスです。個々の機能を「PDF verb」と呼び、Adobe Document Services APIを用いてPDF verb単位でアプリケーションに組み込むことができます。

![PDF_verbs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/28b9b15f-330c-0b06-d69c-f8f56213f79d.png)

この記事では、Adobe Document Services APIの概要と、実際にAPIを呼び出してPDFを操作したり表示したりするための手順について紹介します。


Adobe Document Services APIとは
--------

Adobe Document Services APIは、次の4つのAPIで構成されています。

### PDF Services API

PDF Services APIを使えば、ドキュメントをプログラムから操作したり、さまざまなドキュメントワークフローを自動化したりできます。Officeファイル等をPDFに変換する、PDFをパスワードで保護する、圧縮や最適化（リニアライズ）する、ページの挿入や並べ替えなどをする、OCRを実行する、といった操作が可能です。

### Document Generation API

Document Generation APIは、JSON形式のデータとWordテンプレートをマージして高品質なPDFやWordドキュメントを生成します。これにより、契約書、インボイス、レポートなどの定型的なドキュメントを効率良く作成できます。ライセンス上は、Document Generation APIは、PDF Services APIの一部として提供されます。

### PDF Extract API

PDF Extract APIは、アドビのAIテクノロジーであるAdobe Senseiを利用してPDFを解析します。テキスト、図、表を認識し、読み順や書式の情報とともに構造化されたJSONデータを出力します。スキャンされたPDFも解析できます。ライセンス上は、PDF Extract APIは、PDF Services APIの一部として提供されます。

### PDF Embed API

PDF Embed APIを使えば、WebアプリにPDFの閲覧機能を簡単に追加できます。コメントや描画などをサポートするコラボレーション機能や、PDFイベントのトラッキングが可能なアナリティクス機能も提供しており、Webアプリのユーザ体験を拡張するのに役立ちます。

<p>
YouTubeにAdobe Document Services APIの紹介動画がアップされていますので、こちらもご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/GCpSy78IDoE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


Adobe I/Oは情報源
--------

Adobe Document Services APIに関するリソースは、アドビのデベロッパ向けサイト[Adobe I/O](https://www.adobe.io/document-services/apis/pdf-services/)に集約されています（Adobe I/Oのトップページからは Products > Adobe PDF Services API または Adobe PDF Embed API）。

![AdobeIO_dcsdk_lp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/26ac3919-a958-ed51-84a7-587c85f0421a.png)

Adobe I/Oでは、次のことができます。

* APIリファレンスを含む各種ドキュメントの参照
* クレデンシャルの作成や管理
* SDKのダウンロード（PDF Services APIのみ）

PDF Services APIのクレデンシャルは最長6ヶ月間、1,000回のAPIコールに使用できます。PDF Embed APIは無償であり、期限やAPIコール回数に制限はありません。

Adobe I/Oを利用するには`Adobe ID`が必要です。まだ持っていない場合は、[こちら](https://helpx.adobe.com/jp/manage-account/using/create-update-adobe-id.html)のヘルプページを参考にAdobe IDを作成してください。


PDF Services APIをSDKから呼び出してPDFを操作する
--------

PDF Services APIはSDKから呼び出すこともできます。Adobe I/Oでトライアル用にクレデンシャルを作成し、SDKをダウンロードして実行してみましょう（Document Generation APIやPDF Extract APIも使えるようになります）。ここでは、[Node.js](https://nodejs.org/ja/)（JavaScript）用のSDKを使います。他にもJava用や.NET用のSDKが提供されています。

### クレデンシャルの作成とSDKのダウンロード

[Adobe I/O](https://www.adobe.io/document-services/apis/pdf-services/)のページ右上の`Get credentials`ボタンをクリックするとクレデンシャルの作成ができます。PDF SERVICES APIの`Create credentials`ボタンを押すと新しいクレデンシャルを作成できます。

![AdobeIO_Get_Started.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/dc4bd258-00ba-4b42-ab5e-a2d290d72558.png)

`Adobe PDF Services API Free Trial`の画面ですべての項目を入力します。`developer terms`（アドビデベロッパー利用条件）を確認し、同意したら`Create Credentials`ボタンを押します。

![AdobeIO_Get_Credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/b42ec8f7-d2f4-8caf-023e-1ca2cbcb4a40.png)

ここでは各項目はそれぞれ以下のように入力しました。

| 項目                             | 入力値                                          |
| :------------------------------ | :--------------------------------------------- |
| Credentials Name                | dcsdk-jp-credentials                           |
| Create personalized code sample | YES                                            |
| Choose language                 | Node.js                                        |

クレデンシャルが作成されると以下のような画面が表示されます。この情報は、[Adobe Developer Console](https://console.adobe.io/home)からも確認できます。

![AdobeIO_Credentials_Created.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/2e77b970-3bd5-8232-5416-22625eba824d.png)

クレデンシャルを作成するとSDK（PDFServicesSDK-Node.jsSamples.zip）もダウンロードされます。開発言語としてJavaScript（Node.js）を選択したため、SDKにはNode.js向けのサンプルコードが含まれています。

### SDKのセットアップと実行

SDKがダウンロードできたら、Node.jsの環境をセットアップします。詳しい手順は、Adobe I/Oの[Documentation](https://developer.adobe.com/document-services/docs/overview/pdf-services-api/#nodejs)のページをご覧ください。

![NodeJS_Documentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/93de808e-26b5-f141-50d2-1d6d3a4c9b64.png)

以下では、最小限の手順のみを示します。

<b>1. Node.jsのインストール</b>

この記事の執筆時点では、Node.js 10.13.0 以降がサポートされています。まだインストールされていない場合は、[Node.jsのサイト](https://nodejs.org/ja/)からダウンロードしてインストールしてください。

<b>2. SDKのインストール</b>

ダウンロードしたSDKを適当な場所で解凍してください。SDKのフォルダ階層は以下のようになっています。クレデンシャル作成時に`Create personalized code sample`をチェックしているため、作成されたクレデンシャルの情報（`pdfservices-api-credentials.json`）もSDKに含まれています。

```
PDFServicesSDK-Node.js.Samples
 │  README.txt
 │  private.key
 └─ adobe-dc-pdf-services-sdk-node-samples
     │  CODE_OF_CONDUCT.md
     │  LICENSE.md
     │  package.json
     │  pdfservices-api-credentials.json
     │  private.key
     │  README.md
     ├─ config
     │    pdfservices-sdk-log4js-config.json
     ├─ resources
     │    baseInput.pdf
     │    combineFileWithPageRangeInput1.pdf
     │    (...)
     └─ src
         ├─ combinepdf
         │    combine-pdf-with-page-ranges.js
         │    combine-pdf.js
         ├─ compresspdf
         │  (...)
         └─ splitpdf
            (...)
```

<b>3. SDKのセットアップ</b>

ターミナル（Macの場合、Windowsではコマンドプロンプト）を開いて以下を実行します。SDKのサンプルフォルダ(`adobe-dc-pdf-services-sdk-node-samples`)に移動して、`npm install`を実行します。

```zsh
% cd PDFServicesSDK-Node.js.Samples/adobe-dc-pdf-services-sdk-node-samples
% npm install --save @adobe/pdfservices-node-sdk
```

SDKをセットアップした直後は、処理結果が保存される`output`フォルダがありませんので、ここで作成しておきましょう。

```zsh
% mkdir -p output
```

これでSDKの準備ができました。

<b>4. PDF Services APIでWordファイルをPDFに変換してみる</b>

では早速、SDKを試してみましょう。OfficeファイルをPDFに変換する機会は多いですよね。動作確認を兼ねてサンプルのWordファイルをPDFファイルに変換してみましょう。このサンプルプログラムは、Wordファイル`resources/createPDFInput.docx`をPDFに変換して`output/createPDFFromDOCX.pdf`に保存します。

```zsh
% node src/createpdf/create-pdf-from-docx.js
```

左が変換前（Wordファイル）、右が変換後（PDFファイル）です。問題なく変換されました！（当たり前か）

![CreatePDF_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/117a22e8-8bae-9e91-8697-ddf7d82cbdeb.png)

`src`フォルダ配下には他にも様々なサンプルプログラムがあります。例えば、上のように作成したPDFを圧縮して、パスワード保護するといった処理も簡単に行えます。


PDF Embed APIでWebアプリにPDFビューアを埋め込む
--------

### PDF Embed APIの呼び出し方

PDF Embed APIはJavaScriptのAPIであり、HTMLに以下のようなごく短いコードを埋め込むだけで使用できます。豊富なオプションによって、埋め込みモードの指定、UIのカスタマイズ、アノテーションツールの使用、Adobe Analyticsやイベントハンドラを利用したアナリティクスが可能です。PDFを表示するシンプルなプラグインと比べて、リッチなPDF体験をユーザに提供できるようになります。詳しくは、Adobe I/Oの[Documentation](https://www.adobe.io/document-services/docs/overview/pdf-embed-api/)のページをご覧ください。

```html
<div id="adobe-dc-view"></div>
<script src="https://documentcloud.adobe.com/view-sdk/main.js"></script>
<script type="text/javascript">
document.addEventListener("adobe_dc_view_sdk.ready", function()
{
    var adobeDCView = new AdobeDC.View({clientId: "<YOUR_CLIENT_ID>", divId: "adobe-dc-view"});
    adobeDCView.previewFile(
    {
        content: {location: {url: "<DOCUMENT_URL>"}},
        metaData: {fileName: "<FILE_NAME>"}
    });
});
</script>
```

### PDF Embed APIのクレデンシャルを作成する

前述したコード中の`<YOUR_CLIENT_ID>`に指定するクライアントID（APIキー）は、PDF Embed APIのクレデンシャルを作成することで取得できます。PDF Embed APIのクレデンシャルはPDF Services APIのものとは異なりますが、同様の手順で作成することができます。[Adobe I/O](https://www.adobe.io/document-services/apis/pdf-services/)のページの右上にある`Get credentials`ボタンを押して、`PDF EMBED API`の`Create credentials`ボタンを押します。

![AdobeIO_Get_Started_Embed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/cbe8878a-7f3b-bd64-59c2-a9b20116d712.png)

`Credentials Name`と`Application Domain`を入力します。クライアントIDはここで指定した`Application Domain`に紐づき、他のドメインでは認証されませんのでご注意ください。

![AdobeIO_Get_Embed_Credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/5fd81711-60bc-b505-50b3-862a77096f3c.png)

クレデンシャルが作成されると以下のような画面が表示され、クライアントIDが確認できます。

![AdobeIO_Embed_Credentials_Created.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/d0c9fcce-e42f-d3c4-b820-13267ac89bb6.png)


###　PDF Embed APIの動作例

PDF Embed APIの動作は[オンラインデモ](https://documentcloud.adobe.com/view-sdk-demo/index.html#/view/FULL_WINDOW/Bodea%20Brochure.pdf)で確認できます。このページでは、表示するPDFを変更したり、動作をカスタマイズしたりするだけでなく、それを反映したコードの生成もできます。コードをコピーしてクライアントIDなどを設定すればすぐに使えるので、非常に便利です。

![Embed_demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393004/21559c45-ad6e-1b30-978b-fb84cc3b900e.png)


まとめ
--------

Adobe Document Services APIについて紹介しました。また、PDF Services APIのトライアル用のクレデンシャルを作成し、SDKをセットアップして、サンプルプログラムを実行するまでの手順を解説しました。PDF Embed APIを用いてWebアプリにPDFビューアを埋め込む方法についても解説しました。SDKに含まれるサンプルプログラムやPDF Embed APIのオンラインデモには活用方法のヒントがたくさん含まれていますので、是非いろいろお試しください！