xexa
Setembro 29, 2008, 9:21am
#1
ae galera…
estou com um problema na hora de imprimir um pdf…
estoou utilizando o ireport…
ele n da erro…
o pdf ao invés de abrir com o acrobat…
ele imprime isso:
%PDF-1.4 %âãÏÓ 3 0 obj <>stream x�ÅYMsÓ0½ûWèWß�¹µ¥íÀ Ði;½0<¶IÝQÆIá÷2�8óa?[Q[Vã¦mú6yÒJÙÕ[IÆà}tv!
meu codigo é o seguinte
public void relatorioDeEstado(){
ClienteDAO bd = new ClienteDAO();
ArrayList<AuxHelp> lista= bd.taTudoDoido();
String caminho = "/reports/relatorio.jrxml";
try{
JSFUtil.imprimirPDF(lista, caminho);
}catch (Exception e) {
e.printStackTrace();
}
}
codigo JSFUtil.imprimirPDF(lista,caminho)
@SuppressWarnings("unchecked")
public static void imprimirPDF(List lista,String caminho){
FacesContext context = JSFUtil.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) Utility.getServletResponse();
Map parameters = new HashMap();
InputStream reportStream = JSFUtil.class.getResourceAsStream(
caminho);
JasperDesign jasperDesign = null;
try {
jasperDesign = JRXmlLoader.load(reportStream);
} catch (JRException e) {
System.out.println(e.getMessage());
}
JasperReport jasperReport = null;
try {
jasperReport = JasperCompileManager.compileReport(jasperDesign);
} catch (JRException e) {
System.out.println(e.getMessage());
}
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
lista);
JasperPrint jasperPrint = null;
byte[] arquivoPDF = null;
try {
jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, ds);
} catch (JRException e) {
System.out.println(e.getMessage());
}
// método para exportar o relatório para PDF
try {
arquivoPDF = JasperExportManager.exportReportToPdf(jasperPrint);
} catch (JRException e) {
e.getMessage();
}
response.setContentType("application/pdf");
response.setContentLength(arquivoPDF.length);
try {
response.getOutputStream().write(arquivoPDF);
response.getOutputStream().flush();
} catch (IOException e) {
e.printStackTrace();
}
[quote=xexa]ae galera…
estou com um problema na hora de imprimir um pdf…
estoou utilizando o ireport…
ele n da erro…
o pdf ao invés de abrir com o acrobat…
ele imprime isso:
%PDF-1.4 %âãÏÓ 3 0 obj <>stream x�ÅYMsÓ0½ûWèWß�¹µ¥íÀ Ði;½0<¶IÝQÆIá÷2�8óa?[Q[Vã¦mú6yÒJÙÕ[IÆà}tv!
xexa, dá pra postar de novo ? Teve um problema de codificação justamente com a mensagem de erro.
Mas pelo pouco que sei acho que você não devia passar o caminho dessa forma:
String caminho = "/reports/relatorio.jrxml";
Porque seu “caminho” vai depender de onde seu Servidor de aplicação está. Busca por conseguindo o path da aplicação no Google.
Espero ter ajudado
Opa!
Eu uso esse código para fazer a impressão
public abstract class GeraRelatorio extends FacesAction {
private String arquivoJasper;
private Collection dados;
private Map<String, Object> parametros;
public GeraRelatorio(String arquivoJasper, Collection dados, Map<String, Object> parametros) {
setArquivoJasper(arquivoJasper);
setDados(dados);
setParametros(parametros);
}
public String getArquivoJasper() {
return arquivoJasper;
}
public void setArquivoJasper(String arquivoJasper) {
this.arquivoJasper = arquivoJasper;
}
public Collection getDados() {
return dados;
}
public void setDados(Collection dados) {
this.dados = dados;
}
public Map<String, Object> getParametros() {
return parametros;
}
public void setParametros(Map<String, Object> parametros) {
this.parametros = parametros;
}
public InputStream getStreamArquivoJasper(String caminhoArquivo) {
InputStream stream = null;
try {
File fp = new File(caminhoArquivo);
stream = new FileInputStream(fp);
} catch (FileNotFoundException e) {
//TODO: Tratar exceção
e.printStackTrace();
} catch (IOException e) {
//TODO: Tratar exceção
e.printStackTrace();
}
return stream;
}
public abstract byte[] geraRelatorio();
}
e mais esse
public class GeraRelatorioPDF extends GeraRelatorio {
public GeraRelatorioPDF(String arquivoJasper, Collection dados, Map<String, Object> parametros) {
super(arquivoJasper, dados, parametros);
}
@Override
public byte[] geraRelatorio() {
Collection vo = getDados();
Map<String, Object> param = getParametros();
String nomeArquivo = getArquivoJasper();
try {
FacesContext context = FacesContext.getCurrentInstance();
InputStream fis = context.getExternalContext().getResourceAsStream(nomeArquivo);
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(vo);
HttpServletResponse response = getResponse();
ServletOutputStream responseStream = response.getOutputStream();
JasperRunManager.runReportToPdfStream(fis, responseStream, param, ds);
String nomePagina = context.getViewRoot().getViewId();
nomePagina = nomePagina.substring(nomePagina.lastIndexOf('/')+1, nomePagina.lastIndexOf('.'));
response.setContentType("application/pdf; name=\"" + nomePagina + ".pdf\"");
response.setHeader("Content-disposition", "inline; filename=\"" + nomePagina + ".pdf\"");
responseStream.flush();
responseStream.close();
context.renderResponse();
context.responseComplete();
} catch (IOException e) {
new LogUtil().getLogger().error(e);
addExceptionMessage(new PersistentException());
} catch (JRException e) {
new LogUtil().getLogger().error(e);
addExceptionMessage(new PersistentException());
}
return null;
}
}
Vê se ele é útil para você!
Abraço!
o método getResponse eu faço como
protected javax.servlet.http.HttpServletResponse getResponse() {
return (javax.servlet.http.HttpServletResponse) getExternalContext()
.getResponse();
}
xexa
Setembro 29, 2008, 9:58am
#5
meu problema é…
com h:commandButton ele imprime o pdf…
com <rich:menuItem nada acontece…
ibimon
Novembro 12, 2008, 2:09pm
#6
[quote=xexa]meu problema é…
com h:commandButton ele imprime o pdf…
com <rich:menuItem nada acontece…[/quote]
Boa tarde,
Como ficou sua chamada dentro do *.jsf, para gerar o relatório? :?:
Ibimon Pereira Morais
“Deus é Fiel!”