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???
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???
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???