[RESOLVIDO]
Pessoal, consegui resolver. Vou postar aqui para caso alguém tenha a mesma dúvida.
No web service tenho o seguinte método:
@POST
@Consumes("application/json")
@Produces("application/pdf")
@Path("/faturamento")
public Response relatorioFaturamentoResumido(FiltrosFaturamento filtros) {
// ... código anterior
Map parametros = new HashMap();
List lista = new ArrayList();
File relatorio = RelatoriosHelper.gerarPdfRelatorioFaturamentoResumido(parametros, lista);
ResponseBuilder response = Response.ok(relatorio);
response.type("application/pdf");
response.header("Content-Disposition", "attachment; filename=relatorio.pdf");
return response.build();
}
Método gerarPdfRelatorioFaturamento
public static File gerarPdfRelatorioFaturamentoResumido(Map parametros, List dados) {
File fileJrxml = new File(ClassLoaders.getResource("caminho/Relatorio_FaturamentoResumido.jrxml").getFile());
// cria arquivo na pasta temporária do sistema operacional utilizado.
File file = File.createTempFile("relatorio", ".pdf");
OutputStream saida = new FileOutputStream(file);
GeradorDeRelatorios gerador = new GeradorDeRelatorios();
gerador.geraRelatorioPdf(fileJrxml.getPath(), parametros, dados, saida);
return file;
}
Método geraRelatorioPdf (padrão para gerar todos os relatórios do sistema)
public void geraRelatorioPdf(String jrxml, Map parametros, List<? extends Object> fields, OutputStream saida) throws JRException {
JasperReport jasper = JasperCompileManager.compileReport(jrxml);
JRBeanCollectionDataSource dados = new JRBeanCollectionDataSource(fields);
JasperPrint print = JasperFillManager.fillReport(jasper, parametros, dados);
JasperExportManager.exportReportToPdfStream(print, saida);
}
Os trechos acima correspondem ao back-end e o trecho abaixo é a chamada XmlHttpRequest no front-end para a recuperação do arquivo e download no browser do usuário.
Obs: no meu caso tenho alguns filtros, por isso estou enviando parametros no método xhr.send().
function gerarRelatorio() {
var xhr = new XMLHttpRequest();
xhr.open("POST", "../ws/relatorios/faturamento", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.responseType = 'blob';
xhr.send(getFiltros());
xhr.onload = function() {
if(this.status == 200) {
var blob = new Blob([this.response], {type: "application/pdf"});
var a = document.createElement("a");
a.style = "display: none";
document.body.appendChild(a);
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = "relatorio.pdf";
a.click();
window.URL.revokeObjectURL(url);
} else {
console.log("Erro");
}
}
}
É isso pessoal. Agora deu certinho o download dos meus relatórios.
Tive apenas um probleminha pra abri-los com o firefox, mas só fiz o download, abri com outro leitor de PDF e deu tudo certo.