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.

jueves, 20 de septiembre de 2012

Generación de números aleatorios con circuitos TTL

Generar números aleatorios con algún lenguaje de programación es una tarea sencilla. Existen muchos métodos y sus aplicaciones son muy diversas, sin embargo cuando no se cuenta con un procesador potente ni mucho menos un lenguaje de alto nivel - ¿qué tipo de solución podríamos plantear? - El generar "números al azar" utilizando un determinado conjunto de pasos ciertamente no es concordante pues los números no son realmente aleatorios sino seudoaleatorios. Cuando no contamos con un lenguaje de alto nivel, generar este tipo de números sigue la misma lógica pues no es necesario generar verdaderos números aleatorios sino iterar un grupo de números (contador reversible) a una velocidad variable de tal manera que cuando se requiera uno, éste no será siempre el mismo. El circuito mostrado en la Figura 1 muestra el diagrama esquemático de un generador de números al azar cuya lógica podría ser fácilmente implementada en un microcontrolador de gama baja. La idea es generar un grupo diferente de números cada vez que una persona presiona un pulsador.

generador de números aleatorios
Figura 1. Generador de números aleatorios
El circuito podría ser utilizado en máquinas de tragamonedas por ejemplo ya que, por su sencillez, es fácilmente acoplable.

Aquí les muestro un video de su funcionamiento:


Y también les dejo el link de descarga del esquema del circuito.

 

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.