From 9cfac12f9bd3234ae5a4503aed2466193c7e50d2 Mon Sep 17 00:00:00 2001 From: Keiron Liddle Date: Wed, 27 Mar 2002 11:55:52 +0000 Subject: [PATCH] updated old servlet code, moved to contrib added print servlet Submitted By: Jeremias Maerki git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194721 13f79535-47bb-0310-9956-ffa450edef68 --- contrib/servlet/README | 22 +++ contrib/servlet/build.bat | 30 +++ contrib/servlet/build.sh | 25 +++ contrib/servlet/build.xml | 86 ++++++++ contrib/servlet/conf/web.xml | 21 ++ contrib/servlet/lib/readme.txt | 1 + contrib/servlet/src/FopPrintServlet.java | 241 +++++++++++++++++++++++ contrib/servlet/src/FopServlet.java | 138 +++++++++++++ 8 files changed, 564 insertions(+) create mode 100644 contrib/servlet/README create mode 100755 contrib/servlet/build.bat create mode 100755 contrib/servlet/build.sh create mode 100644 contrib/servlet/build.xml create mode 100644 contrib/servlet/conf/web.xml create mode 100644 contrib/servlet/lib/readme.txt create mode 100644 contrib/servlet/src/FopPrintServlet.java create mode 100644 contrib/servlet/src/FopServlet.java diff --git a/contrib/servlet/README b/contrib/servlet/README new file mode 100644 index 000000000..3b1741e1c --- /dev/null +++ b/contrib/servlet/README @@ -0,0 +1,22 @@ +FOP Servlet Readme + +This directory contains two sample servlets that use FOP: + +- FopServlet can take a XSL:FO file or a XML+XSLT as parameters to create a PDF +that is being shown in the browser. + +- FopPrintServlet has the same parameters but prints the generated document to +the default printer instead of generating a PDF. + +Creating the WAR file: + +1. Get a servlet.jar and put it in the lib directory under this directory. +2. Run build.bat (on Windows) or build.sh (on Unix) to create the WAR file. +3. Put the WAR file in you favourite web container. + +Sample URLs: +http://localhost:8080/fop/servlet/FopServlet?fo=readme.fo +http://localhost:8080/fop/servlet/FopPrintServlet?fo=readme.fo + +Tip: If you have problems using Internet Explorer, try this URL: +http://localhost:8080/fop/servlet/FopServlet?fo=readme.fo&ext=.pdf diff --git a/contrib/servlet/build.bat b/contrib/servlet/build.bat new file mode 100755 index 000000000..9547eaf94 --- /dev/null +++ b/contrib/servlet/build.bat @@ -0,0 +1,30 @@ +@echo off + +echo Fop Build System +echo ---------------- + +if "%JAVA_HOME%" == "" goto error + +set LIBDIR=../../lib +set LOCALCLASSPATH=%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\classes.zip;%LIBDIR%\ant.jar;%LIBDIR%\ant-1.3-optional.jar;%LIBDIR%\buildtools.jar;%LIBDIR%\xerces-1.4.3.jar;%LIBDIR%\xalan-2.2D11.jar + +set ANT_HOME=%LIBDIR% + +echo Building with classpath %LOCALCLASSPATH% + +echo Starting Ant... + +%JAVA_HOME%\bin\java.exe -Dant.home=%ANT_HOME% -classpath "%LOCALCLASSPATH%" org.apache.tools.ant.Main %1 %2 %3 %4 %5 + +goto end + +:error + +echo ERROR: JAVA_HOME not found in your environment. +echo Please, set the JAVA_HOME variable in your environment to match the +echo location of the Java Virtual Machine you want to use. + +:end + +rem set LOCALCLASSPATH= + diff --git a/contrib/servlet/build.sh b/contrib/servlet/build.sh new file mode 100755 index 000000000..a8a5abe6b --- /dev/null +++ b/contrib/servlet/build.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# This file should be executable. +echo +echo "Fop Build System" +echo "----------------" +echo + +if [ "$JAVA_HOME" = "" ] ; then + echo "ERROR: JAVA_HOME not found in your environment." + echo + echo "Please, set the JAVA_HOME variable in your environment to match the" + echo "location of the Java Virtual Machine you want to use." + exit 1 +fi +LIBDIR=../../lib +LOCALCLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/classes.zip:$LIBDIR/ant.jar:$LIBDIR/ant-1.3-optional.jar:$LIBDIR/buildtools.jar:$LIBDIR/xerces-1.4.3.jar:$LIBDIR/xalan-2.2D11.jar + +ANT_HOME=$LIBDIR + +echo +echo Building with classpath $LOCALCLASSPATH +echo Starting Ant... +echo + +$JAVA_HOME/bin/java -Dant.home=$ANT_HOME -classpath "$LOCALCLASSPATH" org.apache.tools.ant.Main $* diff --git a/contrib/servlet/build.xml b/contrib/servlet/build.xml new file mode 100644 index 000000000..be58e29ab --- /dev/null +++ b/contrib/servlet/build.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/servlet/conf/web.xml b/contrib/servlet/conf/web.xml new file mode 100644 index 000000000..4c5bad35e --- /dev/null +++ b/contrib/servlet/conf/web.xml @@ -0,0 +1,21 @@ + + + + + Fop + FopServlet + + + Fop + / + + + FopPrint + FopPrintServlet + + + FopPrint + /fopprint + + diff --git a/contrib/servlet/lib/readme.txt b/contrib/servlet/lib/readme.txt new file mode 100644 index 000000000..4bcbb18c8 --- /dev/null +++ b/contrib/servlet/lib/readme.txt @@ -0,0 +1 @@ +Put servlet.jar (Version 2.2 or higher) in this directory! \ No newline at end of file diff --git a/contrib/servlet/src/FopPrintServlet.java b/contrib/servlet/src/FopPrintServlet.java new file mode 100644 index 000000000..792a14d9c --- /dev/null +++ b/contrib/servlet/src/FopPrintServlet.java @@ -0,0 +1,241 @@ +/* + * $Id$ + * Copyright (C) 2002 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 java.util.Vector ; + +import java.awt.print.PrinterJob ; +import java.awt.print.PrinterException ; + +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.layout.Page; +import org.apache.fop.apps.Version; +import org.apache.fop.apps.XSLTInputHandler; +import org.apache.fop.messaging.MessageHandler; + +import org.apache.fop.render.awt.AWTRenderer ; + +import org.apache.avalon.framework.logger.ConsoleLogger; +import org.apache.avalon.framework.logger.Logger; + +/** + * Example servlet to generate a fop printout from a servlet. + * Printing goes to the default printer on host where the servlet executes. + * Servlet param is: + * + * + * Example URL: http://servername/fop/servlet/FopPrintServlet?fo=readme.fo + * Example URL: http://servername/fop/servlet/FopPrintServlet?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 + * - avalon-framework-x.jar (where x is the version found the FOP lib dir) + * - xalan-2.0.0.jar + */ + +public class FopPrintServlet 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) { + FileInputStream file = new FileInputStream(foParam); + 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 { + response.setContentType ("text/html"); + + PrintWriter out = response.getWriter(); + out.println("Error\n"+ "

