![]() |
![]() |
|
<%
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 { %> <% } %> |