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

[Projeto] Html para PDF em Java

Estou criando um projeto em Java usando o Spring Boot. Nesse projeto, eu quero transformar uma tabela do front em PDF, mas nao sei como fazer isso. alguem poderia me ajudar??

3 respostas
solução!

Oi Robert,

Se for uma app web tradicional, com frontend feito com Thymeleaf, você pode gerar o PDF da página html utilizando o próprio Thymeleaf: https://www.baeldung.com/thymeleaf-generate-pdf

Outra maneira é utilizando a biblioteca Flying Saucer: https://github.com/flyingsaucerproject/flyingsaucer https://flyingsaucerproject.github.io/flyingsaucer/r8/guide/users-guide-R8.html

Ah obrigado, tentarei aqui. Sim, o projeto é todo feito usando o thymelef, e boostrap no front

Olá, conseguir através de sua dica criar o pdf através do html

    //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();
    }

Entretanto, não consigo fazer com que o pdf criado saia diretamente no navegador do usá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.

    //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;
    }