first stab at dynamically generated pdf's.
authorjohn <john>
Wed, 27 Mar 2002 18:49:23 +0000 (18:49 +0000)
committerjohn <john>
Wed, 27 Mar 2002 18:49:23 +0000 (18:49 +0000)
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 [new file with mode: 0755]

diff --git a/source/OutputMir.java b/source/OutputMir.java
new file mode 100755 (executable)
index 0000000..bf64063
--- /dev/null
@@ -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:
+ * <ul>
+ *   <li>id: the id number of the content entity to turn into a pdf
+ * </ul>
+ *
+ * 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("<html><head><title>Error</title></head>\n"+
+                            "<body><h1>OutputMir Error</h1><h3>No 'id' "+
+                            "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 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);
+        }
+    }
+
+}
+
+
+
+
+
+