En este Articulo veremos como crear reportes en Java utilizando algunas librerias como IcePDF(Visor PDF), Jasperreports(Crear Reportes) y diseñando una plantilla con ireport designer. Realizaremos un ejemplo utilzando imagenes, estas representaran fotos de empleados y estaran almacenadas en una base de datos, para realizar la conexion con la Base de Datos utilizaremos el conector de mysql para java. El reporte consistira de la imagen del empleado, nombre, tipo, ciudad y descripcion de el empleado. Veamos entonces como crear reportes en Java 😀 comencemos…
Requerimientos
- Netbeans IDE
- iReport Designer
- Librerias IcePdf
- Librerias JasperReports
- Libreria Mysql Connector para Java
- Imagenes del Ejemplo
Desarrollo
Para comenzar a ver como crear reportes en java mediante un ejemplo vamos primero a ver el procedimiento por encima para comprender lo que necesitamos y lo que vamos
a hacer.
- Escenario
Tenemos informacion almacenada en una tabla de una base de datos, es una tabla llamada personas donde se almacena informacion relacionada con cada persona y una foto.

- Problema
Queremos realizar una aplicacion capaz de leer la informacion de esa tabla, generar reportes en PDF y visualizarlos dentro de esta aplicacion.

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.
Udemy- Solucion
Primero que nada necesitamos crear un nuevo proyecto en Netbeans con la siguiente estructura:

