Probleminha com FOP

4 respostas
J

Fala galera…

Seguinte, seguindo orientações da galera daki e depois de muita pesquisa… Encontrei uma api que soluciona os meus problemas na geração do PDF…

Qual será ??? FOP…

Fui no site do grupo jakarta e vi a documentação e os exemplos…

Tentei executar um aki… Mas ele naum reconhece 2 métodos do classe Driver…

São os 2:

-> enableLogging(String);
-> initialize();

Fala que não está achando os 2…

Eu baixei o fop-0.20.5 Bin… Utilizo o WinXP…

Adicionei certinho no projeto (Eclipse) os jars…

  • fop.jar
  • avalon framework

Se alguém puder me ajudar…

Será que eu tenho q baixar o src do FOP ??

Grato

4 Respostas

E

adicione no classpath todos os pacotes do diretório lib.

E

ai vai um exeplo de um servlet usando FOP:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.avalon.framework.logger.ConsoleLogger;
import org.apache.avalon.framework.logger.Logger;
import org.apache.fop.apps.Driver;
import org.apache.fop.messaging.MessageHandler;
import org.xml.sax.InputSource;

public class FopServlet extends HttpServlet {
    Logger log = null;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
		try {
	
	        if (log == null) {
	            log = new ConsoleLogger(ConsoleLogger.LEVEL_WARN);
	            MessageHandler.setScreenLogger(log);
	        }

            File fofile = new File("contrato.fo");
            FileInputStream file = new FileInputStream(fofile);
            renderFO(new InputSource(file), response);
        } 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);
        }
    }
}

lembrando que o arquivo .fo é um arquivo que obedece o padrão XSL-FO.

eu uso o FOP e recomendo. Se quiser saber como fazer para uma aplicação web abrir o Acrobat Reader e apresentar o texto para o usuário, estamos aí :stuck_out_tongue:

J

Eddie, eu coloquei tudo no CLASSPATH… e adicionei todos os jars no meu projeto…

Mas mesmo assim ele naum reconhece os métodos…

Ahh…valew pelo Servlet… Vai ser bem útil pra mim…

Qualquer coisa entaum eu te mando uma msg privada…pode ser ??

Falow

E

ai vai o fonte para apresentar o visualizador padrão em Swing cedido pelo FOP.

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

	}
}

ele não utiliza os comandos enableLogging(String) e initialize(). E não esqueça de chamar o método visualizaXSLFO passando o nome do arquivo .FO

:smiley:

Criado 17 de fevereiro de 2004
Ultima resposta 17 de fev. de 2004
Respostas 4
Participantes 2