使用者的選擇儲存在隱藏欄位中。 此隱藏欄位的值會傳遞到servlet,它會使用將選取專案合併為一個pdf Forms組合器服務.
下列程式碼會組合所選電子報。 程式碼會根據使用者的選擇建立檔案地圖。 從此對應建立DDX,此DDX與檔案對應會傳遞至Assembler服務的叫用方法,以取得合併檔案。 組合後的pdf會儲存在儲存庫中,其路徑會傳回至呼叫的應用程式。
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());
}
}
組裝電子報時使用了下列公用程式函式。 這些公用程式函式會從檔案對應建立DDX,並將org.w3c.dom.Document轉換為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;
}
}