Sammanställa formulärbilagor
I den här artikeln finns resurser för att sammanställa adaptiva formulärbilagor i en viss ordning. De bifogade formulären måste vara i pdf-format för att exempelkoden ska fungera. Här följer ett exempel.
Användaren som fyller i ett anpassat formulär bifogar ett eller flera PDF-dokument till formuläret.
När du skickar in formuläret sätter du ihop de bifogade filerna för att generera en PDF. Du kan ange i vilken ordning de bifogade filerna ska monteras för att skapa den slutliga PDF-filen.
Skapa OSGi-komponent som implementerar WorkflowProcess-gränssnittet
Skapa en OSGi-komponent som implementerar gränssnittet com.adobe.granite.workflow.exec.WorkflowProcess. Koden i den här komponenten kan associeras med processstegskomponenten i AEM arbetsflöde. Körningsmetoden för gränssnittet com.adobe.granite.workflow.exec.WorkflowProcess implementeras i den här komponenten.
När ett anpassningsbart formulär skickas för att utlösa ett AEM arbetsflöde, lagras skickade data i den angivna filen under nyttolastmappen. Det här är till exempel den skickade datafilen. Vi måste montera de bilagor som anges under ID-kortet och bankkontoutdragstaggen.
.
Hämta taggnamnen
Ordningen på de bifogade filerna anges som processtegargument i arbetsflödet, vilket visas på skärmbilden nedan. Här sätter vi ihop de bilagor som lagts till i fältets ID-kort följt av bankkontoutdrag
Följande kodfragment extraherar namnen på bilagor från processargumenten
String []attachmentNames = arg2.get("PROCESS_ARGS","string").toString().split(",");
Skapa DDX från namnen på de bifogade filerna
Sedan måste vi skapa DX-dokument (Document Description XML) som används av Assembler-tjänsten för att samla ihop dokument. Följande är den DDX som skapades från processargumenten. Med NoForms-elementet kan du förenkla XFA-baserade dokument innan de sätts samman. Observera att källelementen i PDF är i rätt ordning enligt processargumenten.
Skapa dokumentkarta
Sedan skapar vi en karta över dokument med namnet på den bifogade filen som nyckel och den bifogade filen som värde. Tjänsten Query Builder användes för att fråga efter de bifogade filerna under nyttolastsökvägen och skapa dokumentkartan. Den här kartan med DX behövs för att monteringstjänsten ska kunna sammanställa den slutliga PDF-filen.
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;
}
Använd AssemblerService för att samla ihop dokumenten
När du har skapat DDX-filen och dokumentöversikten är nästa steg att använda AssemblerService för att montera dokumenten.
Följande kod sätter ihop och returnerar den sammansatta PDF-filen.
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;
}
Spara den sammansatta PDF-filen under nyttolastmappen
Det sista steget är att spara den sammansatta PDF-filen under nyttolastmappen. Den här PDF-filen kan sedan öppnas i efterföljande steg i arbetsflödet för vidare bearbetning.
Följande kodfragment användes för att spara filen under nyttolastmappen
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();
Nedan följer mappstrukturen för nyttolast när formulärbilagor har monterats och lagrats.
För att få den här funktionen att fungera på din AEM
- Hämta formuläret Sammanställ formulärbilagor till ditt lokala system.
- Importera formuläret från sidan Forms och dokument.
- Hämta arbetsflöde och importera till AEM med pakethanteraren.
- Hämta det anpassade paketet
- Distribuera och starta paketet med webbkonsolen
- Peka webbläsaren på Sammansättningsbifogade filer
- Lägg till en bifogad fil i ID-dokumentet och ett par PDF-dokument i avsnittet med bankutdrag
- Skicka formuläret för att utlösa arbetsflödet
- Kontrollera arbetsflödets nyttolastmapp i crx för den sammansatta PDF-filen