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-ffa450edef68pull/30/head
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 |
@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= | |||||
#!/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 $* |
<?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> |
<?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> |
Put servlet.jar (Version 2.2 or higher) in this directory! |
/* | |||||
* $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 | |||||
} | |||||
/* | |||||
* $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); | |||||
} | |||||
} | |||||
} |