Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / iReport / Java / Impresión de reportes con JasperReport + YAPA

Impresión de reportes con JasperReport + YAPA

Autor jc mouse sábado, noviembre 24, 2012

En un post anterior [Guardar reporte PDF directamente con Jasperreports] vimos una manera de imprimir reportes directamente en PDF sin mostrar la ventana de visualización de Jasper, en esta ocasión veremos dos manera de imprimir directamente en la impresora del sistema.

Utilizaremos la misma base de datos y el mismo archivo *.jasper del post anterior [VER], te recomiendo que te pases primero por ese post :).

Manos a la obra.

1.- Impresión por defecto

impresion-nado

Este es el método mas cortito, se hace uso de JasperPrintManager.printReport(jasperPrint, true); donde jasperPrint es el reporte a imprimir y el parámetro boolean, especifica si se muestra o no la ventana de dialogo de impresión. Por defecto se hace uso de la impresora predeterminada del sistema así como la configuración de página.

01   public void Imprimir(){
02         JasperReport jasperReport;
03         JasperPrint jasperPrint;
04         try
05         {
06           //se carga el reporte
07           URL  in=this.getClass().getResource( "reporte.jasper" );
08           jasperReport=(JasperReport)JRLoader.loadObject(in);
09           //se procesa el archivo jasper
10           jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), this.getConexion() );
11           //impresion de reporte
12           // TRUE: muestra la ventana de dialogo "preferencias de impresion"
13           JasperPrintManager.printReport(jasperPrint, true);          
14         }
15         catch (JRException ex)
16         {
17           System.err.println( "Error iReport: " + ex.getMessage() );
18         }
19   }

2.- Impresión con PrintService y JRPrintServiceExporter

choose print

Con este método podemos trabajar un poco nuestra función de impresión, por ejemplo podríamos definir una impresora diferente para cada tipo de reporte o permitir al usuario elegir con que impresora desea realizar la impresión. Inclusive se puede definir ya un formato para el reporte, tamaño de página por ejemplo.

01     public void Imprimir2(){                    
02         /* Array para almacenar las impresoras del sistema */
03         PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, null);
04         if( printService.length>0 )//si existen impresoras
05         {
06            //se elige la impresora
07            PrintService impresora = (PrintService) JOptionPane.showInputDialog(null, "Eliga impresora:",
08                     "Imprimir Reporte", JOptionPane.QUESTION_MESSAGE, null, printService, printService[0]);
09             if( impresora != null ) //Si se selecciono una impresora
10             {
11                 try {
12                    //esto para el JasperReport
13                    JasperReport jasperReport;
14                    JasperPrint jasperPrint;
15                    //se carga el reporte
16                    URL in = this.getClass().getResource("reporte.jasper");
17                    jasperReport = (JasperReport) JRLoader.loadObject(in);
18                    //se procesa el archivo jasper
19                    jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), this.getConexion());
20                    //se manda a la impresora
21                    JRPrintServiceExporter jrprintServiceExporter = new JRPrintServiceExporter();
22                    jrprintServiceExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint );
23                    jrprintServiceExporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE, impresora );
24                    jrprintServiceExporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.TRUE);
25                    jrprintServiceExporter.exportReport();
26                 } catch (JRException ex) {
27                    System.err.println("Error JRException: " + ex.getMessage());
28                 }
29             }
30        }
31   }

Cada uno de estos métodos tiene sus pro y sus contra, el primer método es sencillo y rápido pero tiene pocas opciones de personalización, el segundo al contrario permite realizar muchas más configuración desde código, pero es lento, dependiendo del contenido y cantidad de páginas que tenga el reporte, puede tardar desde segundos a minutos.

YAPA

JasperReport no solo nos permite imprimir reportes a PDF, también existen otros formatos permitidos, por ejemplo guardar el reporte en una imagen.

Primero se hace la captura del reporte en memoria (BufferedImage), después se guarda en disco con ImageIO.write, indicando la ruta y nombre del archivo, este tipo de impresión solo esta disponible por 1 página a la vez.

01 public void ImprimirImagen(){
02         JasperReport jasperReport;
03         JasperPrint jasperPrint;
04         try
05         {
06           //se carga el reporte
07           URL  in=this.getClass().getResource( "reporte.jasper" );
08           jasperReport=(JasperReport)JRLoader.loadObject(in);
09           //se procesa el archivo jasper
10           jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), this.getConexion() );
11           //impresion de reporte en imagen
12           // parametros: jasperPrint , Pagina , Zoom
13           BufferedImage bufferedImage = (BufferedImage) JasperPrintManager.printPageToImage(jasperPrint, 0, 2f);
14           //se escribe imagen en disco en formato JPG y en la direccion indicada en FILE
15           ImageIO.write(bufferedImage, "jpg", new File("e:/temporal/reportecanchero.jpg") );
16           System.out.println("Reporte creado en formato JPG");
17         }
18         catch (IOException ex) {
19           System.err.println( "Error IOException: " + ex.getMessage() );
20         }
21         catch (JRException ex)
22         {
23           System.err.println( "Error iReport: " + ex.getMessage() );
24         }
25     }

