Cet article fournit des ressources pour assembler des pièces jointes de formulaire adaptatif dans un ordre spécifié. Les pièces jointes du formulaire doivent être au format pdf pour que cet exemple de code fonctionne. Voici le cas d’utilisation.
L’utilisateur qui remplit un formulaire adaptatif joint un ou plusieurs documents pdf au formulaire.
Lors de l’envoi du formulaire, assemblez les pièces jointes du formulaire pour générer un pdf. Vous pouvez spécifier l’ordre dans lequel les pièces jointes sont assemblées pour générer le pdf final.
Créez un composant OSGi qui implémente le Interface com.adobe.granite.workflow.exec.WorkflowProcess. Le code de ce composant peut être associé au composant d’étape de processus dans le workflow AEM. La méthode execute de l’interface com.adobe.granite.workflow.exec.WorkflowProcess est implémentée dans ce composant.
Lorsqu’un formulaire adaptatif est envoyé pour déclencher un processus d’AEM, les données envoyées sont stockées dans le fichier spécifié sous le dossier de charge utile. Il s’agit, par exemple, du fichier de données envoyé. Nous devons assembler les pièces jointes spécifiées sous la balise "idcard" et "bankstatement".
.
L’ordre des pièces jointes est spécifié en tant qu’arguments d’étape du processus dans le workflow, comme illustré dans la capture d’écran ci-dessous. Ici, nous assemblons les pièces jointes ajoutées à la carte d'identité du champ suivies de relevés de compte.
Le fragment de code suivant extrait les noms des pièces jointes des arguments de processus.
String []attachmentNames = arg2.get("PROCESS_ARGS","string").toString().split(",");
Nous devons ensuite créer Document Description XML (DDX) document utilisé par le service Assembler pour assembler des documents. Voici le DDX créé à partir des arguments de processus. L’élément NoForms vous permet d’aplatir les documents basés sur XFA avant qu’ils ne soient assemblés. Notez que les éléments source du PDF sont dans le bon ordre, comme indiqué dans les arguments du processus.
Nous créons ensuite une carte des documents avec le nom de la pièce jointe comme clé et la pièce jointe comme valeur. Query Builder a été utilisé pour interroger les pièces jointes sous le chemin de charge utile et créer la carte des documents. Cette carte du document avec le DDX est nécessaire pour que le service Assembler assemble le pdf final.
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;
}
Une fois le DDX et le document map créés, l’étape suivante consiste à utiliser AssemblerService pour assembler les documents.
Le code suivant assemble et renvoie le pdf assemblé.
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;
}
La dernière étape consiste à enregistrer le fichier pdf assemblé sous le dossier de charge utile. Ce pdf est ensuite accessible dans les étapes suivantes du workflow pour un traitement ultérieur.
Le fragment de code suivant a été utilisé pour enregistrer le fichier sous le dossier de charge utile.
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();
Voici la structure de dossiers de charge utile après l’assemblage et le stockage des pièces jointes du formulaire.
Si vous avez activé l’enregistreur pour le lot personnalisé, le DDX et le fichier assemblé sont écrits dans le dossier de votre installation AEM.