Estou construindo um webapp em java usando o spring boot, e não estou conseguindo fazer com que o pdf criado (pela a minha aplicação) saia diretamente no navegador do usuário. A solução que encontrei no momento foi o de deixar armazenado dentro da pasta do codigo o pdf criado, para que aí sim, eu possa o enviar para que seja baixado pelo o navegador do usuário. E isso não me parece certo
//Baixar pelo o navegador o pdf Criado
@GetMapping("/{id}/criarPDF")
public ModelAndView criarPdf(@PathVariable Long id, HttpServletResponse http) {
//Redereciona para a pagina principal
ModelAndView mv = new ModelAndView("redirect:/" + id);
//Seleciona as notas fiscais
List<NotaFiscal> lstNota = nfRepository.findByNotasFiscaisPeriodo(id);
try {
//Função para criar o arquivo em PDF
createPDF(lstNota);
//Selecionando o arquivo criado
File file = new File("resultado.pdf");
//------------ essa parte eu não entendi muito bem como funciona
http.setContentType("application/octet-stream");
String headerKey = "Content-Disposition";
String headerValue = "attachment; filename=" + file.getName();
http.setHeader(headerKey, headerValue);
ServletOutputStream out = http.getOutputStream();
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
//-------------------------------
//Passando os bytes do arquivo, caso nao faça isso o pdf baixado pelo o navegador será vazio
byte[] buffer = new byte[8192];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
inputStream.close();
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mv;
}
//Metodo que cria Pdf usando o HTML
public void createPDF(List<NotaFiscal> list) throws DocumentException, IOException {
//Obj que permite inserir variaveis no html
Context context = new Context();
//Definindo a variavel do html
context.setVariable("notas", list);
//Inserindo no html as variaveis e passando para String o html criado
String processHtml = templateEngine.process("modelo/teste", context);
//Definindo o local de saída do arquivo
OutputStream out = new FileOutputStream("resultado.pdf");
//Obj. que permitira transformar a String do Html em pdf
ITextRenderer renderer = new ITextRenderer();
//Passando a string do Html
renderer.setDocumentFromString(processHtml);
renderer.layout();
//Criando o pdf do html passado
renderer.createPDF(out, false);
renderer.finishPDF();
out.close();
}