Tutorial ultrarápido e simples sobre impressão usando FOP:
Primeiramente temos que criar um arquivo texto do tipo XSL-FO que define arquivos para impressão usando XML (há uma boa documentação na distribuição do FOP).
OBS: salve como .fo por padronização
Exemplo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21cm" margin-top="1.5cm" margin-bottom="1cm" margin-left="1.5cm" margin-right="1cm">
<fo:region-body margin-top="0cm" margin-bottom="0cm"/>
<fo:region-before extent="0cm"/>
<fo:region-after extent="0cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simple">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="12pt" font-family="serif" line-height="24pt" space-after.optimum="15pt" text-align="center" padding-top="3pt">
<fo:inline font-weight="bold">CONTRATO DE PRESTAÇÃO DE SERVIÇOS PROFISSIONAIS</fo:inline>
</fo:block>
<fo:block font-size="10pt" font-family="serif" line-height="15pt" space-after.optimum="5pt" text-align="justify"><fo:inline font-weight="bold">CONTRATADA</fo:inline>: FULANA, com sede à Rua Monteiro Lobato, 599, Bairro Romano, na cidade de são José do Rio Preto...</fo:block>
<fo:block font-size="10pt" font-family="serif" line-height="15pt" space-after.optimum="5pt" text-align="justify"><fo:inline font-weight="bold">CONTRATANTE</fo:inline>: ACME, com sede à Rua Paulo Coelho, 599, Bairro Romano, na cidade de são José do Rio Preto...</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Depois crie uma classe que será o aplicativo de preview
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import javax.swing.WindowConstants;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.avalon.framework.logger.ConsoleLogger;
import org.apache.fop.apps.Driver;
import org.apache.fop.apps.FOPException;
import org.apache.fop.render.awt.AWTRenderer;
import org.apache.fop.viewer.PreviewDialog;
import org.apache.fop.viewer.SecureResourceBundle;
import org.apache.fop.viewer.Translator;
import org.apache.fop.viewer.UserMessage;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.ParserAdapter;
public final class VisualizadorFOP {
public static final String TRANSLATION_PATH = "/org/apache/fop/viewer/resources/";
protected PreviewDialog createPreviewDialog(AWTRenderer renderer, Translator res){
PreviewDialog frame = new PreviewDialog(renderer, res);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.validate();
frame.setTitle("Visualizar impressão");
/** Descobre o tamanho da janela */
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
frame.setSize(screen);
frame.setVisible(true);
return frame;
}
public final SecureResourceBundle getResourceBundle(String path) throws IOException{
URL url = getClass().getResource(path);
if(url == null){
path = path.substring(0, path.lastIndexOf(".")) + ".en";
url = getClass().getResource(path);
}
return new SecureResourceBundle(url.openStream());
}
public final void visualizaXSLFO(String arquivoXSLFO) throws IOException, FOPException {
String linguagem = System.getProperty("user.language");
Translator translator = getResourceBundle(TRANSLATION_PATH + "resources." + linguagem);
translator.setMissingEmphasized(false);
UserMessage.setTranslator(getResourceBundle(TRANSLATION_PATH + "messages." + linguagem));
AWTRenderer renderer = new AWTRenderer(translator);
PreviewDialog frame = createPreviewDialog(renderer, translator);
renderer.setProgressListener(frame);
renderer.setComponent(frame);
try{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
Reader in = new FileReader(arquivoXSLFO);
Driver driver = new Driver();
driver.setLogger(new ConsoleLogger(ConsoleLogger.LEVEL_INFO));
driver.setRenderer(renderer);
driver.render(new ParserAdapter(parser.getParser()), new InputSource(in));
in.close();
frame.showPage();
}
catch(Exception e){
frame.reportException(e);
if(e instanceof FOPException){
throw (FOPException) e;
}
throw new FOPException(e);
}
}
}
Na classe que chamará o aplicativo de preview de impressão basta criar um objeto e chamar o método adequado passando o nome do arquivo
VisualizadorFOP visualiza = new VisualizadorFOP();
visualiza.visualizaXSLFO(“contrato.fo”);
Para finalizar o FOP é encontrado no site do grupo Apache: http://xml.apache.org/fop
até a próxima 
