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.
 

sábado, 22 de septiembre de 2012

Personalización de Primefaces

Default font size of themes might be bigger than expected, to change the font-size of PrimeFaces components globally, use the .ui-widget style class. An example of smaller fonts;

primefaces
Fig 1. Librería de Primefaces
 
primefaces
Fig 2. Edición del archivo utilizando algún utilitario

primefaces




1. Edit the file theme.css
2. Find the code:
.ui-widget{font-family:Arial,sans-serif;font-size:1.1em;}
3. Change 1.1em for 90% !important like this:
.ui-widget{font-family:Arial,sans-serif;font-size: 90% !important;}
4. Save the file. Best regards.

miércoles, 19 de septiembre de 2012

Generación de Boletas y Facturas con Java

Generar impresiones de facturas y boletas con Java es un tema que a veces toma más tiempo de lo debido. Y esto se debe al carácter dinámico de estos documentos que tienen que variar su tamaño para ajustarse a la dimensión del recibo físico que se encuentra en función del número de items que hemos pedido. El proyecto que les muestro resuelve este problema con una serie de sencillos pasos que a continuación detallo:
  1. Generar una impresión solamente con la cabecera de nuestro recibo, de esa manera sabremos la altura exacta del documento sin importar la cantidad de productos o materiales que se ha pedido.
  2. Estimar la altura que ocupa una fila correspondiente a los datos de un producto solicitado ('10' en el caso de este proyecto).
  3. Instanciar nuestra clase encargada de generar el pdf con estos valores como parámetros en su constructor.
    Rectangle pagesize = new Rectangle(300f, 150f + (10f * factura.getProductos().size()));
    
En el proyecto que adjunto se puede apreciar a mayor detalle la aplicación de estos tres sencillos pasos. Espero les sirva para los proyectos que estén desarrollando y no se olviden de dejar sus comentarios y seguirnos a través de la página de facebook o twitter.

 
Saludos.