Browse Source

Example Servlet moved over to examples/servlet


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-0_20_2-maintain@195849 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-0_20_5rc2
Jeremias Maerki 21 years ago
parent
commit
69d02ecfec

+ 0
- 1
contrib/servlet/.cvsignore View File

@@ -1 +0,0 @@
build

+ 0
- 22
contrib/servlet/README View File

@@ -1,22 +0,0 @@
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
- 34
contrib/servlet/build.bat View File

@@ -1,34 +0,0 @@
@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
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\ant-1.5.1.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xml-apis.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xercesImpl-2.2.1.jar
set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\xalan-2.4.1.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
- 29
contrib/servlet/build.sh View File

@@ -1,29 +0,0 @@
#!/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
LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/ant-1.5.1.jar
LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/xml-apis.jar
LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/xercesImpl-2.2.1.jar
LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/xalan-2.4.1.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
- 86
contrib/servlet/build.xml View File

@@ -1,86 +0,0 @@
<?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.5cvs"/>
<!-- 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-20020806.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" description="Builds the FOP servlet WAR file">
<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" description="Cleans the build directory">
<delete dir="${build.dir}"/>
</target>
</project>

+ 0
- 21
contrib/servlet/conf/web.xml View File

@@ -1,21 +0,0 @@
<?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
- 1
contrib/servlet/lib/readme.txt View File

@@ -1 +0,0 @@
Put servlet.jar (Version 2.2 or higher) in this directory!

+ 0
- 241
contrib/servlet/src/FopPrintServlet.java View File

@@ -1,241 +0,0 @@
/*
* $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
- 138
contrib/servlet/src/FopServlet.java View File

@@ -1,138 +0,0 @@
/*
* $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);
}
}

}

Loading…
Cancel
Save