diff options
Diffstat (limited to 'contrib/servlet/src/FopServlet.java')
-rw-r--r-- | contrib/servlet/src/FopServlet.java | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/contrib/servlet/src/FopServlet.java b/contrib/servlet/src/FopServlet.java new file mode 100644 index 000000000..d3043bd9d --- /dev/null +++ b/contrib/servlet/src/FopServlet.java @@ -0,0 +1,138 @@ +/* + * $Id$ + * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. + * For details on use and redistribution please refer to the + * LICENSE file included with these sources. + */ + +import java.io.*; + +import javax.servlet.*; +import javax.servlet.http.*; + +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; + +import org.apache.fop.apps.Driver; +import org.apache.fop.apps.Version; +import org.apache.fop.apps.XSLTInputHandler; +import org.apache.fop.messaging.MessageHandler; + +import org.apache.avalon.framework.logger.ConsoleLogger; +import org.apache.avalon.framework.logger.Logger; + +/** + * Example servlet to generate a PDF from a servlet. + * Servlet param is: + * <ul> + * <li>fo: the path to a formatting object file to render + * </ul> + * + * Example URL: http://servername/fop/servlet/FopServlet?fo=readme.fo + * Example URL: http://servername/fop/servlet/FopServlet?xml=data.xml&xsl=format.xsl + * Compiling: you will need + * - servlet_2_2.jar + * - fop.jar + * - sax api + * - avalon-framework-x.jar (where x is the version found the FOP lib dir) + * + * Running: you will need in the WEB-INF/lib/ directory: + * - fop.jar + * - batik.jar + * - xalan-2.0.0.jar + * - avalon-framework-x.jar (where x is the version found the FOP lib dir) + */ +public class FopServlet extends HttpServlet { + public static final String FO_REQUEST_PARAM = "fo"; + public static final String XML_REQUEST_PARAM = "xml"; + public static final String XSL_REQUEST_PARAM = "xsl"; + Logger log = null; + + public void doGet(HttpServletRequest request, + HttpServletResponse response) throws ServletException { + if (log == null) { + log = new ConsoleLogger(ConsoleLogger.LEVEL_WARN); + MessageHandler.setScreenLogger(log); + } + try { + String foParam = request.getParameter(FO_REQUEST_PARAM); + String xmlParam = request.getParameter(XML_REQUEST_PARAM); + String xslParam = request.getParameter(XSL_REQUEST_PARAM); + + if (foParam != null) { + File fofile = new File(foParam); + //log.warn("FO: "+fofile.getCanonicalPath()); + FileInputStream file = new FileInputStream(fofile); + renderFO(new InputSource(file), response); + } else if ((xmlParam != null) && (xslParam != null)) { + XSLTInputHandler input = + new XSLTInputHandler(new File(xmlParam), + new File(xslParam)); + renderXML(input, response); + } else { + PrintWriter out = response.getWriter(); + out.println("<html><head><title>Error</title></head>\n"+ + "<body><h1>FopServlet Error</h1><h3>No 'fo' "+ + "request param given.</body></html>"); + } + } catch (ServletException ex) { + throw ex; + } + catch (Exception ex) { + throw new ServletException(ex); + } + } + + /** + * Renders an FO inputsource into a PDF file which is written + * directly to the response object's OutputStream + */ + public void renderFO(InputSource foFile, + HttpServletResponse response) throws ServletException { + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + response.setContentType("application/pdf"); + + Driver driver = new Driver(foFile, out); + driver.setLogger(log); + driver.setRenderer(Driver.RENDER_PDF); + driver.run(); + + byte[] content = out.toByteArray(); + response.setContentLength(content.length); + response.getOutputStream().write(content); + response.getOutputStream().flush(); + } catch (Exception ex) { + throw new ServletException(ex); + } + } + + /** + * Renders an XML file into a PDF file by applying a stylesheet + * that converts the XML to XSL:FO. The PDF is written + * directly to the response object's OutputStream + */ + public void renderXML(XSLTInputHandler input, + HttpServletResponse response) throws ServletException { + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + response.setContentType("application/pdf"); + + Driver driver = new Driver(); + driver.setLogger(log); + driver.setRenderer(Driver.RENDER_PDF); + driver.setOutputStream(out); + driver.render(input.getParser(), input.getInputSource()); + + byte[] content = out.toByteArray(); + response.setContentLength(content.length); + response.getOutputStream().write(content); + response.getOutputStream().flush(); + } catch (Exception ex) { + throw new ServletException(ex); + } + } + +} |