However, the FOP distribution comes with a default
implementation of these interfaces. The class is an inner class
of the FOPPrintServlet example class. With the help of this
class, you can handle any AWT based printing job pretty well. In
out example, we will use the same class for handling the print
job. Listing-1 presents a sample Java code for printing
documents from FOP.
import
java.awt.print.PrinterJob;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
javax.xml.transform.Source;
import
javax.xml.transform.Transformer;
import
javax.xml.transform.TransformerFactory;
import
javax.xml.transform.stream.StreamResult;
import
javax.xml.transform.stream.StreamSource;
import
org.apache.fop.apps.Driver;
import
org.jdom.Document;
import
org.jdom.input.DOMBuilder;
import
org.jdom.output.XMLOutputter;
import
org.xml.sax.InputSource;
public
class
FOPPrint {
public
void
createFO(Document xmlFile,
String xslFile)
{
System.out.println("Producing
FO document...");
Driver
psDriver =
new
Driver();
FileOutputStream
psOut =
null;
try
{
//1.
get a FOP driver
Driver
driver =
new
Driver();
String
outputFile =
"example-FO.fo";
FileOutputStream
out = null;
out
= new
FileOutputStream(outputFile);
driver.setOutputStream(out);
//Setup
XSLT
TransformerFactory
factory =
TransformerFactory.newInstance();
Transformer
transformer =
factory.newTransformer(new
StreamSource(xslFile));
ByteArrayOutputStream
outStream =
new
ByteArrayOutputStream();
new
XMLOutputter().output(xmlFile,
outStream);
outStream.close();
ByteArrayInputStream
inStream =
new
ByteArrayInputStream(outStream.toByteArray());
//Setup
input for XSLT transformation
Source
src = new
StreamSource(inStream);
//Start
XSLT transformation and FOP processing
transformer.transform(src,
new
StreamResult(out));
}
catch
(Exception e)
{
e.printStackTrace();
}
System.out.println("Finished
Producing FO document...");
}
public
void
testPrintFO(String foFile)
throws
IOException {
FileOutputStream
out = null;
try
{
FileInputStream
file = new
FileInputStream(foFile);
InputSource
source =
new
InputSource(file);
printFO(source);
}
catch
(Exception e)
{
e.printStackTrace();
}
}
public
void
printFO(InputSource foFile)
{
try
{
Driver
driver =
new
Driver(foFile, null);
PrinterJob
pj =
PrinterJob.getPrinterJob();
PrintRenderer
renderer =
new PrintRenderer(pj);
driver.setRenderer(renderer);
driver.run();
}
catch
(Exception ex)
{
}
}
public
static
void
main(String[] args)
{
FOPPrint
printer =
new
FOPPrint();
String
xmlFile =
"sample.xml";
String
xslFile =
"sample.xsl";
Document
doc = null;
File
file =
null;
try
{
System.out.println("Loading
the file: " + xmlFile);
file
= new
File(xmlFile);
doc
= new
DOMBuilder().build(file);
System.out.println("The
root element: " +
doc.getRootElement().getName());
//printer.printActiveNominal(doc,
xslFile);
printer.createFO(doc,
xslFile);
printer.testPrintFO("nominal-FO.fo");
}
catch
(Exception e)
{
//
TODO
Auto-generated catch block
e.printStackTrace();
}
}
}
Listing 1, FO document and Print example
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.