Problema com itext

Ola pessoal, fiz um relatório utilizando o iText, funcionou direitinho enquanto eu estava desenvolvendo no eclipse.

Exportei meu projeto .war para o tomcat, e meus relatórios com iText pararam de funcionar.

Vejam o código que gera e abre o arquivo pdf.


public void relatorio_fornecedor()
	{
		
		List<Fornecedor> fornecedor = forDao.listaFornecedores();
		Date data = new Date();
		
		 // criando um objeto da classe Document
        Document documento = new Document();
        
        try {
        	
            //Aqui começamos a utilizar as classes do iText: o documento
            //criado acima será     
            //direcionado para um arquivo PDF.	         
    
        	PdfWriter.getInstance(documento, new FileOutputStream("fornecedores.pdf"));
            
            //abrindo o documento.
            documento.open();
            SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
          
            Image figura = Image.getInstance("/global.jpg");
            documento.add(figura);
            //adicionando no arquivo PDF. 
            Paragraph p1 = new Paragraph("Lista de Fornecedores");
            p1.setAlignment(Element.ALIGN_CENTER);
            p1.setSpacingAfter(20);
            documento.add(p1);
            
            Paragraph p2 = new Paragraph("CREW - 424");
            p2.setSpacingAfter(10);
            documento.add(p2);
            
            PdfPTable table = new PdfPTable(5);
            PdfPCell header = new PdfPCell();
            
            header.setColspan(5);
            table.addCell("Fornecedor");
            table.addCell("CNPJ");
            table.addCell("Telefone");
            table.addCell("Falar com");
            table.addCell("E-mail");
           
            for(int i=0; i < fornecedor.size(); i++){
            	
           
            header.setColspan(4);
            header.setSpaceCharRatio(10);
            table.addCell(""+fornecedor.get(i).getNome());
            table.addCell(fornecedor.get(i).getCNPJ());
            table.addCell(""+fornecedor.get(i).getTelefone());
            table.addCell(fornecedor.get(i).getContato());
            table.addCell(fornecedor.get(i).getEmail());
            }
            documento.add(table);
            
            Paragraph p4 = new Paragraph("Data: "+formatador.format(data));
            p4.setAlignment(Element.ALIGN_RIGHT);
            p4.setSpacingAfter(10);
            documento.add(p4);
            
            Paragraph p5 = new Paragraph("Relatório gerado com base em informações do Sistema Informatizado da Global Geophysical Services - SisGlobal.");
            p5.setSpacingAfter(10);
            documento.add(p5);
            
        }

        catch(DocumentException de) {
            System.err.println(de.getMessage());
        }
        catch(IOException ioe) {
            System.err.println(ioe.getMessage());
        }
       
        documento.close();
        
        File pdf = new File("fornecedores.pdf");  
        try {  
          Desktop.getDesktop().open(pdf);  
        } catch(Exception ex) {  
          //validator.add((Message) new ValidationMessage("Erro ao abrir o arquivo PDF, favor tentar novamente.", "erro"));
          //validator.onErrorRedirectTo(this).receber(idPessoa);
        } 
        
        result.redirectTo(ProdutoController.class).estoque();
	}
	

Alguem pode me ajudar???

Algum erro de aparece?

Verifique se quando você exportou o .war, se a lib do itext foi exportada junto.

Boa sorte

está funcionando sim, está salvando o arquivo direitinho…

O problema esta no comando de abrir o arquivo, pois não está sendo aberto…


 catch(DocumentException de) {  
            System.err.println(de.getMessage());  
        }  
        catch(IOException ioe) {  
            System.err.println(ioe.getMessage());  
        }  
         
        documento.close();  
          
        File pdf = new File("fornecedores.pdf");    //não sei pq não ta abrindo... pois quando executado no eclipse abre direitinho...
        try {    
          Desktop.getDesktop().open(pdf);    
        } catch(Exception ex) {    
          //validator.add((Message) new ValidationMessage("Erro ao abrir o arquivo PDF, favor tentar novamente.", "erro"));  
          //validator.onErrorRedirectTo(this).receber(idPessoa);  
        }   

Não tem mensagem de erro?? Nem na hora que ele tenta abrir o arquivo pdf?

sem mensagem de erro, ele ate redireciona corretamente.

Mas não abre…

Alguem mais, poderia me ajudar???

Me ajudem galera…

Bom, esse código não deve funcionar em webapplications.

Desktop.getDesktop().open(pdf);

Acredito que você deveria redirecionar para a url do fornecedores.pdf

Mas vou fazer uns testes aqui e depois respondo.

Boa sorte

Bom, eu fiz um exemplo aqui usando Servlet.

package com.geek.tutorial.itext.servlet;

import javax.servlet.*;
import javax.servlet.http.*;

import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;

import java.io.*;
import java.util.*;

public class PDFServlet extends HttpServlet {

	public void init(ServletConfig config) throws ServletException{
		super.init(config);
	}
	