El paquete proceso tiene las clases:
BaseDatos: Informacion relacionada con la manipulacion de la informacion de la base de datos.
Consulta: Interfaz Necesaria para crear los Reportes, contiene la informacion que se mostrara en los reportes.
Main: Clase Principal.
El paquete vista tiene las siguientes clases:
Ventana: Es una JFrame con un menu para generar reportes y un panel principal donde se generara la interfaz para visualizar el PDF llamado panel_reportes
- Librerias Necesarias
Para crear reportes en Java necesitaremos agregar a nuestro proyecto algunas librerias necesarias, estas librerias estan para descargar arriba en la seccion de
requerimientos. Necesitamos en concreto estas librerias para relizar 3 cosas en nuestra aplicacion:
Visor PDF: icepdf-core y icepdf-viewer
Crear Reportes: Todas las incluidas en el archivo comprimido jasper.rar
Conector Mysql con Java: mysql-connector-java-5.0.8-bin
- Declaraciones
//reportes
SwingController controlador;
//base de datos
BaseDatos bd;
En resumen el procedimiento para crear reportes en java es:
- 1.Preparar la Interfaz que visualiza el PDF
Aqui necesitaremos realizar 3 cosas, detener el Controlador Swing, destruir el controlador Swing y limpiar componentes de el panel, dibujar GUI en el panel.
public void detener() {
if (controlador != null) {
controlador.closeDocument();
}
}
public void destruir() {
if (controlador != null) {
controlador.dispose();
controlador = null;
}
panel_reportes.removeAll();
}
public void dibujarGIU(){
controlador=new SwingController();
SwingViewBuilder factory=new SwingViewBuilder(controlador);
controlador.getDocumentViewController().setAnnotationCallback(
new org.icepdf.ri.common.MyAnnotationCallback(
controlador.getDocumentViewController()));
MyAnnotationCallback myAnnotationCallback = new MyAnnotationCallback(
controlador.getDocumentViewController());
controlador.getDocumentViewController().setAnnotationCallback(myAnnotationCallback);
panel_reportes.setLayout(new BorderLayout());
JScrollPane scroll = new JScrollPane(factory.buildViewerPanel(),JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
panel_reportes.add(scroll, BorderLayout.CENTER);
}
- 2.Obtener Informacion de la base de datos y Generar el PDF.
LinkedList info;
info=bd.getInformacion();
try
{
JasperReport reporte=null;
reporte = (JasperReport) JRLoader.loadObject(new File("plantilla.jasper"));
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(info));
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("Documentos/temporal.pdf"));
exporter.exportReport();
}
catch(JRException e)
{
JOptionPane.showMessageDialog(null, e.getMessage(),"Error al generar PDF", JOptionPane.ERROR_MESSAGE);
Logger.getLogger(Ventana.class.getName()).log(Level.SEVERE, null, e);
}
Primeramente crearemos una lista de tipo Consulta, que sera la clase que usaremos para almacenar la informacion de la base de datos, esta clase luce asi:
public class Consulta {
private String idPersona;
private String Nombre;
private String tipo;
private String ciudad;
private String descripcion;
private Image foto;
public String getIdPersona() {
return idPersona;
}
public String getNombre() {
return Nombre;
}
public String getTipo() {
return tipo;
}
public String getCiudad() {
return ciudad;
}
public String getDescripcion() {
return descripcion;
}
public Image getFoto() {
return foto;
}
public void setIdPersona(String idPersona) {
this.idPersona = idPersona;
}
public void setNombre(String Nombre) {
this.Nombre = Nombre;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public void setCiudad(String ciudad) {
this.ciudad = ciudad;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public void setFoto(Image foto) {
this.foto = foto;
}
}
A esta lista le asignamos el resultado, que es una lista tambien, de el metodo getInformacion de la clase donde tenemos la informacion de la base de datos, este metodo luce asi:
public LinkedList getInformacion(){
LinkedList info = new LinkedList();
Consulta consulta;
try {
ResultSet rs = st.executeQuery("SELECT * FROM Personas");
while (rs.next())
{
consulta = new Consulta();
//agregamos la informacion a el objeto consulta
consulta.setIdPersona(rs.getObject("idPersona").toString());
consulta.setNombre(rs.getObject("nombre").toString());
consulta.setTipo(rs.getObject("tipo").toString());
consulta.setCiudad(rs.getObject("ciudad").toString());
consulta.setDescripcion(rs.getObject("descripcion").toString());
Blob blob = rs.getBlob("foto");
int blobLength=(int)blob.length();
byte[] blobasbytes = blob.getBytes(1, blobLength);
ImageIcon icon = new ImageIcon((byte[])blobasbytes);
consulta.setFoto(icon.getImage());
//agregamos nueva consulta a la informacion
info.add(consulta);
}
rs.close();
return info;
} catch (SQLException ex) {
Logger.getLogger(BaseDatos.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
Despues utilizando los metodos de las librerias de JasperReports creamos el reporte utilizando una plantilla llamada plantilla.jasper que creamos con ireports Designer, mas adelante explicaremos como crear esta plantilla correctamente, por ahora seguimos explicando el codigo,
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(info));
Llenamos el reporte utilizando la plantilla y la informacion en forma de colleccion de objetos de tipo Consulta que obtuvimos en el metodo anterior de la clase BaseDatos
Exportamos en la ruta Documentos/temporal.pdf
- 3.Abrir y Visualizar el PDF
File file=new File("Documentos/temporal.pdf");
final String url =file.toURI().toString();
URL documentURL = null;
try {
documentURL = new URL(url);
} catch (MalformedURLException e) {
}
if (documentURL != null) {
controlador.openDocument(documentURL);
}
Aqui Abrimos el archivo temporal que creamos anteriormente y le decimos al controlador que lo abra.
Finalmente actulizamos el panel para que se reflejen los cambios.
panel_reportes.updateUI();
- Crear la plantilla para el reporte en ireport Designer
En la linea
reporte = (JasperReport) JRLoader.loadObject(new File("plantilla.jasper"));
Utilizamos una plantilla con extension .jasper, este archivo se crear con el programa ireports Designer, una vez instalado creamos un nuevo reporte blank A4 y lo llamaremos como quieramos yo lo llame plantilla


Repetimos esto para todas las secciones excepto Title, Detail 1, Summary.
Despues Agregamos un texto estatico desde la paletta de herramientas y lo arrastramos a la seccion de Title

clase consulta, en las propiedades cambiamos el campo clase de String a Object

Despues en la propiedades agregamos $F{foto} en Image Expression, con el nombre que le pusiste al campo que creamos antes, donde ira la imagen, tambien cambiamos el valor de Scale Image a Fill Frame





Solo copiamos el archivo plantilla.jasper que se genero a la raiz de nuestro proyecto Java y ejecutamos 😉
