Space Menu Home News Corporate Server 4 Partners Technology monitoring Training
History History |


<% import org.codehaus.groovy.sandbox.util.XmlSlurper; import org.w3c.tidy.Tidy; import java.io.; import javax.xml.transform.stream.; import javax.xml.transform.dom.; import javax.xml.transform.; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.xpath.XPathAPI; import org.apache.fop.apps.Driver;

ENCODING = "ISO-8859-1";

byte transform(def node, String stylesheetFile) { return transform(new DOMSource(node), stylesheetFile, :?); }

byte transform(def node, String stylesheetFile, Map parms) { return transform(new DOMSource(node), stylesheetFile, parms); }

byte transform(byte xmlData, String styleSheetFile, Map parms) { return transform(new StreamSource(new ByteArrayInputStream(xmlData)), styleSheetFile, parms); }

byte transform(Source xmlSource, String styleSheetFile, Map parms) {

styleAttach = doc.getAttachment(styleSheetFile) if (styleAttach == null) throw new IllegalArgumentException("No stylesheet " + styleSheetFile);

def xsltSource = new StreamSource( new ByteArrayInputStream(styleAttach.content)); def result = new ByteArrayOutputStream(); def resultStr = new StreamResult(result);

def transFact = TransformerFactory.newInstance( );

def trans = transFact.newTransformer(xsltSource); if (parms) parms.keySet().each( { trans.setParameter(it, parmsit?) } );

trans.transform(xmlSource, resultStr);

return result.toByteArray(); }

byte convertToXhtml(InputStream input) { Tidy tidy = new Tidy(); tidy.setXmlOut(true); tidy.setNumEntities(true); def outstr = new ByteArrayOutputStream();

def tidydoc = tidy.parse(input, outstr); input.close(); return outstr.toByteArray(); }

byte convertToXhtml(String docname) { return convertToXhtml(xwiki.getDocument(docname)); }

byte convertToXhtml(com.xpn.xwiki.api.Document theDoc) { if (theDoc == null || theDoc.isNew()) return null;

return convertToXhtml(new StringBufferInputStream(theDoc.renderedContent));

}

com.xpn.xwiki.api.Document getDoc(String url) { def tokens = url.split("/"); String space; if (tokens.length > 1) { space = tokenslength-2?; } else { space = doc.getWeb(); // current space }

def docname = tokenslength-1?; return xwiki.getDocument(space, docname); }

def printXml(byte xml) { response.setContentType("text/xml"); def stream = response.getOutputStream(); //stream.println(""); stream.write(xml); stream.flush(); context.setFinished(true); }

def importDoc(byte docContents, org.w3c.dom.Document intoDoc, org.w3c.dom.Node intoNode) {

def curDocDOM = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new org.xml.sax.InputSource(new ByteArrayInputStream(docContents))); def bodyNodes = XPathAPI.selectNodeList(curDocDOM, "/html/body/node()"); bodyNodes.each( { def bodyNode = intoDoc.importNode(it, true); intoNode.appendChild( bodyNode ); } ); }

byte getTocDoc(String tocdocName) { String tocdocTokens = tocdocName.split("
."); String space, name; if (tocdocTokens.length == 1) { space = doc.getWeb(); name = tocdocTokens0?; } else if (tocdocTokens.length == 2) { space = tocdocTokens0?; name = tocdocTokens1?; } else { return null; }

String urlstr = serverbase + request.getContextPath() + "/bin/view/" + space + "/" + name + "?xpage=plain"; URL url = new URL(urlstr); return convertToXhtml(url.openStream()); }

def generatePDF(String tocdocName) {

def docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

// byte tocDocHtml = convertToXhtml(xwiki.getDocument(tocdoc)); byte tocDocHtml = getTocDoc(tocdocName);

if (tocDocHtml == null) { println "Document " + tocdocName + " not found or empty."; return; }

if (debugxsl == "1") { printXml(tocDocHtml); return; }

// process parameters, if present

def parms = 'serverbase': serverbase?;

def tocDocRoot = docBuilder.parse( new org.xml.sax.InputSource(new ByteArrayInputStream(tocDocHtml))); def parmNodes = XPathAPI.selectNodeList( tocDocRoot, "//div[@id='pdfgen_parms'?]//li"); parmNodes.each( { def parmStr = it.getTextContent(); def parmTokens = parmStr.split("="); if (parmTokens.length == 2) { parmsparm Tokens[0?.trim()] = parmTokens1?.trim(); } } );

byte tocDocXml = transform(tocDocHtml, "tochtml2doc.xsl", parms);

if (debugxsl == "2") { printXml(tocDocXml); return; }

// for each chapter node, load the url and replace the content node with the content def tocDocRoot = docBuilder.parse( new org.xml.sax.InputSource(new ByteArrayInputStream(tocDocXml))); def chapterNodes = XPathAPI.selectNodeList( tocDocRoot, "//chapter");

String debugmsg = "";

chapterNodes.each( { def chapterNode = it; String url = XPathAPI.eval(chapterNode, "url").toString();

if (url != "") { // Had to replace the following code because of problems with XWiki's Document.getRenderedContent() //com.xpn.xwiki.api.Document curDoc = getDoc(url); //if (curDoc != null && !curDoc.isNew()) { // importDoc(convertToXhtml(curDoc), tocDocRoot, contentNode); //}

if (url.startsWith("/")) { url = serverbase + url; }

url += "?xpage=plain";

debugmsg += "Processing doc " + url + " ...
";

try { byte docData = convertToXhtml(new URL(url).openStream()); def contentNode = XPathAPI.selectSingleNode(chapterNode, "content"); importDoc(docData, tocDocRoot, contentNode); } catch (Exception ex) { println "

Unable to download url " + url + ": " + ex + "
"; return; }

}

});

//println debugmsg; // return;

if (debugxsl == "3") { printXml(transform(tocDocRoot, "identity.xsl")); return; }

def fo = transform(tocDocRoot, "xhtml2fo.xsl", parms); fo = transform(fo, "fop.xsl", :?);

if (debugxsl == "4") { printXml(fo); return; }

Driver driver = new Driver(); driver.setInputSource(new org.xml.sax.InputSource( new ByteArrayInputStream(fo)));

OutputStream outStr;

outStr = new ByteArrayOutputStream(60000); driver.setOutputStream(outStr); driver.setRenderer(Driver.RENDER_PDF); driver.run();

response.setContentType("application/pdf"); response.getOutputStream().write(outStr.toByteArray()); context.setFinished(true); }

//


begin main script

def tocdocName = request.getParameter("tocdoc"); def debugxsl = request.getParameter("debugxsl"); def serverbase = request.getParameter("serverbase"); if (serverbase == null || serverbase == "") { serverbase = request.requestURL.substring(0, request.requestURL.indexOf('/', 8)); }

if (tocdocName != null && tocdocName != "") { generatePDF(tocdocName);

} else {

%>

TOC Document name:
URL Base:
Debug XSL Pipeline:

<% } %>

SandBox (es)
Creator: WebHome  Date: 2005/08/30 15:14
Last Author: ErwannRobin  Date: 2006/01/13 17:15
(c) Mandriva