Expand my Community achievements bar.

July 31st AEM Gems Webinar: Elevate your AEM development to master the integration of private GitHub repositories within AEM Cloud Manager.

AEM as a Cloud Service Tutorials -> Custom Process Step | AEM Community Blog Seeding




AEM as a Cloud Service Tutorials -> Custom Process Step by Adobe Docs


The following is the complete code of the custom process step which converts and replaces the native files with the converted pdf’s.
This custom step searches for all attachments under the folder name which is provided as a process argument in the workflow.
This custom process step uses the methods of the custom DocumentCloudSDKService to create PDF’s.

package com.aemforms.doccloud.core;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.Session;

import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.day.cq.search.PredicateGroup;
import com.day.cq.search.Query;
import com.day.cq.search.QueryBuilder;
import com.day.cq.search.result.Hit;
import com.day.cq.search.result.SearchResult;;

@Component(property = {
Constants.SERVICE_DESCRIPTION + "=Convert form attachments to PDF Using Document Cloud API",
Constants.SERVICE_VENDOR + "=Adobe Systems",
"process.label" + "=Convert form attachments to PDF Using Document Cloud API"

public class ConvertAttachmentsToPDF implements WorkflowProcess {
private static final Logger log = LoggerFactory.getLogger(ConvertAttachmentsToPDF.class);
QueryBuilder queryBuilder;
DocumentCloudSDKService documentCloudService;
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap processArguments) throws WorkflowException {

log.debug("The payload path is " + workItem.getWorkflowData().getPayload().toString());
log.debug("The form attachments are stored under ..." + processArguments.get("PROCESS_ARGS", "string").toString() + " folder in the payload");

Session session = workflowSession.adaptTo(Session.class);
Map<String, String> map = new HashMap<String, String> ();
map.put("path", workItem.getWorkflowData().getPayload().toString() + "/" + processArguments.get("PROCESS_ARGS", "string").toString());
map.put("type", "nt:file");
Query query = queryBuilder.createQuery(PredicateGroup.create(map), workflowSession.adaptTo(Session.class));

SearchResult result = query.getResult();
log.debug("Get result hits " + result.getHits().size());
Node attachmentNode = null;
for (Hit hit: result.getHits()) {
try {
String path = hit.getPath();
log.debug("The title of the attachment is " + hit.getTitle() + " and path " + path);
String title = hit.getTitle();
title = title.substring(0, title.indexOf("."));
attachmentNode = workflowSession.adaptTo(Session.class).getNode(path + "/jcr:content");
InputStream xmlDataStream = attachmentNode.getProperty("jcr:data").getBinary().getStream();
Document convertedPDF = documentCloudService.createPDFFromInputStream(xmlDataStream, hit.getTitle());
Node nonPDFNode = session.getNode(path);
session.move(nonPDFNode.getPath(), nonPDFNode.getParent().getPath() + "/" + title + ".pdf");
Binary binary = session.getValueFactory().createBinary(convertedPDF.getInputStream());
attachmentNode.setProperty("jcr:data", binary);
log.debug("Replacing the original file with converted pdf ");

} catch (Exception e) {


Read Full Blog

AEM as a Cloud Service Tutorials -> Custom Process Step


Please use this thread to ask the related questions.

Kautuk Sahni
0 Replies