フォーム添付ファイルのアセンブリ
この記事では、指定された順序でアダプティブフォームの添付ファイルを組み合わせるためのアセットを提供します。このサンプルコードを機能させるには、フォームの添付ファイルを PDF 形式にします。次にユースケースを示します。
ユーザーがアダプティブフォームに入力すると、フォームに 1 つ以上の PDF ドキュメントが添付されます。
フォーム送信時に、フォームの添付ファイルを組み合わせて 1 つの PDF を生成します。最終的な PDF を生成するために組み合わせる添付ファイルの順序を指定できます。
WorkflowProcess インターフェイスを実装する OSGi コンポーネントの作成
com.adobe.granite.workflow.exec.WorkflowProcess インターフェイスを実装する OSGi コンポーネントを作成します。このコンポーネントのコードは、AEM ワークフローのプロセスステップコンポーネントに関連付けることができます。このコンポーネントには、com.adobe.granite.workflow.exec.WorkflowProcess インターフェイスの実行メソッドが実装されています。
AEM ワークフローをトリガーするためにアダプティブフォームが送信されると、送信されたデータはペイロードフォルダーの下にある指定されたファイルに保存されます。例えば、次のようなデータファイルが送信されます。idcard タグと bankstatements タグで指定された添付ファイルを組み合わせる必要があります。
タグ名の取得
以下のスクリーン ショットに示すように、添付ファイルの順序は、ワークフローのプロセスステップ引数として指定されます。ここでは、idcard フィールドに追加された添付ファイル、bankstatements フィールドに追加された添付ファイルの順にアセンブリします。
次のコードスニペットは、プロセス引数から添付ファイル名を抽出します
String []attachmentNames = arg2.get("PROCESS_ARGS","string").toString().split(",");
添付ファイル名から DDX を作成
次に、ドキュメントを組み合わせるために Assembler サービスで使用される Document Description XML(DDX)ドキュメントを作成します。以下は、プロセス引数から作成された DDX です。NoForms 要素を使用すると、XFA ベースのドキュメントを作成する前に統合できます。PDF ソース要素は、プロセス引数で指定された順番で正しく配置されます。
ドキュメントのマップを作成
次に、添付ファイル名をキー、添付ファイルを値としてドキュメントのマップを作成します。Query Builder サービスを使用して、ペイロードパスの下にある添付ファイルに対してクエリを実行し、ドキュメントのマップを作成しました。このドキュメントのマップと DDX は、Assembler サービスで最終的な PDF を作成するために必要です。
public Map<String, Object> createMapOfDocuments(String payloadPath,WorkflowSession workflowSession )
{
Map<String, String> queryMap = new HashMap<String, String>();
Map<String,Object>mapOfDocuments = new HashMap<String,Object>();
queryMap.put("type", "nt:file");
queryMap.put("path",payloadPath);
Query query = queryBuilder.createQuery(PredicateGroup.create(queryMap),workflowSession.adaptTo(Session.class));
query.setStart(0);
query.setHitsPerPage(30);
SearchResult result = query.getResult();
log.debug("Get result hits "+result.getHits().size());
for (Hit hit : result.getHits()) {
try {
String path = hit.getPath();
log.debug("The title "+hit.getTitle()+" path "+path);
if(hit.getTitle().endsWith("pdf"))
{
com.adobe.aemfd.docmanager.Document attachmentDocument = new com.adobe.aemfd.docmanager.Document(path);
mapOfDocuments.put(hit.getTitle(),attachmentDocument);
log.debug("@@@@Added to map@@@@@ "+hit.getTitle());
}
}
catch (Exception e)
{
log.debug(e.getMessage());
}
}
return mapOfDocuments;
}
Assembler サービスを使用したドキュメントのアセンブリ
DDX とドキュメントマップが作成されたら、次の手順では Assembler サービスを使用してドキュメントを作成します。
次のコードは、DF を組み合わせ、組み合わせられた PDF を返します。
private com.adobe.aemfd.docmanager.Document assembleDocuments(Map<String, Object> mapOfDocuments, com.adobe.aemfd.docmanager.Document ddxDocument)
{
AssemblerOptionSpec aoSpec = new AssemblerOptionSpec();
aoSpec.setFailOnError(true);
AssemblerResult ar = null;
try
{
ar = assemblerService.invoke(ddxDocument, mapOfDocuments, aoSpec);
return (com.adobe.aemfd.docmanager.Document) ar.getDocuments().get("GeneratedDocument.pdf");
}
catch (OperationException e)
{
log.debug(e.getMessage());
}
return null;
}
ペイロードフォルダーの下に作成した PDF を保存します。
最後の手順では、組み合わせた PDF をペイロードフォルダーに保存します。ワークフローの後続の手順でこの PDF にアクセスして、さらに処理することができます。
次のコードスニペットを使用して、ペイロードフォルダーの下にファイルを保存しました
Session session = workflowSession.adaptTo(Session.class);
javax.jcr.Node payloadNode = workflowSession.adaptTo(Session.class).getNode(workItem.getWorkflowData().getPayload().toString());
log.debug("The payload Path is "+payloadNode.getPath());
javax.jcr.Node assembledPDFNode = payloadNode.addNode("assembled-pdf.pdf", "nt:file");
javax.jcr.Node jcrContentNode = assembledPDFNode.addNode("jcr:content", "nt:resource");
Binary binary = session.getValueFactory().createBinary(assembledDocument.getInputStream());
jcrContentNode.setProperty("jcr:data", binary);
log.debug("Saved !!!!!!");
session.save();
以下に、フォーム添付ファイルを組み合わせて保存した後のペイロードフォルダー構造を示します。
この機能を AEM Server で動作させるには
- フォーム添付ファイルのアセンブリフォームをローカルシステムにダウンロードします。
- フォームとドキュメントページからフォームを読み込みます。
- ワークフローをダウンロードし、パッケージマネージャーを使用して AEM に読み込みます。
- カスタムバンドルをダウンロードします
- Web コンソールを使用してバンドルをデプロイして開始します
- ブラウザーで添付ファイルのアセンブリフォームにアクセスします
- ID ドキュメントに添付ファイルを追加し、いくつかの PDF ドキュメントを銀行取引明細書セクションに追加します
- フォームを送信してワークフローをトリガーします
- 組み合わせた PDF の crx にあるワークフローのペイロードフォルダーを確認します