Eu construi um relatório usando JASPER que é chamado via JSF.
Eu tenho então um botão que gera o relatório e carrega os bytes do relatório.
Então, eu gero uma cópia do relatório para testes em um File, e escrevo na tela também.
Mudo o content-type da página, mas, a página não entende o Content-Type.
O arquivo PDF físico ficou lindo, mas a página fica:
%PDF-1.4 %âãÏÓ 3 0 obj <>stream x? ?ßnÓ0Æïýî`Õ¸X°ãØ?;â?´`ëâ"4I×Ò®]?nåy{1 ?+^?ã?5IY ±¢ÔG ó}?ªsäòzH?¢St?·Cò?¸ôÜ|Ë)?Ë|?K?sòü§ª??<NÍ\?àxp+??I>OjIOµKÓ?$% FGó²¨Ë¨(ÇçÂÂ3Â`??\ij0û?NtFéva×ÕÏ_`?v©ëý???<=Çó÷?9ð|¯Féä~k<Ó?®ç°?YÿJ?;?Nr@ù}ñþa¬?+GÒ91¼òzF.Øù?rLäÏúòOý׳wæ;{?!?[¼+fé¡ú×ëÙ¬£ÿÇF_É@? ^¨ Ð?³WJë?z©¿6ô ¥®½§?×m¨+-j#»¨cú?¨c@=JÖÉíõ$\ÉΨ}Y ÞÕ Pûº6§°?Ñ·?±¨ V?Q+^ ÞÕ P+Y?Ó³?Ñ·?±Ø£þ¹]ù?Q{~?zW·B-ymΦE?èÛB?XTP?Q?¢Cæu+Ô¢¾½4Ýp(jDßjÄP¯?Å?«é÷Ñê[gýî/^j?¼uktëûJÓM?âFômáF,*¸Ügýî/Vj?¬u{dõ½¥éÆCq#ú¶p#?ûC/?6Y?]?7OîVññtÑË®æÇÓ¸?¥7Éÿd`?f\+z8?)D?JG.ò£O)±§]?kêº?*ÎQ¬?úc8?aêÂv2)¤?æ±G??_ÑX´ë?È ?ñ&O?xç-Þìß÷g8 À endstream endobj 1 0 obj<<>/Resources<<>/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]/Font<>>>/MediaBox[0 0 595 842]>> endobj 5 0 obj[1 0 R/XYZ 0 854 0] endobj 2 0 obj<> endobj 4 0 obj<> endobj 6 0 obj<> endobj 7 0 obj<> endobj 8 0 obj<> endobj 9 0 obj<> endobj xref 0 10 [telefone removido] 65535 f [telefone removido] 00000 n [telefone removido] 00000 n [telefone removido] 00000 n [telefone removido] 00000 n [telefone removido] 00000 n [telefone removido] 00000 n [telefone removido] 00000 n [telefone removido] 00000 n [telefone removido] 00000 n trailer <<8f4d69c765ea6d04e893dba1f566b345>]/Root 8 0 R/Size 10/Info 9 0 R>> startxref 1409 %%EOFO relatório é escrito em página usando:
byte conteudo[] = "Relatório PDF gerado pelo JasperReport";
public void getReport() {
HttpServletResponse response =
(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
try {
if (conteudo != null) {
response.setHeader("Expires", "0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setHeader("Cache-Control", "no-cache");
response.setContentLength(conteudo.length);
OutputStream out = response.getOutputStream();
out.write(conteudo);
out.flush();
out.close();
} else {
response.setContentType("text/html;charset=windows-1252");
PrintWriter out = response.getWriter();
out.println("Erro ao gerar o relatório");
}
} catch (Exception e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
Agora, um fato estranho...
Se eu mudo o response.setContentType("application/pdf"); para response.setContentType("application/msword"); não acontece nada do mesmo jeito.
Eu observei que quando insiro este cabeçalho via Servlet funciona...
O que no JSF me impede de reescrever o content-type?