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

Como encaminhar diretamente para o navegador o arquivo criado?

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();
}
2 respostas
solução!

Bom dia Robert.

Ao invés de criar um arquivo, você pode guardar em memória temporariamente. Acredito que este exemplo possa ajudar: https://zetcode.com/springboot/servepdf/.

Mais info sobre o uso sem persistir o arquivo localmente: https://stackoverflow.com/questions/15759446/creating-a-pdf-using-itext-without-saving-it-to-a-temp-file

Espero ter ajudado

Opa me desculpa pela a demora do retorno mas ajudou sim