3 import javax.servlet.*;
4 import javax.servlet.http.*;
6 import org.xml.sax.InputSource;
7 import org.xml.sax.XMLReader;
9 import org.apache.fop.apps.Driver;
10 import org.apache.fop.apps.Version;
11 import org.apache.fop.apps.XSLTInputHandler;
13 import org.apache.log.*;
22 import mircoders.entity.*;
23 import mircoders.storage.*;
24 import mircoders.module.*;
25 import mircoders.producer.*;
30 * generate a PDF from a servlet.
33 * <li>id: the id number of the content entity to turn into a pdf
36 * Example URL: http://servername/servlet/OutputMir?id=66
37 * Compiling: you will need
43 * Running: you will need in the WEB-INF/lib/ directory:
46 * - avalon-framework-4.0.jar
50 public class OutputMir extends AbstractServlet {
51 private ModuleContent contentModule;
53 public static final String ID_REQUEST_PARAM = "id";
57 public void doGet(HttpServletRequest request,
58 HttpServletResponse response) throws ServletException {
60 Hierarchy hierarchy = Hierarchy.getDefaultHierarchy();
61 log = hierarchy.getLoggerFor("fop");
62 log.setPriority(Priority.WARN);
66 String producerStorageRoot=MirConfig.getProp("Producer.StorageRoot");
67 String producerDocRoot=MirConfig.getProp("Producer.DocRoot");
68 String templateDir = MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir");
69 String xslSheet=templateDir + "/" + MirConfig.getProp("Producer.PrintableContent.html2foStyleSheetName");
71 contentModule = new ModuleContent(DatabaseContent.getInstance());
73 String idParam = request.getParameter(ID_REQUEST_PARAM);
75 EntityContent contentEnt = (EntityContent)contentModule.getById(idParam);
76 String publishPath = contentEnt.getValue("publish_path");
77 String foFile = producerStorageRoot + producerDocRoot + "/" +publishPath + "/" + idParam + ".fo";
78 XSLTInputHandler input = new XSLTInputHandler(new File(foFile), new File(xslSheet));
79 renderXML(input, response);
81 PrintWriter out = response.getWriter();
82 out.println("<html><head><title>Error</title></head>\n"+
83 "<body><h1>OutputMir Error</h1><h3>No 'id' "+
84 "request param given.</body></html>");
86 } catch (ServletException ex) {
89 catch (Exception ex) {
90 throw new ServletException(ex);
95 * renders an FO inputsource into a PDF file which is rendered
96 * directly to the response object's OutputStream
98 public void renderFO(InputSource foFile,
99 HttpServletResponse response) throws ServletException {
101 ByteArrayOutputStream out = new ByteArrayOutputStream();
103 response.setContentType("application/pdf");
105 Driver driver = new Driver(foFile, out);
106 driver.setLogger(log);
107 driver.setRenderer(Driver.RENDER_PDF);
110 byte[] content = out.toByteArray();
111 response.setContentLength(content.length);
112 response.getOutputStream().write(content);
113 response.getOutputStream().flush();
114 } catch (Exception ex) {
115 throw new ServletException(ex);
119 public void renderXML(XSLTInputHandler input,
120 HttpServletResponse response) throws ServletException {
122 ByteArrayOutputStream out = new ByteArrayOutputStream();
124 response.setContentType("application/pdf");
126 Driver driver = new Driver();
127 driver.setLogger(log);
128 driver.setRenderer(Driver.RENDER_PDF);
129 driver.setOutputStream(out);
130 driver.render(input.getParser(), input.getInputSource());
132 byte[] content = out.toByteArray();
133 response.setContentLength(content.length);
134 response.getOutputStream().write(content);
135 response.getOutputStream().flush();
136 } catch (Exception ex) {
137 throw new ServletException(ex);
142 * creates a SAX parser, using the value of org.xml.sax.parser
143 * defaulting to org.apache.xerces.parsers.SAXParser
145 * @return the created SAX parser
147 static XMLReader createParser() throws ServletException {
148 String parserClassName = System.getProperty("org.xml.sax.parser");
149 if (parserClassName == null) {
150 parserClassName = "org.apache.xerces.parsers.SAXParser";
154 return (XMLReader) Class.forName(
155 parserClassName).newInstance();
156 } catch (Exception e) {
157 throw new ServletException(e);