Como hacer un reporte pdf desde Java con iText 5.5.6. Ejemplo iText.
iText pdf es una librería muy potente y fácil de usar para generar reportes desde Java , si lo que necesitas es hacer un reporte rápido, sencillo y sin muchas complicaciones esta es la librería para ti, solo la descargamos y la agregamos al proyecto, hay que recordar que la construcción del reporte pdf va ser enteramente en el código fuente Java a diferencia de Jasper Reports que utiliza archivos externos y después los invocamos desde el código. En este tutorial de iText vamos a generar un reporte pdf que tendrá algunas párrafos, listas, tablas y celdas para mostrar un poco las funcionalidades que podemos conseguir con la misma.
Vamos hacer una breve reseña de una cámara y sus características, este es el resultado que queremos conseguir:
Vamos hacer una breve reseña de una cámara y sus características, este es el resultado que queremos conseguir:
iTextDatoJava
, creamos un paquete llamado itextDJ
y dentro de ese paquete creamos la clase que generará el reporte pdf llamada DJiTextEjemplo
, ahora descomprimimos el archivo itext-***.zip que descargamos anteriormente y vamos a importar la librería itextpdf-***.jarDocument
de tipo com.itextpdf.text.Document con la cantidad de espacio entre sus márgenes y el tamaño del mismo, creamos el FileOutputStream
con su nombre, obtenemos la instancia PDFWriter
con el documento y el archivo antes creado y abrimos el documento para comenzar a construirlo.
// Creacion del documento con los margenes Document document = new Document(PageSize.A4, 35, 30, 50, 50); // El archivo pdf que vamos a generar FileOutputStream fileOutputStream = new FileOutputStream( "reportePDFDatoJava.pdf"); // Obtener la instancia del PdfWriter PdfWriter.getInstance(document, fileOutputStream); // Abrir el documento document.open();Esto es fundamental para la creación del reporte pdf con iText, el reporte que queremos generar posee varias imágenes y distintos tipos de fuentes, este es el código para lograr hacer eso:
Image image = null; // Obtenemos el logo de datojava image = Image.getInstance("fotoDJ.png"); image.scaleAbsolute(80f, 60f); // Crear las fuentes para el contenido y los titulos Font fontContenido = FontFactory.getFont( FontFactory.TIMES_ROMAN.toString(), 11, Font.NORMAL, BaseColor.DARK_GRAY); Font fontTitulos = FontFactory.getFont( FontFactory.TIMES_BOLDITALIC, 11, Font.UNDERLINE, BaseColor.RED);Ahí cargamos el logo de DatoJava que es una imagen que está en la carpeta del proyecto y creamos las fuentes, para añadir la imagen al documento vamos a crear una
PdfPTable
y una PdfPCell
a la cual vamos añadirle la imagen, a esta celda hay que establecerle unas cuantas propiedades, alinearla a la derecha, sin borde, etc... Añadirla a la tabla y después añadir la tabla al documento.
// Creacion de una tabla PdfPTable table = new PdfPTable(1); // Agregar la imagen anterior a una celda de la tabla PdfPCell cell = new PdfPCell(image); // Propiedades de la celda cell.setColspan(5); cell.setBorderColor(BaseColor.WHITE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); // Agregar la celda a la tabla table.addCell(cell); // Agregar la tabla al documento document.add(table);Ese código es solo para añadir el logo, ahora vamos añadir la otra imagen y todo el contenido textual del reporte.
// Creacion del parrafo Paragraph paragraph = new Paragraph(); // Agregar un titulo con su respectiva fuente paragraph.add(new Phrase("Características:", fontTitulos)); // Agregar saltos de linea paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); // Agregar contenido con su respectiva fuente paragraph .add(new Phrase( "El sensor de la X-E1 presenta el mismo excelente rendimiento que el X-Trans CMOS " + "de 16 megapíxeles del modelo superior de la serie X, la X-Pro1. Gracias la matriz " + "de filtro de color con disposición aleatoria de los píxeles, desarrollada originalmente" + " por Fujifilm, el sensor X-Trans CMOS elimina la necesidad del filtro óptico de paso bajo" + " que se utiliza en los sistemas convencionales para inhibir el muaré a expensas de la" + " resolución. Esta matriz innovadora permite al sensor X-Trans CMOS captar la luz sin filtrar" + " del objetivo y obtener una resolución sin precedentes. La exclusiva disposición aleatoria de" + " la matriz de filtro de color resulta asimismo muy eficaz para mejorar la separación de ruido" + " en la fotografía de alta sensibilidad. Otra ventaja del gran sensor APS-C es la capacidad" + " para crear un hermoso efecto “bokeh”, el estético efecto desenfocado que se crea al disparar" + " con poca profundidad de campo.", fontContenido)); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase("Otras Caracaterísticas:", fontTitulos)); // Agregar el parrafo al documento document.add(paragraph); // La lista final List listaFinal = new List(List.UNORDERED); ListItem listItem = new ListItem(); List list = new List(); // Crear sangria en la lista list.setListSymbol(new Chunk(" ")); ListItem itemNuevo = new ListItem(" "); // ZapfDingbatsListm, lista con simbolos List listSymbol = new ZapfDingbatsList(51); // Agregar contenido a la lista listSymbol .add(new ListItem( "Sensor CMOS X-Trans – Consigue una calidad de imagen superior", fontContenido)); listSymbol .add(new ListItem( "Visor electrónico OLED de 2,36 pulgadas de alta resolución y luminosidad", fontContenido)); listSymbol.add(new ListItem("Diseño y accesorios", fontContenido)); listSymbol.add(new ListItem("Rápida respuesta", fontContenido)); itemNuevo.add(listSymbol); list.add(itemNuevo); listItem.add(list); // Agregar todo a la lista final listaFinal.add(listItem); // Agregar la lista document.add(listaFinal); paragraph = new Paragraph(); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); document.add(paragraph);Repasando el código anterior, en la línea 45 hay algo interesante, ahí estamos utilizando una lista de tipo com.itextpdf.text.ZapfDingbatsList la cual posee un constructor que recibe un
int
y así podemos elegir entre distintos símbolos que la lista nos proporciona, esta es la lista de símbolos que posee actualmente ZapfDingbatsList. Ahora solo falta agregar las ultimas imágenes al documento y terminamos el tutorial de iText.
// Crear tabla nueva con dos posiciones table = new PdfPTable(2); float[] longitudes = { 5.0f, 5.0f }; // Establecer posiciones de celdas table.setWidths(longitudes); cell = new PdfPCell(); // Cargar imagenes del producto y agregarlas image = Image.getInstance("fujifilmex1-2.png"); image.scaleAbsolute(40f, 20f); table.getDefaultCell().setBorderColor(BaseColor.WHITE); table.addCell(image); image = Image.getInstance("fujifilmex1-3.png"); image.scaleAbsolute(40f, 20f); table.addCell(image); // Agregar la tabla al documento document.add(table); // Cerrar el documento document.close(); // Abrir el archivo File file = new File("reportePDFDatoJava.pdf"); Desktop.getDesktop().open(file);Para evitar excepciones con iText debemos cerrar el documento al finalizar la construcción del mismo, y si el archivo PDF que estamos intentando abrir ya se encuentra abierto también saltara una excepción. Como este ejemplo funciona para una aplicación de escritorio utilizamos la clase
Desktop
para abrir el archivo que por defecto en este momento se está generando dentro de la carpeta del proyecto en la raíz, desde ese mismo path obtenemos las imágenes. Este es el código de la clase DJiTextEjemplo
completo:
Mostrar el codigo.
Es fácil de usar, espero que este ejemplo de iText te haya servido de algo, aquí te dejo el proyecto para que lo descargues, ahí mismo tienes las imágenes, si tratas de compilar la clase sin las imágenes tendrás una excepción así que te cuidado con eso, no olvides compartir la entrada y si tienes alguna duda o sugerencia puedes comentarlo. Suerte my friend.
Ocultar el codigo.
package itextDJ; import java.awt.Desktop; import java.io.File; import java.io.FileOutputStream; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.FontFactory; import com.itextpdf.text.Image; import com.itextpdf.text.List; import com.itextpdf.text.ListItem; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.ZapfDingbatsList; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; /** * * @author http://datojava.blogspot.com/ * */ public class DJiTextEjemplo { public static void main(String[] args) { // Creacion del documento con los margenes Document document = new Document(PageSize.A4, 35, 30, 50, 50); try { // El archivo pdf que vamos a generar FileOutputStream fileOutputStream = new FileOutputStream( "reportePDFDatoJava.pdf"); // Obtener la instancia del PdfWriter PdfWriter.getInstance(document, fileOutputStream); // Abrir el documento document.open(); Image image = null; // Obtenemos el logo de datojava image = Image.getInstance("fotoDJ.png"); image.scaleAbsolute(80f, 60f); // Crear las fuentes para el contenido y los titulos Font fontContenido = FontFactory.getFont( FontFactory.TIMES_ROMAN.toString(), 11, Font.NORMAL, BaseColor.DARK_GRAY); Font fontTitulos = FontFactory.getFont( FontFactory.TIMES_BOLDITALIC, 11, Font.UNDERLINE, BaseColor.RED); // Creacion de una tabla PdfPTable table = new PdfPTable(1); // Agregar la imagen anterior a una celda de la tabla PdfPCell cell = new PdfPCell(image); // Propiedades de la celda cell.setColspan(5); cell.setBorderColor(BaseColor.WHITE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); // Agregar la celda a la tabla table.addCell(cell); // Agregar la tabla al documento document.add(table); // Cargar otra imagen image = Image.getInstance("fujifilmex1-1.png"); image.scaleAbsolute(180f, 140f); // Agregar la imagen document.add(image); // Creacion del parrafo Paragraph paragraph = new Paragraph(); // Agregar un titulo con su respectiva fuente paragraph.add(new Phrase("Características:", fontTitulos)); // Agregar saltos de linea paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); // Agregar contenido con su respectiva fuente paragraph .add(new Phrase( "El sensor de la X-E1 presenta el mismo excelente rendimiento que el X-Trans CMOS " + "de 16 megapíxeles del modelo superior de la serie X, la X-Pro1. Gracias la matriz " + "de filtro de color con disposición aleatoria de los píxeles, desarrollada originalmente" + " por Fujifilm, el sensor X-Trans CMOS elimina la necesidad del filtro óptico de paso bajo" + " que se utiliza en los sistemas convencionales para inhibir el muaré a expensas de la" + " resolución. Esta matriz innovadora permite al sensor X-Trans CMOS captar la luz sin filtrar" + " del objetivo y obtener una resolución sin precedentes. La exclusiva disposición aleatoria de" + " la matriz de filtro de color resulta asimismo muy eficaz para mejorar la separación de ruido" + " en la fotografía de alta sensibilidad. Otra ventaja del gran sensor APS-C es la capacidad" + " para crear un hermoso efecto “bokeh”, el estético efecto desenfocado que se crea al disparar" + " con poca profundidad de campo.", fontContenido)); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase("Otras Caracaterísticas:", fontTitulos)); // Agregar el parrafo al documento document.add(paragraph); // La lista final List listaFinal = new List(List.UNORDERED); ListItem listItem = new ListItem(); List list = new List(); // Crear sangria en la lista list.setListSymbol(new Chunk(" ")); ListItem itemNuevo = new ListItem(" "); // ZapfDingbatsListm, lista con simbolos List listSymbol = new ZapfDingbatsList(51); // Agregar contenido a la lista listSymbol .add(new ListItem( "Sensor CMOS X-Trans – Consigue una calidad de imagen superior", fontContenido)); listSymbol .add(new ListItem( "Visor electrónico OLED de 2,36 pulgadas de alta resolución y luminosidad", fontContenido)); listSymbol.add(new ListItem("Diseño y accesorios", fontContenido)); listSymbol.add(new ListItem("Rápida respuesta", fontContenido)); itemNuevo.add(listSymbol); list.add(itemNuevo); listItem.add(list); // Agregar todo a la lista final listaFinal.add(listItem); // Agregar la lista document.add(listaFinal); paragraph = new Paragraph(); paragraph.add(new Phrase(Chunk.NEWLINE)); paragraph.add(new Phrase(Chunk.NEWLINE)); document.add(paragraph); // Crear tabla nueva con dos posiciones table = new PdfPTable(2); float[] longitudes = { 5.0f, 5.0f }; // Establecer posiciones de celdas table.setWidths(longitudes); cell = new PdfPCell(); // Cargar imagenes del producto y agregarlas image = Image.getInstance("fujifilmex1-2.png"); image.scaleAbsolute(40f, 20f); table.getDefaultCell().setBorderColor(BaseColor.WHITE); table.addCell(image); image = Image.getInstance("fujifilmex1-3.png"); image.scaleAbsolute(40f, 20f); table.addCell(image); // Agregar la tabla al documento document.add(table); // Cerrar el documento document.close(); // Abrir el archivo File file = new File("reportePDFDatoJava.pdf"); Desktop.getDesktop().open(file); } catch (Exception ex) { ex.printStackTrace(); } } }
buenos dias te queria molestar estoy haciendo un proyecto en matlab y necesito hacer un reporte en un pdf me dijeron que se puede usar una libreria de java para generarlo no se si puedo usar esto que has utilizado y no se si me puedes guiar para hacerlo si es posible
ResponderEliminarHola Ernesto, esta librería funciona perfectamente para crear desde 0 todo el reporte, también puedes utilizar iReport para hacer el reporte y después ejecutarlo desde tu aplicación, revista esta entrada y cuéntame si tienes alguna duda:
Eliminarhttp://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html
Suerte!!
Simplemente perfecto! Muchas gracias por el aporte. Justo esto estaba buscando y soluciono todo a la perfeccion.
ResponderEliminarGracias!
Saludos!
Estimado Pedro Martinez, muchas gracias por tu comentario, que bueno que te funciono!
EliminarSuerte!!