FopServlet Error

No 'fo' or 'xml/xsl' "+ + "request param given.

"); + } + } catch (ServletException ex) { + throw ex; + } + catch (Exception ex) { + throw new ServletException(ex); + } + } + + /** + * Renders an FO inputsource to the default printer. + */ + public void renderFO(InputSource foFile, + HttpServletResponse response) throws ServletException { + try { + Driver driver = new Driver(foFile, null); + PrinterJob pj = PrinterJob.getPrinterJob(); + PrintRenderer renderer = new PrintRenderer(pj); + + driver.setLogger (log); + driver.setRenderer(renderer); + driver.run(); + + reportOK (response); + } catch (Exception ex) { + throw new ServletException(ex); + } + } + + /** + * Renders an FO generated using an XML and a stylesheet to the default printer. + */ + public void renderXML(XSLTInputHandler input, + HttpServletResponse response) throws ServletException { + try { + Driver driver = new Driver(); + PrinterJob pj = PrinterJob.getPrinterJob(); + PrintRenderer renderer = new PrintRenderer(pj); + + pj.setCopies(1); + + driver.setLogger (log); + driver.setRenderer (renderer); + driver.render (input.getParser(), input.getInputSource()); + + reportOK (response); + } catch (Exception ex) { + throw new ServletException(ex); + } + } + + // private helper, tell (browser) user that file printed + private void reportOK (HttpServletResponse response) + throws ServletException { + String sMsg = + "Success\n" + "

FopPrintServlet:

" + + "

The requested data was printed

" ; + + response.setContentType ("text/html"); + response.setContentLength (sMsg.length()); + + try { + PrintWriter out = response.getWriter(); + out.println (sMsg); + out.flush(); + } catch (Exception ex) { + throw new ServletException(ex); + } + } + + // This is stolen from PrintStarter + class PrintRenderer extends AWTRenderer { + + private static final int EVEN_AND_ALL = 0; + private static final int EVEN = 1; + private static final int ODD = 2; + + private int startNumber; + private int endNumber; + private int mode = EVEN_AND_ALL; + private int copies = 1; + private PrinterJob printerJob; + + PrintRenderer(PrinterJob printerJob) { + super(null); + + this.printerJob = printerJob; + startNumber = 0 ; + endNumber = -1; + + printerJob.setPageable(this); + + mode = EVEN_AND_ALL; + String str = System.getProperty("even"); + if (str != null) { + try { + mode = Boolean.valueOf(str).booleanValue() ? EVEN : ODD; + } catch (Exception e) {} + + } + } + + public void stopRenderer(OutputStream outputStream) + throws IOException { + super.stopRenderer(outputStream); + + if (endNumber == -1) + endNumber = getPageCount(); + + Vector numbers = getInvalidPageNumbers(); + for (int i = numbers.size() - 1; i > -1; i--) + removePage( + Integer.parseInt((String) numbers.elementAt(i))); + + try { + printerJob.print(); + } catch (PrinterException e) { + e.printStackTrace(); + throw new IOException("Unable to print: " + + e.getClass().getName() + ": " + e.getMessage()); + } + } + + public void renderPage(Page page) { + pageWidth = (int)((float) page.getWidth() / 1000f); + pageHeight = (int)((float) page.getHeight() / 1000f); + super.renderPage(page); + } + + + private Vector getInvalidPageNumbers() { + + Vector vec = new Vector(); + int max = getPageCount(); + boolean isValid; + for (int i = 0; i < max; i++) { + isValid = true; + if (i < startNumber || i > endNumber) { + isValid = false; + } else if (mode != EVEN_AND_ALL) { + if (mode == EVEN && ((i + 1) % 2 != 0)) + isValid = false; + else if (mode == ODD && ((i + 1) % 2 != 1)) + isValid = false; + } + + if (!isValid) + vec.add(i + ""); + } + + return vec; + } + } // class PrintRenderer + +} + 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: + * + * + * 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("Error\n"+ + "

FopServlet Error

No 'fo' "+ + "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 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); + } + } + +} -- 2.39.5