Microtutorial FOP

3 respostas
E

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 :slight_smile:

3 Respostas

Daniel_Quirino_Olive

Boa, André. Agora, faça o seguinte: dê uma arrumadinha naquilo que você achar necessário e mande para [email removido] para que possamos publicá-lo. :smiley:

E

eu fiz muito rápido e quero melhorar incluindo um exemplo de como gerar PDF.
Espero que esse tutorial ajude muita gente que precisa de uma solução rápida e eficaz para impressão.

danieldestro

Affeee,
só de olhar me assustou…
mas publique que vou querar dar uma olhada nisso.

Criado 5 de novembro de 2003
Ultima resposta 10 de nov. de 2003
Respostas 3
Participantes 3