PDF em branco no servidor Linux

15 respostas
vmoreira

Tenho uma aplicação WEB que gera um boleto bancário em PDF e outro em HTML, quando eu faço um deploy do arquivo .war na minha máquina que é windows funciona que é uma beleza, porém quando eu faço um deploy no servidor linux já em produção, e gero o boleto tante m PDF, quanto em HTML é retornado uma página em branco, alguém pode me ajudar?

Segue o Servlet:

[b]

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.util.HashMap;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
import br.com.webdec.util.ConexaoDB;


@SuppressWarnings("serial")
public class BoletoServlet extends HttpServlet {


	private static String javaPath;


	Connection conn;

	public BoletoServlet()
	{

	}

	@SuppressWarnings("static-access")
	public void service(HttpServletRequest request,HttpServletResponse response) 
	{

		if(this.javaPath==null){
			this.javaPath =  this.getServletContext().getRealPath(File.separator +"WEB-INF" + File.separator + "classes" + File.separator);

		}	

		String relatorio = request.getParameter("relatorio");


		try{
			geraBoleto(request, response, relatorio);
		}catch(JRException erro){
			erro.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("unchecked")
	public void geraBoleto(HttpServletRequest request,HttpServletResponse response, String versao)throws JRException, Exception 
	{
		HttpSession sessao = request.getSession(true);

		
		HashMap parametros = new HashMap();
		
		parametros.put("pID_BOLETO",(String) sessao.getAttribute("id_boleto")); 
		parametros.put("pNOME_ADOTANTE",(String) sessao.getAttribute("nome_adotante"));

		// conexão com o banco
		ConexaoDB banco = new ConexaoDB();
		

		if(versao.equals("boletopdf")){
			String relatorio = javaPath + File.separator + "boletojmm2.jasper";
			try{
				byte [] pdf_boleto = JasperRunManager.runReportToPdf(relatorio,parametros,banco.getConnection());
				ServletOutputStream out = response.getOutputStream();
				response.setContentType("application/pdf");

				
				response.setHeader("Content-Disposition", "attachment; filename=relatorio.pdf"); 
				out.write(pdf_boleto);
			}catch(IOException erro){
				erro.printStackTrace();
			}
		}else{
			String relatorio = javaPath + File.separator + "boletojmmhtml.jasper";
			JasperPrint relatorioFinal = JasperFillManager.fillReport(relatorio, parametros, banco.getConnection());
			PrintWriter printWriter = response.getWriter(); 
			JRHtmlExporter htmlExporter = new JRHtmlExporter();  
			response.setContentType("text/html");  
			request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, relatorioFinal);  
			htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, relatorioFinal);  
			htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER,printWriter);  
			htmlExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "ISO-8859-1");

			htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, request.getContextPath() + File.separator +"image.servlet?image=");  
			htmlExporter.exportReport(); 
		}

		
	}
}

[/b]

15 Respostas

vmoreira

Esqueci de comentar que uso o iReports para gerar os arquivos jasper.

alves.Felipe

uma sugestão…
http://www.guj.com.br/posts/list/50115.java

outra coisa…da algum erro?

vmoreira

Não mostra nenhum erro, só aparece a página em branco

alves.Felipe

cara… não gostei muito da cara dessa váriavel javaPath
no seu pc vc consegue acessar a WEB-INF?
faz imprimir no console essa variavel e ve se ta certo…
joga seu .jasper dentro de uma pasta no WebContent… e depois testa…

vmoreira

Vou testar aqui e já posto…

vmoreira

Eu alterei estas linhas

public void service(HttpServletRequest request,HttpServletResponse response) 
	{

		if(this.javaPath==null){
			this.javaPath =  this.getServletContext().getRealPath(File.separator +"WebContent" + File.separator + "boleto" + File.separator);

		}

Ele me retornou este erro

net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: C:\Ricardo\Java\Eclipse Galileo\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\JMMBoleto2\WebContent\boleto\boletojmmhtml.jasper
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:75)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:232)
	at br.com.webdec.servlet.boleto.BoletoServlet.geraBoleto(BoletoServlet.java:96)
	at br.com.webdec.servlet.boleto.BoletoServlet.service(BoletoServlet.java:53)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: C:\Ricardo\Java\Eclipse Galileo\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\JMMBoleto2\WebContent\boleto\boletojmmhtml.jasper
alves.Felipe

cara… mas dentro do seu webContent existe o diretorio boleto?
e dentro deste existe o arquivo boletojmmhtml.jasper ?
cara eu uso assim:
getServletContext().getResourcePaths(“boleto”+File.Separator);

vmoreira

Sim, eu criei agora, com este código que está agora, no eclipse funciona tranquilo, não traz mais o path do c: mas quando eu rodo no browse ele diz que não encontrou o arquivo.

e alterei o código agora está assim:

package br.com.webdec.servlet.boleto;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.util.HashMap;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
import br.com.webdec.util.ConexaoDB;


@SuppressWarnings("serial")
public class BoletoServlet extends HttpServlet {


//	private static String javaPath;


