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
@@ -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 |
@@ -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= | |||
@@ -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 $* |
@@ -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> |
@@ -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> |
@@ -0,0 +1 @@ | |||
Put servlet.jar (Version 2.2 or higher) in this directory! |
@@ -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 | |||
} | |||
@@ -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); | |||
} | |||
} | |||
} |