Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Disponibilizar relatório para download

Olá amigos.

Gostaria de saber como eu disponibilizo um relatório em PDF para download em uma aplicação Web. Quero somente disponibilizar o download nada de pré-visualização.

Obs.: Estou usando Angularjs na front-end, Java na back-end e Ireport para gerar o relatório.

Abaixo a classe que gera o arquivo em PDF:

public class RelatorioPacienteService {

    public void gerarRelatorio(List<Paciente> pacientes){

        try {
            JasperReport report = JasperCompileManager.compileReport("C:/POO/Web/SCF/src/scf/relatorios/relatorioPacientes.jrxml");
            JasperPrint print = JasperFillManager.fillReport(report, null,new JRBeanCollectionDataSource(pacientes, false));
            JasperExportManager.exportReportToPdfFile(print, "C:/POO/Web/SCF/src/scf/relatorios/relatorioPacientes.pdf");
        } catch (JRException e) {
            e.printStackTrace();
        }

    }

}
6 respostas

Você vai precisar pegar o pdf e escrever no outputstream do response. Vai depender da tecnologia que vc estiver utilizando do lado do servidor.. Lembre só que não vai rolar ser via ajax... Você vai ter que ter um link mesmo..

Teria algum matéria que eu possa consultar?

Mesmo eu usando o AngularJS eu preciso criar uma servlet para disponibilizar o download do relatório?

Oi Maicon, se estiver usando Servlet direto, sim, vai ter que escrever. Segue um exemplo de código.

public class DownloadServlet extends HttpServlet {


    protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

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

         String fileName = "";
         String fileType = "";
         // Find this file id in database to get file name, and file type

         // You must tell the browser the file type you are going to send
         // for example application/pdf, text/plain, text/html, image/jpg
         response.setContentType(fileType);

         // Make sure to show the download dialog
         response.setHeader("Content-disposition","attachment; filename=yourcustomfilename.pdf");

         // Assume file name is retrieved from database
         // For example D:\\file\\test.pdf

         File my_file = new File(fileName);

         // This should send the file to browser
         OutputStream out = response.getOutputStream();

         FileInputStream in = new FileInputStream(my_file);
         byte[] buffer = new byte[4096];
         int length;
         while ((length = in.read(buffer)) > 0){
            out.write(buffer, 0, length);
         }
         in.close();
         out.flush();
    }
}

Saberia me informar uma maneira sem usar servlet?

Ou tem alguma maneira de usar angular junto com a servlet?

solução!

O link que passei mostra como fazer através de uma aplicação que usa spring... O angular não tem nenhuma relação com a tecnologia que vc vai usar no backend... O ponto é que vc vai precisar abrir uma nova aba para disparar o download, eu pelo menos não conheço outra forma.

Obrigado pela sua ajuda Alberto.

Usei a servlet que me foi informado nos comentários acima e o download do arquivo ocorreu certinho.