監視フォルダーのメカニズムを使用した印刷チャネル用のインタラクティブなコミュニケーションドキュメントの生成
印刷チャネルドキュメントの設計とテストが完了したら、通常は REST 呼び出しを行ってドキュメントを生成するか、監視フォルダーのメカニズムを使用して印刷ドキュメントを生成する必要があります。
この記事では、監視フォルダーのメカニズムを使用して印刷チャネルドキュメントを生成する使用例を説明します。
ファイルを監視フォルダーにドロップすると、監視フォルダーに関連付けられたスクリプトが実行されます。 このスクリプトについては、この記事の後で説明します。
監視フォルダーにドロップされたファイルの構造は次のとおりです。 このコードは、XML ドキュメントにリストされているすべての accountnumber に関するステートメントを生成します。
<accountnumbers>
<accountnumber>509840</accountnumber>
<accountnumber>948576</accountnumber>
<accountnumber>398762</accountnumber>
<accountnumber>291723</accountnumber>
</accountnumbers>
以下のコードでは、次の処理が行われます。
1 行目:InteractiveCommunicationsDocument へのパス
15~20 行目:監視フォルダーにドロップされた XML ドキュメントから accountnumber のリストを取得します
24~25 行目:ドキュメントに関連付けられた PrintChannelService と印刷チャネルを取得します。
30 行目:accountnumber をキー要素としてフォームデータモデルに渡します。
32~36 行目:生成するドキュメントのデータオプションを設定します。
38 行目:ドキュメントをレンダリングします。
39~40 行目:生成したドキュメントをファイルシステムに保存します。
フォームデータモデルの REST エンドポイントには、入力パラメーターとして ID が必要です。以下のスクリーンショットに示すように、この ID は accountnumber と呼ばれるリクエスト属性にマッピングされます。
var interactiveCommunicationsDocument = "/content/forms/af/retirementstatementprint/channels/print/";
var saveLocation = new Packages.java.io.File("c:\\scrap\\loadtesting");
if(!saveLocation.exists())
{
saveLocation.mkdirs();
}
var inputMap = processorContext.getInputMap();
var entry = inputMap.entrySet().iterator().next();
var inputDocument = inputMap.get(entry.getKey());
var aemDemoListings = sling.getService(Packages.com.mergeandfuse.getserviceuserresolver.GetResolver);
var resourceResolver = aemDemoListings.getServiceResolver();
var resourceResolverHelper = sling.getService(Packages.com.adobe.granite.resourceresolverhelper.ResourceResolverHelper);
var dbFactory = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance();
var dBuilder = dbFactory.newDocumentBuilder();
var xmlDoc = dBuilder.parse(inputDocument.getInputStream());
var nList = xmlDoc.getElementsByTagName("accountnumber");
for(var i=0;i<nList.getLength();i++)
{
var accountnumber = nList.item(i).getTextContent();
resourceResolverHelper.callWith(resourceResolver, {call: function()
{
var printChannelService = sling.getService(Packages.com.adobe.fd.ccm.channels.print.api.service.PrintChannelService);
var printChannel = printChannelService.getPrintChannel(interactiveCommunicationsDocument);
var options = new Packages.com.adobe.fd.ccm.channels.print.api.model.PrintChannelRenderOptions();
options.setMergeDataOnServer(true);
options.setRenderInteractive(false);
var map = new Packages.java.util.HashMap();
map.put("accountnumber",accountnumber);
// Required Data Options
var dataOptions = new Packages.com.adobe.forms.common.service.DataOptions();
dataOptions.setServiceName(printChannel.getPrefillService());
dataOptions.setExtras(map);
dataOptions.setContentType(Packages.com.adobe.forms.common.service.ContentType.JSON);
dataOptions.setFormResource(resourceResolver.resolve(interactiveCommunicationsDocument));
options.setDataOptions(dataOptions);
var printDocument = printChannel.render(options);
var statement = new Packages.com.adobe.aemfd.docmanager.Document(printDocument.getInputStream());
statement.copyToFile(new Packages.java.io.File(saveLocation+"\\"+accountnumber+".pdf"));
}
});
}
ローカルシステムでこれをテストするには、次の手順に従ってください。
-
こちらの記事にあるように、Tomcat を設定します。Tomcat には、サンプルデータを生成する war ファイルがあります。
-
こちらの記事の説明に従って、サービスユーザー(システムユーザー)を設定します。
このシステムユーザーが次のノードに対する読み取り権限を持っていることを確認します。 権限を付与するには、ユーザー管理者でログインしてシステムユーザーの「データ」を検索し、「権限」タブに移動して、次のノードで読み取り権限を付与します。- /content/dam/formsanddocuments
- /content/dam/formsanddocuments-fdm
- /content/forms/af
-
パッケージマネージャーを使用して、次のパッケージを AEM に読み込みます。 このパッケージには、次の内容が含まれます。
-
the /etc/fd/watchfolder/scripts/PrintPDF.ecma ファイルを開きます。 1 行目の interactiveCommunicationsDocument へのパスが、印刷する正しいドキュメントを指していることを確認します
-
2 行目の設定に従って saveLocation を変更します。
-
次の内容の accountnumbers.xml ファイルを作成します。
<accountnumbers>
<accountnumber>1</accountnumber>
<accountnumber>100</accountnumber>
<accountnumber>101</accountnumber>
<accountnumber>1009</accountnumber>
<accountnumber>10009</accountnumber>
<accountnumber>11990</accountnumber>
</accountnumbers>
-
accountnumbers.xml を C:\RenderPrintChannel\input フォルダーにドロップします。
-
生成された PDF ファイルは、ecma スクリプトで指定された saveLocation に書き込まれます。