o.O eso es todo, bájate el ejemplo completo en este «enlace canchero :)» , esta en netbeans 6.9 y hace uso de JasperReport en su versión 3.7.2

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Node.js: Instalación, configuración y Hola Mundo

Node.js: Instalación, configuración y Hola Mundo

No se puede negar la popularidad que ganaron las aplicaciones de JavaScript en los últimos años, y las bibliotecas dispo...

Primeros pasos con JavaFX

Primeros pasos con JavaFX

¿Qué es javaFX? JavaFX es una familia de productos y tecnologías de Sun Microsystems, adquirida por Oracle Corporation,...

Cifrado francmasón PigPen

Cifrado francmasón PigPen

El cifrado francmasón es un cifrado por sustitución simple que cambia las letras por símbolos. Sin embargo, el uso de sí...

4 IDEs online para java y mucho más

4 IDEs online para java y mucho más

A continuación te muestro 4 herramientas online para programadores en lenguaje Java y otros lenguajes de programación co...

Crear componentes en tiempo de ejecución con Netbeans

Crear componentes en tiempo de ejecución con Netbeans

🙂 Una de las preguntas más buscadas por programadores java es la de crear componentes swing en tiempo de ejecución, eso...

Cargar fuente TTF

Cargar fuente TTF

Necesitamos: Android Studio 2 tipos de fuente TTF Agregar Archivo de fuente al proyecto Paso 1: Crear carpeta assets Cli...

