1
resposta

Gerar pdf com jsf

Olá

trabalho com jsf e primefaces e não consigo fazer com que seja gerado um pdf quando no botão deixo o ajax como true, o método é percorrido por inteiro mas no final não acontece nada, quanto coloco ajax=false, ai ele gera o pdf normal, todos os outros métodos como, salvar, alterar, excluir funcionam com ajax true, menos o imprimir, tem como resolver isso?

código botão imprimir:

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

    HashMap<String, Object> map = new HashMap<String, Object>();
    SimpleDateFormat formatar = new SimpleDateFormat("dd/MM/yyyy");

    String caminho = "/relatorios/";
    String subPasta = caminho + "certidao/";
    String relatorio = "";

    List<Certidao> certidoes = new ArrayList<Certidao>();
    certidoes.add(certidao);
    JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(certidoes);

   relatorio = subPasta + "Certidao.jasper";

    map.put("SUBREPORT_DIR", context.getExternalContext().getRealPath(subPasta) + File.separator);
    map.put("BRASAO_DIR", context.getExternalContext().getRealPath(caminho) + File.separator);
    String fileName = "attachment;filename=certidao.pdf";
    response.setHeader("Content-disposition", fileName);
    InputStream reportStream = context.getExternalContext().getResourceAsStream(relatorio);
    try {
        ServletOutputStream servletOutputStream = response.getOutputStream();
        if (reportStream == null
                || servletOutputStream == null
                || map == null
                || fonteDados == null) {
            return "Não foi possivel imprimir.";
        }
        JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, map, fonteDados);
        servletOutputStream.flush();
        servletOutputStream.close();
    } catch (JRException ex) {
        return ex.getMessage();
    } catch (IOException ex) {
        return ex.getMessage();
    } finally {
        context.responseComplete();
    }

    return SUCESSO;
1 resposta

Olá Jaoquendo,

Pelo código que você compartilhou, parece que você está tentando gerar um PDF usando o JSF e o PrimeFaces. No entanto, você mencionou que quando o ajax está definido como true, o PDF não é gerado, mas quando está definido como false, o PDF é gerado corretamente.

Uma possível solução para esse problema é separar a geração do PDF em um método separado e chamar esse método assincronamente usando o ajax. Dessa forma, você pode garantir que a geração do PDF seja concluída antes de retornar a resposta para o usuário.

Aqui está um exemplo de como você pode fazer isso:

  1. Crie um método separado para a geração do PDF:
public void gerarPDF() {
    // Seu código para a geração do PDF aqui
}
  1. Modifique o código do botão imprimir para chamar o método de geração do PDF:
public void imprimir() {
    // Seu código antes da geração do PDF aqui
    
    gerarPDF();
    
    // Seu código depois da geração do PDF aqui
}
  1. No seu botão imprimir, defina o atributo process do componente <p:commandButton> para o ID dos componentes que você deseja processar antes de chamar o método de impressão. Isso garante que os dados necessários para a geração do PDF sejam atualizados antes da chamada do método.
<p:commandButton value="Imprimir" actionListener="#{seuBean.imprimir}" process="componente1 componente2" ajax="true" />

Dessa forma, o método de geração do PDF será chamado assincronamente usando o ajax, garantindo que os dados estejam atualizados antes da geração do PDF.

Espero que isso ajude! Se você tiver mais alguma dúvida, é só me dizer. Bons estudos!