AEM Workflow PDF Metadata
Hello, I have a workflow in AEM that is responsible for cleaning the metadata of my PDFs in the DAM. The issue is that it doesn't delete all the metadata; it seems to only delete it from the environment but not from the document when I download it again. It also appears that the XMP metadata persists. Any help or solution? I tried cleaning the metadata node or deleting it, but in both cases, due to configuration, I get a message saying that the node is protected and cannot be accessed. Greetings. My workflow that "works a bit".
package com.unicaja.aem.site.core.workflow;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.jcr.Session;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.resource.ValueMap;
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.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.Workflow;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
@Component(service = WorkflowProcess.class, property = { Constants.SERVICE_DESCRIPTION + "= Remove Metas PDF Proccess", Constants.SERVICE_VENDOR + "= Adobe", "process.label=" + "Remove Metas PDF Proccess" })
public class RemoveMetas implements WorkflowProcess {
@3214626
private ResourceResolverFactory resolverFactory;
/** Default log. */
protected final Logger log = LoggerFactory.getLogger(this.getClass());
public void execute(WorkItem item, WorkflowSession wfsession, MetaDataMap args) throws WorkflowException {
try {
Session session = wfsession.adaptTo(Session.class);
final Map<String, Object> map = new HashMap<>();
map.put("user.jcr.session", session);
ResourceResolver rr = resolverFactory.getResourceResolver(map);
String path = item.getWorkflowData().getPayload().toString();
Resource resource;
Pattern regexExpression = Pattern.compile(".*/jcr:content/metadata.*");
Matcher match = regexExpression.matcher(path);
if(match.matches()){
resource = rr.getResource(path);
} else {
resource = rr.getResource(path + "/jcr:content/metadata");
}
ValueMap vm = resource.getValueMap();
if (vm.get("dc:format").equals("application/pdf")) {
for (String key : vm.keySet()) {
if (!key.equals("jcr:mixinTypes") && !key.equals("jcr:primaryType") && !key.equals("dc:format") && !key.equals("dateHR") && !key.equals("jcr:title") && !key.equals("pdf:Title") && !key.equals("dc:title") && !key.equals("dc:description") && !key.equals("cq:tags")) {
ModifiableValueMap map1 = resource.adaptTo(ModifiableValueMap.class);
if (map1 != null) {
map1.remove(key);
}
}
}
resource.getResourceResolver().commit();
}
} catch (LoginException | PersistenceException e) {
log.error("Error {}", e.getMessage());
} finally {
Workflow workflow = wfsession.getWorkflow(item.getWorkflow().getId());
wfsession.terminateWorkflow(workflow);
}
}
}