InDesign Dynamic Deck - Integrate Adobe Experience Manager & Adobe InDesign Server

<!-- InDesign Dynamic Deck - Integrate Adobe Experience Manager & Adobe InDesign Server -->

今日は [InDesign Dynamic Deck](https://adobe-consulting-services.github.io/acs-aem-commons/features/indesign-dynamic-deck/index.html) をローカル開発環境で試します。基本的に最後のおまけ以外はこのリンク先の猿真似をやります

先に紹介した [IDS](https://www.adobe.com/jp/products/indesignserver.html) と [Adobe Experience Manager(AEM)](https://business.adobe.com/jp/products/experience-manager/adobe-experience-manager.html) と連携させ、DAM(AEM Assets) に保存された素材を使用し、 編集工程を自動化させるのを検証します。編集処理の成果物はカタログ版下データ等を想定しています

*※ [Adobe Experience Manager(AEM)](https://business.adobe.com/jp/products/experience-manager/adobe-experience-manager.html) は [CMS](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0), [DAM](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E8%B3%87%E7%94%A3%E7%AE%A1%E7%90%86) などを内包するアドビ製品群の一角です*

## 前提条件

* システム要件は [前回のとおり](https://qiita.com/o2346/items/7c9f84b1822a43b95e64)
* [AEMがインストール](https://experienceleague.adobe.com/docs/experience-manager-learn/foundation/development/set-up-a-local-aem-development-environment.html?lang=ja) されていること
* IDS がインストールされていること（前回参照）

## 準備

1. AEM 起動
1. IDS 起動
    * `InDesignServer -port 8080`
    * ポート番号注意。前回と異なります
1. [ACS AEM Commons](https://github.com/Adobe-Consulting-Services/acs-aem-commons/releases) 最新版 zip を DL (2021/08/10時点では 5.0.6 - 2021-07-12)
1. `pack=/[DOWNLOADPATH]/acs-aem-commons-content-X.X.X-min.zip; curl -u [USER]:[PASS] -F file=@"$pack" -F name="$pack" -F force=true -F install=true http://localhost:4502/crx/packmgr/service.jsp`
1. [InDesign Dynamic Deck Samples package](https://adobe-consulting-services.github.io/acs-aem-commons/features/indesign-dynamic-deck/indesign-dynamic-deck-samples-1.2.zip) を DL
1. `pack=/[DOWNLOADPATH]/indesign-dynamic-deck-samples-X.X.zip; curl -u [USER]:[PASS] -F file=@"$pack" -F name="$pack" -F force=true -F install=true http://localhost:4502/crx/packmgr/service.jsp`

*※  AEM の追加パッケージは GUI を介してインストールすることも多いと思いますが、 [コマンドラインでも可能です](https://helpx.adobe.com/experience-manager/kb/common-AEM-Curl-commands.html)。 私は CLI が好きだしそのほうが楽なので、上記 2 点のパッケージに対してこうしています*

## 実行

AEM の UI で InDesign Dynamic Deck に行きます

![Screen Shot 2021-08-10 at 18.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/814b42b2-63bf-db3e-31c7-21470429a543.png)
![Screen Shot 2021-08-10 at 18.02.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/d0572c52-df96-6e4e-caba-38fcb7b65ea2.png)

このように入力し、実行

![Screen Shot 2021-08-11 at 14.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/51ba9831-01c8-2a37-910e-c6381718ef41.png)

すると IDS 側でこういう出力があります

```
Tue Aug 10 17:04:21 2021 INFO   [javascript] Executing Script
Tue Aug 10 17:04:21 2021 INFO   [script] Started IDSPrint Script - Export generation...
Tue Aug 10 17:04:21 2021 INFO   [script] Fetching resource from CQ (for IDSPrint): localhost:4502/content/dam/dynamic-deck-dynamo/templates/get-outside-template-2020/get-outside-template-3.0-2020.indd to /Applications/Adobe%20InDesign%20Server%202020/INDD-SERVER-DOCUMENTS/1111111111111/simple_deck_example.indd
Tue Aug 10 17:04:22 2021 WARN   [font manager] Missing Font Gin Regular
Tue Aug 10 17:04:22 2021 WARN   [font manager] Missing Font ScriptoramaJF Tradeshow
Tue Aug 10 17:04:22 2021 INFO   [script] Started PDF generation...
Tue Aug 10 17:04:23 2021 INFO   [script] Finished PDF generation...
Tue Aug 10 17:04:23 2021 INFO   [script] Started JPG generation...
Tue Aug 10 17:04:24 2021 INFO   [script] Finished JPG generation...
Tue Aug 10 17:04:24 2021 INFO   [script] Started INDD generation...
Tue Aug 10 17:04:24 2021 INFO   [script] INDD generation Finished...
Tue Aug 10 17:04:24 2021 INFO   [script] Finished pdf Pages export...
Tue Aug 10 17:04:24 2021 INFO   [script] Posting to location: /var/proxy/jobs/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/renditions
Tue Aug 10 17:04:24 2021 INFO   [script] Finished IDSPrint Script - Export generation...
```

出力先に行ってみると、

![Screen Shot 2021-08-11 at 14.14.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/7c3031c1-3a3d-afdb-9601-a25036010459.png)


できました

## 所感

このことから判るのは、次のとおりです

1. AEM と IDS の連携動作は可能
1. DAM から素材取得 -> IDS で編集 -> DAM に成果物保存という一連のタスクをネイティブに自動化できる可能性を示した
1. XML によりデータとテンプレートを関連付ていて、 ExtendScript のコーディングを要しない設計も可能（理想的な条件下では）

### 課題 - テキストデータの入力について

成果物には Title, Description がテキスト情報として配置されています。これはどこから来たのでしょうか。 DAM にある元画像を見たところ、 Exif に同じ文字列が書き込まれていました。したがって この InDesign Dynamic Deck が入力として受け入れているアセットはあくまでも画像のみで、Exif 情報から文字列を参照、マッピングしているのではないかと推測します

### 課題 - ExtendScript について

前出の 2, 3 について少し考えてみます。
こういっては何ですが、 ExtendScript という誰もが使い慣れているわけではない言語で開発するのを省略できるのには大きな価値があります。しかし本ツールで成果物.indd を得られたまでは良いものの、微妙に修正したい箇所が残ってしまった、というケースも想定されます。
基本はテンプレートとデータをしっかり設計しておくことで、そもそもそのような事態を抑止させる、というのが正解でしょう。しかしどうしても後からでないとできない修正、というのも無いわけでもないのです。そういった場合、 また 成果物.indd を開いて編集するわけですが、その工程も自動化できるものならしたいですよね。その場合は、その成果物.indd をまた任意のカスタム ExtensScript とともに IDS 送りにすればよいでしょう。それが可能であることは [こちら](https://experienceleague.adobe.com/docs/experience-manager-65/assets/administer/indesign.html?lang=ja#how-the-extraction-works) で解説されています。 前回 IDS で Hellow World したときは特に入力ファイルは設けませんでしたが、当然ペイロードを設定することも可能なわけです。

そしてやはりそのような場合でもテンプレートとデータの設計品質は高く保っておくことが重要かと思います。これが残念になると ExtensScript で書かなければいけないことが肥大化し、不本意な開発を余儀なくされる恐れがあるからです。不本意と言っても、とくに駆け出しのプログラマは逆に自身の専門領域ということで、プログラムで出来ることをなんでもそれ一つでやりたがる傾向があります。しかしぜひそこは手を動かす前にデータ設計やテンプレートの性能などコーディング以外の要素にも目を向けましょう。書かずに楽に済ませる方法が無いかは常に注目すべきテーマです。 ExtensScript はあくまでも最終手段的な位置づけとして、どうしてもそれでしかできない事だけを必要最小限の範囲内で書くに留めるように配慮した設計をおすすめする次第です

## おまけ: 画像の代わりに CF を入力値にしてみる

DAM アセットを SQL で取得する方法があります。InDesign Dynamic Deck にも3つの画像検索クエリが同梱されていまして、前項でもそれを利用していました。そのサンプルクエリを参考に Content Fragment(s) を取得する SQL を作ってみました

`SELECT s.* FROM [dam:Asset] AS s where ISDESCENDANTNODE(s, "/content/dam/dynamic-deck-dynamo/get-outside-assets") AND s.[jcr:content/contentFragment] = true`

![Screen Shot 2021-08-11 at 16.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/ed3a865a-805d-5412-c207-3a863c199c69.png)
*※事前に対象のディレクトリ内にサンプルの CF を作成しています*

このクエリを InDesign Dynamic Deck で登録し、
![Screen Shot 2021-08-11 at 16.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/b03e2a18-a6a4-d1f7-4bc0-7021727a7b7e.png)

実行すると
![Screen Shot 2021-08-11 at 16.47.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/916a09de-ac95-97e8-5649-b668bb4a95a4.png)

こうなります
![indd_from_cf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/cce4e56e-4683-a24c-ef75-c1372e5bd6b2.png)


<!--
thanks to
https://drfits.com/jcr-sql2-query-with-examples/
http://www.6dglobal.com/blog/9-jcr-sql-2-queries-every-aem-dev-should-know-2014-10-07
https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/does-aem-query-builder-api-allow-searching-the-content-fragment/td-p/313324
https://gist.github.com/floriankraft/8b3720464318cd5cd9e2
-->