Combina le newsletter selezionate in un unico PDF
Le selezioni dell’utente vengono memorizzate in un campo nascosto. Il valore di questo campo nascosto viene passato al servlet che combinerà le selezioni in un unico pdf utilizzando il servizio Assembler di Forms.
Servlet per assemblare file PDF
Il codice seguente esegue l'assemblaggio delle newsletter selezionate. Il codice crea una mappa dei documenti dalle selezioni dell'utente. Da questa mappa viene creato un DDX e questo DDX insieme alla mappa dei documenti viene passato al metodo invoke del servizio Assembler per ottenere il documento combinato. Il PDF assemblato viene memorizzato nell’archivio e il relativo percorso viene restituito all’applicazione chiamante.
protected void doPost(SlingHttpServletRequest request,SlingHttpServletResponse response)
{
String []newsletters = request.getParameter("selectedNewsLetters").split(",");
Map<String, Object> mapOfDocuments = new HashMap<String, Object>();
for(int i= 0;i<newsletters.length;i++)
{
Resource resource = request.getResourceResolver().getResource(newsletters[i]);
log.debug("The resource name is "+resource.getName());
Document newsletter = new Document(resource.getPath());
mapOfDocuments.put(resource.getName(), newsletter);
}
log.debug("The newsletters selected: "+newsletters);
Document ddxDocument = createDDXFromMapOfDocuments(mapOfDocuments);
AssemblerOptionSpec aoSpec = new AssemblerOptionSpec();
aoSpec.setFailOnError(true);
AssemblerResult ar = null;
try {
ar = assemblerService.invoke(ddxDocument, mapOfDocuments, aoSpec);
Document assembledPDF = ar.getDocuments().get("GeneratedPDF.pdf");
// This is my custom code to get fd-service user
ResourceResolver formsServiceResolver = getResolver.getFormsServiceResolver();
Resource nodeResource = formsServiceResolver.getResource("/content/newsletters");
UUID uuid = UUID.randomUUID();
String uuidString = uuid.toString();
javax.jcr.Node assembledNewsletters = nodeResource.adaptTo(Node.class);
javax.jcr.Node assembledNewsletter = assembledNewsletters.addNode(uuidString + ".pdf", "nt:file");
javax.jcr.Node resNode = assembledNewsletter.addNode("jcr:content", "nt:resource");
ValueFactory valueFactory = formsServiceResolver.adaptTo(Session.class).getValueFactory();
Binary contentValue = valueFactory.createBinary(assembledPDF.getInputStream());
resNode.setProperty("jcr:data", contentValue);
formsServiceResolver.commit();
PrintWriter out = response.getWriter();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
JsonObject asset = new JsonObject();
asset.addProperty("assetPath", assembledNewsletter.getPath());
out.print(new Gson().toJson(asset));
out.flush();
}
catch (IOException | OperationException | RepositoryException e)
{
log.error("Error is "+e.getMessage());
}
}
Funzioni utility
Nell'assemblaggio delle newsletter sono state utilizzate le seguenti funzioni di utilità. Queste funzioni di utilità creano DDX da una mappa di documenti e convertono org.w3c.dom.Document in un oggetto documento AEMFD.
public Document createDDXFromMapOfDocuments(Map<String, Object> mapOfDocuments)
{
final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
org.w3c.dom.Document ddx = null;
try
{
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
ddx = docBuilder.newDocument();
Element rootElement = ddx.createElementNS("http://ns.adobe.com/DDX/1.0/", "DDX");
ddx.appendChild(rootElement);
Element pdfResult = ddx.createElement("PDF");
pdfResult.setAttribute("result","GeneratedPDF.pdf");
rootElement.appendChild(pdfResult);
for (String key : mapOfDocuments.keySet())
{
log.debug(key + " " + mapOfDocuments.get(key));
Element pdfSourceElement = ddx.createElement("PDF");
pdfSourceElement.setAttribute("source", key);
pdfSourceElement.setAttribute("bookmarkTitle",key);
pdfResult.appendChild(pdfSourceElement);
}
return orgw3cDocumentToAEMFDDocument(ddx);
}
catch (ParserConfigurationException e)
{
log.debug("Error:"+e.getMessage());
}
return null;
}
public Document orgw3cDocumentToAEMFDDocument( org.w3c.dom.Document xmlDocument)
{
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DOMSource source = new DOMSource(xmlDocument);
log.debug("$$$$In orgW3CDocumentToAEMFDDocument method");
StreamResult outputTarget = new StreamResult(outputStream);
try
{
TransformerFactory.newInstance().newTransformer().transform(source, outputTarget);
InputStream is1 = new ByteArrayInputStream(outputStream.toByteArray());
Document xmlAEMFDDocument = new Document(is1);
if (log.isDebugEnabled())
{
xmlAEMFDDocument.copyToFile(new File("dataxmldocument.xml"));
}
return xmlAEMFDDocument;
}
catch (Exception e)
{
log.error("Error in generating ddx " + e.getMessage());
return null;
}
}