Como baixar um arquivo PDF ao invés de salvar em diretório - Jasper Report

Olá comunidade, tudo bem ? Preciso de uma ajuda por favor

Eu estou aprendendo a utilizando o Jasper Report para gerar relatórios em uma aplicação, esse é meu código:

public String exportReport() throws FileNotFoundException, JRException {

File desktop = new File(System.getProperty("user.home"), "Desktop"); // desktop directory

List<Expense> expenses = er.findAll();

File file = ResourceUtils. getFile("classpath:jasper_reports/expense.jrxml");
JasperReport jasperReport = JasperCompileManager.compileReport(file.getAbsolutePath());
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(expenses);
Map<String, Object> parameters = new HashMap<>();
parameters.put("createdBy", "Tester");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,parameters, dataSource );

JasperExportManager.exportReportToPdfFile(jasperPrint, desktop +"\\despesas.pdf");

return "Report generated in path: " + desktop;

}

O código acima gera o meu relatório e salva no meu desktop, o que eu preciso é que o relatório ao invés de salvar no desktop, baixe como um novo arquivo ou então abra em uma nova guia.
Já tentei de diversas maneiras resolver esse meu problema, porem ainda não consegui nada…

Alguém tem alguma ideia ou sugestão ?

Obrigado por responder… Nunca tinha ouvido falar, dei uma pesquisa mas não encontrei nada relacionado ao jasper

Analisa esse código:

private static void provideFile(boolean forceDownload,
            String fileName, byte[] dataFile) throws IOException {

        HttpServletResponse response = (HttpServletResponse) getExternalContext().getResponse();

        ServletOutputStream servletOutputStream = response.getOutputStream();

        String contentDisposition = (forceDownload ? "attachment;filename=\""
                + fileName + "\"" : "filename=\"" + fileName + "\"");

        String contentType = getMimeType(dataFile);
        response.setContentType(contentType);
        response.setHeader("Content-Disposition", contentDisposition);
        response.setContentLength(dataFile.length);

        servletOutputStream.write(dataFile, 0, dataFile.length);
        servletOutputStream.flush();
        servletOutputStream.close();
        FacesContext.getCurrentInstance().renderResponse();
        FacesContext.getCurrentInstance().responseComplete();
    }

Estou tentando utilizar esse código que você comentou, mas quais seriam os métodos getExternalContext() e getMimeType() ?

Resolvi o problema, era no front end… Utilizei isso no meu get:

			.then((response) => {
                   			const url = window.URL.createObjectURL(new Blob([response.data]));
                   			const link = document.createElement('a');
                   			link.href = url;
                   			link.setAttribute('download','file.pdf');
                   			document.body.appendChild(link);
                   			link.click();
                 			})
1 curtida