	Connection conn;

	public BoletoServlet()
	{

	}

	@SuppressWarnings("static-access")
	public void service(HttpServletRequest request,HttpServletResponse response) 
	{

	//	if(this.javaPath==null){
		//	this.javaPath =  this.getServletContext().getRealPath(File.separator +"WEB-INF" + File.separator + "classes" + File.separator);

	//	}	

		String relatorio = request.getParameter("relatorio");


		try{
			geraBoleto(request, response, relatorio);
		}catch(JRException erro){
			erro.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("unchecked")
	public void geraBoleto(HttpServletRequest request,HttpServletResponse response, String versao)throws JRException, Exception 
	{
		HttpSession sessao = request.getSession(true);

		//String relatorio = javaPath+"/rel_aluno.jasper";
		HashMap parametros = new HashMap();
		//HashMap<String,String> parametros = new HashMap<String,String>();
		//parametros.put("Foto","29" );

		parametros.put("pID_BOLETO",(String) sessao.getAttribute("id_boleto")); //13731
		parametros.put("pNOME_ADOTANTE",(String) sessao.getAttribute("nome_adotante"));

		// conexão com o banco
		ConexaoDB banco = new ConexaoDB();
		//ConnectionFactory banco = new ConnectionFactory();
		//this.conn = ConnectionFactory.getConnection();
		//System.out.println((String)relatorio);

		if(versao.equals("boletopdf")){
			//String relatorio = javaPath + File.separator + "boletojmm2.jasper";
		//	String relatorio = File.separator +"JMMBoleto2"+ File.separator +"boleto"+ File.separator + "boletojmm2.jasper";
			String relatorio = File.separator +"boleto"+ File.separator + "boletojmm2.jasper";
			
			try{
				byte [] pdf_boleto = JasperRunManager.runReportToPdf(relatorio,parametros,banco.getConnection());
				ServletOutputStream out = response.getOutputStream();
				response.setContentType("application/pdf");

				//response.setHeader("Content-Disposition", "inline; filename=relatorio.pdf"); 
				response.setHeader("Content-Disposition", "attachment; filename=relatorio.pdf"); 
				out.write(pdf_boleto);
			}catch(IOException erro){
				erro.printStackTrace();
			}
		}else{
//			String relatorio = javaPath + File.separator + "boletojmmhtml.jasper";
//			String relatorio = File.separator +"JMMBoleto2"+ File.separator +"boleto"+ File.separator + "boletojmmhtml.jasper";
			String relatorio = File.separator +"boleto"+ File.separator + "boletojmmhtml.jasper";
			JasperPrint relatorioFinal = JasperFillManager.fillReport(relatorio, parametros, banco.getConnection());
			PrintWriter printWriter = response.getWriter(); 
			JRHtmlExporter htmlExporter = new JRHtmlExporter();  
			response.setContentType("text/html");  
			request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, relatorioFinal);  
			htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, relatorioFinal);  
			htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER,printWriter);  
			htmlExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "ISO-8859-1");

			htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, request.getContextPath() + File.separator +"image.servlet?image=");  
			htmlExporter.exportReport(); 
		}

		//String pdf_boleto = JasperRunManager.runReportToHtmlFile(relatorio,parametros,banco.getConnection());

		//System.out.println("htmFile=" + pdf_boleto);
		//mostraRelatorio(pdf_boleto,response);
	}
}
vmoreira

Vc consegue dar o exemplo que vc deu (getServletContext().getResourcePaths(“boleto”+File.Separator):wink: no meu código?

alves.Felipe

cara… te falei errado … aquilo ali uso para pegar os arquivo do diretorio…
mas nessa parte faz assim:

String relatorio = this.getServletContext().getRealPath(File.separator +"boleto"+ File.separator + "boletojmm2.jasper");
vmoreira

mas usando o realpath ele vai me retornar o path do windows, o que eu quero que ele puxe o arquivo é no servidor linux, onde irá ficar o war.

alves.Felipe

TA mas quando vc estiver no linux vai pegar o caminho do linux…
mas de qq forma deixa um print no console… ai vc vai vendo se esta certo ou nao

vmoreira

Não funcionou, eu estou fazendo o deploy no servidor linux através da minha máquina que é windows, pelo browse, isso tem algum problema?? Na minha máquina ficou uma maravilha, funcionou perfeitamento, só quando faço o deploy lá não funciona…
Sabe me dizer se toda vez que eu fizer um deploy no linux tenho que reinicar o tomcat ?

alves.Felipe

a principio não precisa… só precisa reiniciar o tomcat, se não fizer o deploy certo… mas se vc consegue acessar sua aplicação…
acho q não tem necessidade…
e oque sai no print do caminho do arquivo, no servidor linux?

vmoreira

qual arquivo que eu vejo no linux, pois já verifiquei os arquivos de log dentro da pasta tomcat no linux e não tinha nenhum problema lá…

Criado 12 de agosto de 2010
Ultima resposta 13 de ago. de 2010
Respostas 15
Participantes 2