diff options
author | Keiron Liddle <keiron@apache.org> | 2002-03-27 11:55:52 +0000 |
---|---|---|
committer | Keiron Liddle <keiron@apache.org> | 2002-03-27 11:55:52 +0000 |
commit | 9cfac12f9bd3234ae5a4503aed2466193c7e50d2 (patch) | |
tree | 732a5b215af41706c5f2012d6128e56279c18644 | |
parent | b274c52f988a2952d1fb8656a8f9cacabfd416de (diff) | |
download | xmlgraphics-fop-9cfac12f9bd3234ae5a4503aed2466193c7e50d2.tar.gz xmlgraphics-fop-9cfac12f9bd3234ae5a4503aed2466193c7e50d2.zip |
updated old servlet code, moved to contrib
added print servlet
Submitted By: Jeremias Maerki <jeremias.maerki@outline.ch>
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194721 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | contrib/servlet/README | 22 | ||||
-rwxr-xr-x | contrib/servlet/build.bat | 30 | ||||
-rwxr-xr-x | contrib/servlet/build.sh | 25 | ||||
-rw-r--r-- | contrib/servlet/build.xml | 86 | ||||
-rw-r--r-- | contrib/servlet/conf/web.xml | 21 | ||||
-rw-r--r-- | contrib/servlet/lib/readme.txt | 1 | ||||
-rw-r--r-- | contrib/servlet/src/FopPrintServlet.java | 241 | ||||
-rw-r--r-- | contrib/servlet/src/FopServlet.java | 138 |
8 files changed, 564 insertions, 0 deletions
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 @@ +<?xml version="1.0"?> +<project default="package" basedir="."> + <property name="Name" value="Fop Servlet"/> + <property name="name" value="fopservlet"/> + <property name="version" value="0.20.4cvs"/> + <!-- compiler switches --> + <property name="build.compiler" value="classic"/> + <property name="debug" value="off"/> + <property name="optimize" value="on"/> + <property name="deprecation" value="off"/> + <!-- directories --> + <property name="src.dir" value="./src"/> + <property name="conf.dir" value="./conf"/> + <property name="fop.lib.dir" value="../../lib"/> + <property name="lib.dir" value="./lib"/> + <property name="build.dir" value="./build"/> + <property name="build.src" value="./build/src"/> + <property name="build.dest" value="./build/classes"/> + <property name="build.war" value="./build/war"/> + <!-- stuff --> + <property name="servlet.jar" value="servlet.jar"/> + <property name="avalon-framework.jar" value="avalon-framework-cvs-20020315.jar"/> + <path id="project.class.path"> + <pathelement location="${lib.dir}/${servlet.jar}"/> + <pathelement location="${fop.lib.dir}/${avalon-framework.jar}"/> + <pathelement location="${fop.lib.dir}/../build/fop.jar"/> + <pathelement location="${fop.lib.dir}/batik.jar"/> + </path> + <!-- =================================================================== --> + <!-- Initialization target --> + <!-- =================================================================== --> + <target name="init"> + <tstamp/> + <filter token="version" value="${version}"/> + <property name="year" value="1999-2002"/> + <echo message="------------------- ${Name} ${version} [${year}] ----------------"/> + <available property="servlet.present" file="${lib.dir}/${servlet.jar}"/> + </target> + <target name="servlet-check" depends="init" unless="servlet.present"> + <echo message="============================================================================="/> + <echo message="servlet.jar is missing in the lib directory. Please get one and put it there."/> + <echo message="============================================================================="/> + </target> + <!-- =================================================================== --> + <!-- Prepares the build directory --> + <!-- =================================================================== --> + <target name="prepare" depends="init, servlet-check"> + <!-- create directories --> + <echo message="Preparing the build directories"/> + <mkdir dir="${build.dir}"/> + <mkdir dir="${build.dest}"/> + </target> + <!-- =================================================================== --> + <!-- Compiles the source directory --> + <!-- =================================================================== --> + <target name="compile" depends="prepare"> + <echo message="Compiling the sources "/> + <javac srcdir="${src.dir}" destdir="${build.dest}" debug="${debug}" deprecation="${deprecation}" optimize="${optimize}"> + <classpath refid="project.class.path"/> + </javac> + </target> + <!-- =================================================================== --> + <!-- Creates the class package --> + <!-- =================================================================== --> + <target name="package" depends="compile"> + <echo message="Creating the WAR file"/> + <war warfile="${build.dir}/fop.war" webxml="${conf.dir}/web.xml"> + <lib dir="${fop.lib.dir}"> + <include name="${avalon-framework.jar}"/> + <include name="batik.jar"/> + </lib> + <lib dir="${fop.lib.dir}/../build"> + <include name="fop.jar"/> + </lib> + <classes dir="${build.dest}"/> + </war> + </target> + <target name="all" depends="package"/> + <!-- "all" target for us Makefile converts ;-) --> + <!-- =================================================================== --> + <!-- Clean targets --> + <!-- =================================================================== --> + <target name="clean" depends="init"> + <delete dir="${build.dir}"/> + </target> +</project> 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 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" + "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> +<web-app> + <servlet> + <servlet-name>Fop</servlet-name> + <servlet-class>FopServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>Fop</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>FopPrint</servlet-name> + <servlet-class>FopPrintServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>FopPrint</servlet-name> + <url-pattern>/fopprint</url-pattern> + </servlet-mapping> +</web-app> 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: + * <ul> + * <li>fo: the path to a formatting object file to render + * </ul> + * + * 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("<html><title>Error</title>\n"+ "<body><h1>FopServlet Error</h1><h3>No 'fo' or 'xml/xsl' "+ + "request param given.</h3></body></html>"); + } + } 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 = + "<html><title>Success</title>\n" + "<body><h1>FopPrintServlet: </h1>" + + "<h3>The requested data was printed</h3></body></html>" ; + + 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: + * <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); + } + } + +} |