Pessoal, tenho um servlet que faz gerar um relatório em PDF, o problema é que ele apenas é gerado e fica salvo na pasta do meu projeto, quero que depois que ele seja gerado apareça aquela opção de “Abrir com” ou “salvar” do navegador. Estou usando o código abaixo:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Connection con = new ConexaoMySQL().getConnection();
HashMap parametros = new HashMap();
ServletContext sc = getServletContext();
String nomeArquivo = sc.getRealPath("/") + "teste.pdf";
JasperPrint jp = JasperFillManager.fillReport(sc.getRealPath("/jasper/teste.jasper"), parametros, con);
JasperExportManager.exportReportToPdfFile(jp, nomeArquivo);
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet GeraPDF</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Relatório Gerado" + "</h1>");
out.println("</body>");
out.println("</html>");
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
}
tenta assim …
response.setContentType("application/force-download");
response.setHeader("Content-Disposition", "inline;filename="
+ nome_relatorio+ ".pdf");
ServletOutputStream servletOutputStream = response.getOutputStream();
InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/jasper/teste.jasper");
JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream, parametros, con);
servletOutputStream.flush();
servletOutputStream.close();
Ele exibe aquela janela pra salvar ou abrir, só que nenhuma das opções funciona, o PDF corrompe
como ficou seu servlet depois q adicionou essas linhas…
coloca ai pra nois
[code] protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(“text/html;charset=UTF-8”);
PrintWriter out = response.getWriter();
try {
Connection con = new ConexaoMySQL().getConnection();
HashMap parametros = new HashMap();
ServletContext sc = getServletContext();
String nomeArquivo = sc.getRealPath("/") + “teste.pdf”;
JasperPrint jp = JasperFillManager.fillReport(sc.getRealPath("/jasper/teste.jasper"), parametros, con);
JasperExportManager.exportReportToPdfFile(jp, nomeArquivo);
response.setContentType("application/force-download");
response.setHeader(“Content-Disposition”, “inline;filename=”
+ “teste”+ “.pdf”);
ServletOutputStream servletOutputStream = response.getOutputStream();
InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/jasper/teste.jasper");
JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream, parametros, con);
servletOutputStream.flush();
servletOutputStream.close();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet GeraPDF</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Relatório Gerado" + "</h1>");
out.println("</body>");
out.println("</html>");
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
}[/code]
Bem pra começar não vai ser mais possivel enviar uma resposta HTML pois um servlet só pode enviar uma unica resposta ao navegador sua servlet vai ficar mais ou menos assim
Connection con = null;
OutputStream out = null;
try {
con = new ConexaoMySQL().getConnection();
HashMap parametros = new HashMap();
ServletContext sc = getServletContext();
response.setContentType("application/force-download");
response.setHeader("Content-Disposition", "inline;filename="
+ "teste" + ".pdf");
out = response.getOutputStream();
JasperPrint print = JasperFillManager.fillReport(
sc.getRealPath("/jasper/teste.jasper"), parametros, con);
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
exporter.exportReport();
} finally {
if (out != null)
out.close();
if (con != null)
con.close();
}
Bom eu não testei mas por ai já dá para se ter uma ideia de como vai ficar e que não há mais como enviar a página html para o cliente
Receba seu relatório em um iFrame via javaScript. Isso resolve seu problema.
Exemplo:
function submitRelatorio(){
var URL = [A URL QUE CHAMA SEU SERVLET]
var iframe = document.createElement("iframe");
iframe.setAttribute("id","frameRelatorio");
iframe.setAttribute("name","frameRelatorio");
iframe.setAttribute("width","0");
iframe.setAttribute("height","0");
iframe.setAttribute("border","1");
iframe.setAttribute("src", URL);
document.forms[0].appendChild(iframe);
window.frames['frameRelatorio'].name="frameRelatorio";
}