	public void doGet(HttpServletRequest request,  HttpServletResponse response)  throws ServletException, IOException{
		doPost(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException{
		
		response.setContentType("application/pdf"); // Code 1
		Document document = new Document();
		try{
			PdfWriter.getInstance(document, response.getOutputStream()); // Code 2
			document.open();
			
			// Code 3
			PdfPTable table = new PdfPTable(2);
			table.addCell("1");
			table.addCell("2");
			table.addCell("3");
			table.addCell("4");
			table.addCell("5");
			table.addCell("6");		
			
			// Code 4
			document.add(table);		
			document.close(); 
		}catch(DocumentException e){
			e.printStackTrace();
		}
	}
	
}

Veja que ao inicializar PdfWriter, eu usei a stream de response.getOutputStream();

PdfWriter.getInstance(document, response.getOutputStream()); // Code 2

Boa sorte

Amigo, obrigado por se empenhar, mas o problema não ta sendo em criar o pdf e sim em abri-lo.

Se puder me ajudar…

Ele ta sendo criado direitinho, so não ta abrindo…

ACHO QUE NÃO FUI CLARO, ENTÃO VAMOS LA DE NOVO…

Ola pessoal, fiz um relatório utilizando o iText e estou utilizando o MVC do VRAPTOR com Hibernate, funcionou direitinho enquanto eu estava desenvolvendo no eclipse.

Exportei meu projeto .war para o tomcat, e meus relatórios com iText pararam de funcionar.

Vejam o código que gera e abre o arquivo pdf.

public void relatorio_fornecedor()  
    {  
          
        List<Fornecedor> fornecedor = forDao.listaFornecedores();  
        Date data = new Date();  
          
         // criando um objeto da classe Document  
        Document documento = new Document();  
          
        try {  
              
            //Aqui começamos a utilizar as classes do iText: o documento  
            //criado acima será       
            //direcionado para um arquivo PDF.             
      
            PdfWriter.getInstance(documento, new FileOutputStream("fornecedores.pdf"));  
              
            //abrindo o documento.  
            documento.open();  
            SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");  
            
            Image figura = Image.getInstance("/global.jpg");  
            documento.add(figura);  
            //adicionando no arquivo PDF.   
            Paragraph p1 = new Paragraph("Lista de Fornecedores");  
            p1.setAlignment(Element.ALIGN_CENTER);  
            p1.setSpacingAfter(20);  
            documento.add(p1);  
              
            Paragraph p2 = new Paragraph("CREW - 424");  
            p2.setSpacingAfter(10);  
            documento.add(p2);  
              
            PdfPTable table = new PdfPTable(5);  
            PdfPCell header = new PdfPCell();  
              
            header.setColspan(5);  
            table.addCell("Fornecedor");  
            table.addCell("CNPJ");  
            table.addCell("Telefone");  
            table.addCell("Falar com");  
            table.addCell("E-mail");  
             
            for(int i=0; i < fornecedor.size(); i++){  
                  
             
            header.setColspan(4);  
            header.setSpaceCharRatio(10);  
            table.addCell(""+fornecedor.get(i).getNome());  
            table.addCell(fornecedor.get(i).getCNPJ());  
            table.addCell(""+fornecedor.get(i).getTelefone());  
            table.addCell(fornecedor.get(i).getContato());  
            table.addCell(fornecedor.get(i).getEmail());  
            }  
            documento.add(table);  
              
            Paragraph p4 = new Paragraph("Data: "+formatador.format(data));  
            p4.setAlignment(Element.ALIGN_RIGHT);  
            p4.setSpacingAfter(10);  
            documento.add(p4);  
              
            Paragraph p5 = new Paragraph("Relatório gerado com base em informações do Sistema Informatizado da Global Geophysical Services - SisGlobal.");  
            p5.setSpacingAfter(10);  
            documento.add(p5);  
              
        }  
  
        catch(DocumentException de) {  
            System.err.println(de.getMessage());  
        }  
        catch(IOException ioe) {  
            System.err.println(ioe.getMessage());  
        }  
         
        documento.close();  
          
         //ATE AQUI FUNCIONOU DIREITINHO
         //DAQUI PRA FRENTE É QUE NÃO TA EXECUTANDO
         //DAQUI PRA FRENTE É O CÓDIGO PARA ABRIR O PDF PARA O OPERADOR DO SISTEMA VISUALIZAR, E NÃO TA ABRINDO.

        File pdf = new File("fornecedores.pdf");    
        try {    
          Desktop.getDesktop().open(pdf);    
        } catch(Exception ex) {    
          //validator.add((Message) new ValidationMessage("Erro ao abrir o arquivo PDF, favor tentar novamente.", "erro"));  
          //validator.onErrorRedirectTo(this).receber(idPessoa);  
        }   
          
        result.redirectTo(ProdutoController.class).estoque();  
    }  
      

Alguem pode me ajudar???

Amigo, te entendi desde o inicio, o problema está aqui.

Desktop.getDesktop().open(pdf);   

Esse código acima, só funciona no eclipse porque está no seu próprio computador, após fazer o deploy, isso não funciona.

Esse código tenta abrir o arquivo com a aplicação padrão de arquivos pdf, que no caso pode ser o Adobe Reader, mas isso só funciona em aplicação swing.

Por isso te disse que você pode redirecionar para a url do arquivo pdf. Ex:(http://localhost:8080/minhaapp/arquivo.pdf)

Ou você pode usar a stream response.getOutputStream();

Boa sorte

mas como vou fazer esse redirecionamente???

tipo aqui:

File pdf = new File(diretorio+"fornecedores.pdf");
        try {  
        	
        	Desktop.getDesktop().open(pdf);
          
        } catch(Exception ex) {  
          validator.add(new ValidationMessage("Erro ao abrir o arquivo PDF, favor tentar novamente.", "erro"));
          validator.onErrorRedirectTo(this).form_cadastra();
        } 
        
        result.redirectTo(this).form_cadastra();
	}

como iria ficar o redirecionamento no código acima???