瀏覽代碼

Move over from contrib/servlet


git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@195912 13f79535-47bb-0310-9956-ffa450edef68
pull/30/head
Jeremias Maerki 21 年之前
父節點
當前提交
0fe34af9cb

+ 1
- 0
examples/servlet/.cvsignore 查看文件

@@ -0,0 +1 @@
build

+ 21
- 0
examples/servlet/README 查看文件

@@ -0,0 +1,21 @@
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. Run build.bat (on Windows) or build.sh (on Unix) to create the WAR file.
2. 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

+ 34
- 0
examples/servlet/build.bat 查看文件

@@ -0,0 +1,34 @@
@echo off

echo Fop Servlet 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.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=


+ 28
- 0
examples/servlet/build.sh 查看文件

@@ -0,0 +1,28 @@
#!/bin/sh
# This file should be executable.
echo
echo "Fop Servlet 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.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 $*

+ 91
- 0
examples/servlet/build.xml 查看文件

@@ -0,0 +1,91 @@
<?xml version="1.0"?>
<project default="package" basedir=".">
<property name="Name" value="Fop Servlet"/>
<property name="name" value="fopservlet"/>
<property name="version" value="0.2cvs"/>
<!-- 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 -->
<path id="project.class.path">
<fileset dir="${lib.dir}">
<include name="servlet*.jar"/>
</fileset>
<fileset dir="${fop.lib.dir}">
<include name="avalon-framework*.jar"/>
<include name="batik*.jar"/>
</fileset>
<fileset dir="${fop.lib.dir}/../build">
<include name="fop.jar"/>
</fileset>
</path>
<!-- =================================================================== -->
<!-- Initialization target -->
<!-- =================================================================== -->
<target name="init">
<tstamp/>
<filter token="version" value="${version}"/>
<property name="year" value="1999-2003"/>
<echo message="------------------- ${Name} ${version} [${year}] ----------------"/>
<available property="servlet.present" classname="javax.servlet.Servlet" classpathref="project.class.path"/>
</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="============================================================================="/>
<fail message="Dependecy check failed."/>
</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>

+ 21
- 0
examples/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>

二進制
examples/servlet/lib/servlet-2.2.jar 查看文件


+ 59
- 0
examples/servlet/lib/servlet.LICENSE.txt 查看文件

@@ -0,0 +1,59 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*
* This source code implements specifications defined by the Java
* Community Process. In order to remain compliant with the specification
* DO NOT add / change / or delete method signatures!
*/

+ 240
- 0
examples/servlet/src/FopPrintServlet.java 查看文件

@@ -0,0 +1,240 @@
/*
* $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.apps.FOPException;
import org.apache.fop.area.PageViewport;
import org.apache.fop.apps.Version;
import org.apache.fop.apps.XSLTInputHandler;

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);
}

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.enableLogging(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.enableLogging(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()
throws IOException {
super.stopRenderer();

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(PageViewport page) throws IOException, FOPException {
pageWidth = (int)((float) page.getViewArea().getWidth() / 1000f);
pageHeight = (int)((float) page.getViewArea().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

}


+ 136
- 0
examples/servlet/src/FopServlet.java 查看文件

@@ -0,0 +1,136 @@
/*
* $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.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);
}
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.enableLogging(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.enableLogging(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…
取消
儲存