domingo, 23 de septiembre de 2012

Exportar un formulario de Primefaces a PDF

Exportar una tabla a PDF usando primefaces es una tarea que ya viene solucionada por las últimas versiones de Primefaces; sin embargo cuando se requiere exportar un formulario la figura pues no existe un control que lo haga de manera automática (hasta donde yo tenga conocimiento). Sin embargo, fiel al estilo de este blog, aquí les presento la solución con código fuente incluído. Lo primero que debemos hacer es crear en nuestro managed bean un método llamado imprimir en el cuál debemos especificar los atributos de nuestro bean que queremos mostrarlos en el documento pdf que vamos a generar. El código debe quedar algo como esto:
public void imprimir() {
    try {
        //Generamos el archivo PDF
        String directorioArchivos;
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        directorioArchivos = ctx.getRealPath("/") + "reports";
        String name = directorioArchivos + "/document-report.pdf";
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(name));
        document.open();
        document.add(new Paragraph("Visita http://rolandopalermo.blogspot.com"));
        document.add(new Paragraph("Nombre: " + getNombre()));
        document.add(new Paragraph("Tipo: " + getTipo()));
        document.add(new Paragraph("Precio neto: " + getPrecioNeto()));
        document.add(new Paragraph("Valor neto: " + getValorNeto()));
        document.add(new Paragraph("Síguenos en http://facebook.com/blog.rolandopalermo"));
        document.close();
        //----------------------------
        //Abrimos el archivo PDF
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        response.setContentType("application/pdf");
        response.setHeader("Content-disposition",
                "inline=filename=" + name);
        try {
            response.getOutputStream().write(Util.getBytesFromFile(new File(name)));  
            response.getOutputStream().flush();
            response.getOutputStream().close();
            context.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Un punto a tener en cuenta es que debemos desactivar el ajax de nuestro botón pues en caso contrario la funcionalidad no tendrá el comportamiento que esperamos.

En el siguiente enlace les dejo el proyecto para descargar y reutilizar, cualquier duda o sugerencia no duden en comentarla.
 

3 comentarios:

  1. Excelente post muy practico y me fue de gran ayuda
    muchas gracias

    ResponderEliminar
  2. Gracias , me ha servido de mucho.

    Saludos

    ResponderEliminar
  3. Que tal amigo como cargas el proyecto en un IDE ya que lo he intentado importar en Eclipse y Netbeans pero no me funciona y que servidor de aplicaciones utilizas, saludos!

    ResponderEliminar