18 comentarios en “Impresión de reportes con JasperReport + YAPA”

  1. Darkwarrior dice:

    Hola jc mouse espero me puedas ayudar, guiandome de el proyecto de factura estoy desarrollando un punto de venta, veo que el metodo para mostrar los datos en la tabla de clientes y productos los llamas de una clase control el cual es el encargado de realizar la consulta para los datos, bueno hasta ahi todo perfecto, pero por la forma que haces la conexion y la consulta como que me pierdo… pues yo hacia todo dentro del mismo form lo que era la conexion las consultas y el cargar los datos a la tabla vi la forma en que tu lo haces y me parecio mas limpio y ordenado solo que quize implementar lo que es el filtrado de datos es decir que cuando escriba en un campo de texto me filtre y muestre los datos que contengan ese texto por ejemplo Ma y que en la tabla se muestre no se Maria, Manule etc. Bueno pero por la forma en que tu haces todo eso al menos no encuentro la forma de adaptar mi codigo a tu programa, antes hacia esto:

    updateTabla(«»);

    void updateTable(String valor){
    String sql =»SELECT * FROM clientes where CONCAT(ID,’ ‘,nombre) LIKE ‘%»+valor+»%'»;

    y me filtraba los datos por ID o nombre, pero ahora no se como hacerle de acuerdo a la forma en que tu realizas todo, ayudame porfa igual pienso que no ah de ser cosa de otro mundo pero estoy perdido en eso, saludos.

    se me habia ocurrido algo asi pero no doy como implementarlo:

    public Object[][] getClientes(String valor){
    String[] columnas={«ID»,»nombre»,»direccion»,»persona_telefono»};
    Object[][] data = mySql.GetTabla(columnas, «clientes», «select * from clientes where CONCAT(ID,’ ‘,nombre) LIKE ‘%»+valor+»%’;»);
    return data;
    }

    1. Mouse dice:

      bueno si te entiendo :/, tienes problemas con la conexión, osea cuando tu utilizabas una sola clase la conexión a la base de datos estaba en esa misma clase, pero de la forma en que yo la hago, no lo esta, entonces para realizar la consulta SQL, solo necesitas de la conexion la cual esta en una clase, creas un objeto como lo harias en cualquier otra clase y llamas al metodo get_conexion, o a la variable conection 🙂

  2. Darkwarrior dice:

    otra consulta ya que en este articulo se habla de impresion de reportes…. en el metodo para guardar el reporte en formato pdf ¿como hacerle para que a la hora de guardarlo no sustituya un reporte guardado con anterioridad? por ejemplo guardarlo por fecha y hora? disculpa si es mucho pedir, apenas estoy empezando en el mundo de java espero no molestar pero pues igual algunas cosas no las se, saludos =)

    1. Mouse dice:

      bueno, eso es mas sencillo, puedes guardar los reportes por fecha, por ejemplo reporte20121125.pdf => [nombre reporte][año][mes][dia][extension], de esa forma los reportes guardados por fecha no sobre escribirán reportes anteriores y ademas te sirve como un método de control 🙂

  3. diegodesdecolombia dice:

    Excelente… Muchas Gracias por dedicar tiempo en compartir lo que sabes.
    Sigue así.

  4. buen día me gustaría saber cómo hago las animaciones de los comments… gracias por compartir todo

  5. Hans dice:

    Hey chicos de JC Mouse, gracias x todos sus aportes, soy seguidor de sus proyectos, los sigo desde Nicaragua…
    Saluds…

  6. Fred dice:

    muy buen tuto esto podria usarse para la impresion de tickets? busque en tu blog sobre impresion de tickets pero no encontre mas que la impresion de reportes, estoy planteando hacerlo de esta forma, ojala pudieras hacer un tuto sobre la impresion de tickets y el corte de tickets asi como el abrir cajon de dinero, gracias jc mouse por los tutoriales que compartes.

    1. Mouse dice:

      claro que si se puede, solo debes configurar el tamaño del papel.

  7. Freed dice:

    hola amigo otra consulta con respecto a los tickets me podrias ayudar en como realizar lo que es el seguimiento de tickets impresos es decir utlizar numeros correlativos pues me indican que tiene que imprimirse de esta forma 0001 lo que estaba pensando es crear un campo con autoincremento y de ahi tomar el numero y en otro campo guardarlo añadiendole los 000 o igual por un ciclo solo que no quiere funcionar mi cabeza ggg como le aria para consultar en la base de datos si el ticket 0001 ya existe pues que imprima 0002 y asi con forme se vayan haciendo los tickets? no tendras algun ejemplo por hay aunque ya le di vuelta a todo tu blog xD. por cierto te eh mandado mensajes por facebook pero no contestas xD saludos y como siempre gracias por tu grandiosa y valiosa ayuda. ahh ultima cosa sabes donde puedo informarme sobre las facturas electronicas??? quiero implementar eso en mi programa solo que no encuentro buena informacion.

    1. Mouse dice:

      tu idea es correcta, utilizas un incrementable en la base de datos (1,2,3,4,5….) y en tu app lo completas con ceros, 0001 te dice que solo puedes llegar al 9999, ahora para hacer la búsqueda en la base de datos de «0037» que no es mas que el numero 37, debes convertir el string «0037» a un entero antes de pasar a la consulta. eso es todo.

      perdón por no responder rápido pero es que aveces se acumulan los mensajes, los leo pero a veces no puedo responder en ese momento y se me olvidan a veces 🙂 la memoria es frágil.

  8. Herme dice:

    muchas gracias JC-mouse, realmente me ayudan los ejemplos publicados. Mil gracias por compartir lo que sabes, que dios te pague!!!

  9. Gilberto dice:

    Buenos dias pocas veces comento algo a alguien pero la verdad vale la pena hacerlo hoy.
    Creeme que me ha servido de mucho tu manual, le he hecho algunas modificaciones al codigo «bastantes», pero basicamente sin la ayuda de tu manual aun estuviera batallando.Gracias.

    Saludos

  10. Eduardo dice:

    Hola muy bueno el tuto.
    Yo para realizar el reporte utilizo la aplicacion iReport. Mi consulta es la siguiente:
    Tengo el reporte ya generado en PDF con formato de pagina Legal (oficio) pero al abrir el pdf me toma por defecto la hoja A4. Hay algun parametro que pueda setear para que tome el formato original que es Legal.
    gracias y saludos

    1. Mouse dice:

      cuando imprimes los reportes desde java especificas entre muchos parámetros el tamaño de la hoja, si emprimes a PDF se creara con ese tamaño de papel

  11. Packo dice:

    Muchas gracias amigo, el código me sirvió de maravilla

  12. Jesus Sanchez dice:

    Por Favor como puedo enviar no solo una sino dos paginas a imprimir directamente con el primer codigo que coloco

    public void Imprimir(){
    02 JasperReport jasperReport;
    03 JasperPrint jasperPrint;
    04 try
    05 {
    06 //se carga el reporte
    07 URL in=this.getClass().getResource( «reporte.jasper» );
    08 jasperReport=(JasperReport)JRLoader.loadObject(in);
    09 //se procesa el archivo jasper
    10 jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), this.getConexion() );
    11 //impresion de reporte
    12 // TRUE: muestra la ventana de dialogo «preferencias de impresion»
    13 JasperPrintManager.printReport(jasperPrint, true);
    14 }
    15 catch (JRException ex)
    16 {
    17 System.err.println( «Error iReport: » + ex.getMessage() );
    18 }
    19 }

    me funciona bien pero quiero enviar dos paginas directamente a la impresora sin entrar a modificar propiedades de la impresora

    Muchas Gracias

  13. Richard dice:

    Buenas amigos … me ha ayudado mucho esto. . Ahora me imprime perfectamente. Pero me sale mal ya que es en una hoja de doble filo para nota de ventas. . Hay alguna manera de definir el tipo de hoja en el ireport de java. . SALUDOS

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...

Herramientas

Generador de Enlaces a Whatsapp