From 4aa84b7e39c867d361b06420a821bd69c057c641 Mon Sep 17 00:00:00 2001 From: john Date: Wed, 27 Mar 2002 18:49:23 +0000 Subject: [PATCH] first stab at dynamically generated pdf's. it's a new servlet, so something like: http://blah.org/Mir/servlet/OutputMir?id=16 will return a pdf to the browser directly. no caching yet, but it's a start. --- source/OutputMir.java | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100755 source/OutputMir.java diff --git a/source/OutputMir.java b/source/OutputMir.java new file mode 100755 index 00000000..bf640634 --- /dev/null +++ b/source/OutputMir.java @@ -0,0 +1,167 @@ +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.log.*; + +import mir.servlet.*; +import mir.module.*; +import mir.misc.*; +import mir.entity.*; +import mir.storage.*; + + +import mircoders.entity.*; +import mircoders.storage.*; +import mircoders.module.*; +import mircoders.producer.*; + + + +/** + * generate a PDF from a servlet. + * Servlet param is: + * + * + * Example URL: http://servername/servlet/OutputMir?id=66 + * Compiling: you will need + * - servlet_2_2.jar + * - fop.jar + * - sax api + * - logkit jar + * + * Running: you will need in the WEB-INF/lib/ directory: + * - fop.jar + * - batik.jar + * - avalon-framework-4.0.jar + * - logkit-1.0.jar + * - xalan-2.0.0.jar + */ +public class OutputMir extends AbstractServlet { + private ModuleContent contentModule; + + public static final String ID_REQUEST_PARAM = "id"; + + Logger log = null; + + public void doGet(HttpServletRequest request, + HttpServletResponse response) throws ServletException { + if(log == null) { + Hierarchy hierarchy = Hierarchy.getDefaultHierarchy(); + log = hierarchy.getLoggerFor("fop"); + log.setPriority(Priority.WARN); + } + getConfig(request); + + String producerStorageRoot=MirConfig.getProp("Producer.StorageRoot"); + String producerDocRoot=MirConfig.getProp("Producer.DocRoot"); + String templateDir = MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir"); + String xslSheet=templateDir + "/" + MirConfig.getProp("Producer.PrintableContent.html2foStyleSheetName"); + try { + contentModule = new ModuleContent(DatabaseContent.getInstance()); + + String idParam = request.getParameter(ID_REQUEST_PARAM); + if (idParam != null){ + EntityContent contentEnt = (EntityContent)contentModule.getById(idParam); + String publishPath = contentEnt.getValue("publish_path"); + String foFile = producerStorageRoot + producerDocRoot + "/" +publishPath + "/" + idParam + ".fo"; + XSLTInputHandler input = new XSLTInputHandler(new File(foFile), new File(xslSheet)); + renderXML(input, response); + } else { + PrintWriter out = response.getWriter(); + out.println("Error\n"+ + "

OutputMir Error

No 'id' "+ + "request param given."); + } + } catch (ServletException ex) { + throw ex; + } + catch (Exception ex) { + throw new ServletException(ex); + } + } + + /** + * renders an FO inputsource into a PDF file which is rendered + * 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); + } + } + + 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); + } + } + + /** + * creates a SAX parser, using the value of org.xml.sax.parser + * defaulting to org.apache.xerces.parsers.SAXParser + * + * @return the created SAX parser + */ + static XMLReader createParser() throws ServletException { + String parserClassName = System.getProperty("org.xml.sax.parser"); + if (parserClassName == null) { + parserClassName = "org.apache.xerces.parsers.SAXParser"; + } + + try { + return (XMLReader) Class.forName( + parserClassName).newInstance(); + } catch (Exception e) { + throw new ServletException(e); + } + } + +} + + + + + + -- 2.11.0