Java tutorial
/* * This file is part of Biblioteca-Digital de Univalle. * * Biblioteca-Digital de Univalle is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Biblioteca-Digital de Univalle is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with Biblioteca-Digital de Univalle. If not, see <http://www.gnu.org/licenses/>. * */ package biblioteca.reportes; import biblioteca.database2.accesoDatos.DaoReportesEstadisticas; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.Image; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; /** * Esta clase provee una interfaz entre los resultados de las consultas de la base * de datos para los reportes y estadisticas, y el mdulo para la creacin de pdf * (iText), provee metodos estaticos para crear tablas y pdf. * * @author Alejandro Valds Villada * @author Mara Cristina Bustos Rodrguez */ public class PdfCreator { static java.util.Date actual = new java.util.Date(); static java.sql.Timestamp fecha = new java.sql.Timestamp(actual.getTime()); /** * Dado un resultSet obtenido de una consulta, esta funcin convierte los datos * internos de este en una tabla que puede ser insertada en un Document de iText * esta PdfPTable tiene en su primera linea los nombres de las columnas del ResultSet * @param entrada ResultSet El resultado de una consulta a la base de datos * @return una PdfPTable para insertar en un documento de iText * @see com.itextpdf.text.pdf.PdfPTable; * @see java.sql.ResultSet; */ static public PdfPTable resultSetToTable(ResultSet entrada) { PdfPTable salida = null; try { ResultSetMetaData rsmd = entrada.getMetaData(); salida = new PdfPTable(rsmd.getColumnCount()); for (int i = 1; i <= rsmd.getColumnCount(); i++) { salida.addCell(rsmd.getColumnName(i)); } salida.setHeaderRows(1); while (entrada.next()) { for (int i = 1; i <= rsmd.getColumnCount(); i++) { salida.addCell(entrada.getString(i)); } } } catch (java.sql.SQLException sqlex) { System.err.println(sqlex); } return salida; } static public PdfPTable plainArrayListToPdfPTable(ArrayList<String> entrada, int columns) { PdfPTable salida = new PdfPTable(columns); for (int i = 0; i < columns; i++) { salida.addCell(entrada.get(i)); } salida.setHeaderRows(1); for (int i = columns; i < entrada.size(); i++) { salida.addCell(entrada.get(i)); } return salida; } static public ArrayList<PdfPTable> resultSetsToTables(ArrayList<ResultSet> entrada) { ArrayList<PdfPTable> Salida = new ArrayList<PdfPTable>(10); PdfPTable salida = null; for (int j = 0; j < entrada.size(); j++) { try { ResultSetMetaData rsmd = entrada.get(j).getMetaData(); salida = new PdfPTable(rsmd.getColumnCount()); for (int i = 1; i <= rsmd.getColumnCount(); i++) { salida.addCell(rsmd.getColumnName(i)); } salida.setHeaderRows(1); while (entrada.get(j).next()) { for (int i = 1; i <= rsmd.getColumnCount(); i++) { salida.addCell(entrada.get(j).getString(i)); } } } catch (java.sql.SQLException sqlex) { System.err.println(sqlex); } Salida.add(salida); } return Salida; } /** * Esta funcin convierte un arrayList en una PdfPTable y, agrega una columna * de estadisticas a esta. Funcionar si el arrayList tiene en su ultima columna * numeros * @param entrada Matriz con los datos estadisticos de la base de datos * @param total La suma de todos los datos de la ultima columna * @param rows El numero de columnas que se mostrarn en la PdfPTable * @return PdfPTable Contiene los datos del ArrayList ms los porcentajes. */ static public PdfPTable arrayListToStatisticTable(ArrayList<ArrayList<String>> entrada, int total, int rows) { PdfPTable salida = null; salida = new PdfPTable(entrada.get(0).size() + 1); for (int i = 0; i < entrada.get(0).size(); i++) { salida.addCell(entrada.get(0).get(i)); } salida.addCell("Porcentaje"); salida.setHeaderRows(1); int counter = 0; for (int j = 1; j < entrada.size() && counter < rows; j++) { for (int i = 0; i < entrada.get(j).size(); i++) { salida.addCell(entrada.get(j).get(i)); if (i == entrada.get(j).size() - 1) { int porcentaje = (int) (Integer.parseInt(entrada.get(j).get(i)) * 100) / total; salida.addCell(porcentaje + "%"); } } counter++; } if (entrada.size() - 1 > rows) { int otros = 0, otrospor; for (int i = counter; i < entrada.size(); i++) { otros += Integer.parseInt(entrada.get(i).get(entrada.get(i).size() - 1)); } otrospor = otros * 100; otrospor /= total; salida.addCell("-"); salida.addCell("Otros"); salida.addCell(otros + ""); salida.addCell(otrospor + "%"); } return salida; } /** * Dado un resultSet, se transforma en un ArrayList de ArrayList de String, * manteniendo la misma estructura de tabla que tenia el resultSet original, * y en su primera linea teniendo los nombres de las columnas del resultSet * @param entrada Un ResultSet obtenido de una consulta SQL * @return ArrayList<ArrayList<String>> que contiene los datos del ResultSet ms los nombres de la columna */ static public ArrayList<ArrayList<String>> resultSetToArrayList(ResultSet entrada) { ArrayList<ArrayList<String>> salida = null; try { ResultSetMetaData rsmd = entrada.getMetaData(); salida = new ArrayList<ArrayList<String>>(); ArrayList<String> titulos = new ArrayList<String>(rsmd.getColumnCount()); for (int i = 1; i <= rsmd.getColumnCount(); i++) { titulos.add(rsmd.getColumnName(i)); } salida.add(titulos); while (entrada.next()) { ArrayList<String> temporal = new ArrayList<String>(rsmd.getColumnCount()); for (int i = 1; i <= rsmd.getColumnCount(); i++) { temporal.add(entrada.getString(i)); } salida.add(temporal); } } catch (java.sql.SQLException sqlex) { System.err.println(sqlex); } return salida; } static public ArrayList<String> Array2DtoArrayPlane(ArrayList<ArrayList<String>> entrada, int index1, int index2) { int size = entrada.size(); ArrayList<String> salida = new ArrayList<String>(size); for (int i = 0; i < size; i++) { salida.add(entrada.get(i).get(index1)); salida.add(entrada.get(i).get(index2)); } return salida; } /** * createPdf es una funcin estatica que funciona como plantilla para generar * reportes dinamicos, segn la necesidad del usuario. * @param path La direccin del archivo donde se guardar el pdf * @param titulo El Ttulo que llevar el pdf * @param encabezado Un texto que se mostrar bajo el ttulo * @param tabla La tabla de resultados que mostrar el pdf */ static public void createPdf(String path, String titulo, String encabezado, PdfPTable tabla) { Document document = new Document(); // step 2 try { PdfWriter.getInstance(document, new FileOutputStream(path)); Font myFontTitle = new Font(); myFontTitle.setFamily("Arial"); myFontTitle.setStyle(Font.BOLD); myFontTitle.setSize(14); Font Univallef = new Font(); Univallef.setColor(BaseColor.RED); Univallef.setFamily("Arial"); Univallef.setSize(18); Image header = Image .getInstance(PdfCreator.class.getResource("/biblioteca/gui/resources/minilogo.png")); header.setAlignment(Image.ALIGN_CENTER); header.scaleToFit(50, 75); Paragraph Univalle = new Paragraph("Universidad del Valle", Univallef); Univalle.setAlignment(Paragraph.ALIGN_CENTER); Paragraph pTitulo = new Paragraph(titulo, myFontTitle); pTitulo.setAlignment(Paragraph.ALIGN_CENTER); Paragraph biblioteca = new Paragraph("Biblioteca Digital EISC", myFontTitle); biblioteca.setAlignment(Paragraph.ALIGN_CENTER); Paragraph developers = new Paragraph( "Desarrollado por:\n Mara Cristina Bustos \n Alejandro Valds Villada", myFontTitle); developers.setAlignment(Paragraph.ALIGN_CENTER); Paragraph Fecha = new Paragraph("Fecha y Hora del Reporte: " + fecha, myFontTitle); document.open(); // step 4 document.add(header); document.add(new Paragraph("\r\n")); document.add(Univalle); document.add(new Paragraph("\r\n")); document.add(pTitulo); document.add(new Paragraph("\r\n")); document.add(biblioteca); document.add(new Paragraph("\r\n")); document.add(developers); document.add(new Paragraph("\r\n")); document.add(Fecha); document.add(new Paragraph("\r\n")); document.add(new Paragraph(encabezado + (tabla.getRows().size() - 1))); document.add(new Paragraph("\r\n")); document.add(tabla); // step 5 document.close(); } catch (DocumentException de) { System.err.println(de); } catch (IOException ioex) { System.err.println(ioex); } } static public void createArrayListPdf(String path, String titulo, String encabezado, ArrayList<PdfPTable> tablas) { Document document = new Document(); ArrayList<String> NombreTablas = new DaoReportesEstadisticas().getNombreTablas(); //step 2 try { PdfWriter.getInstance(document, new FileOutputStream(path)); Font myFontTitle = new Font(); myFontTitle.setFamily("Arial"); myFontTitle.setStyle(Font.BOLD); myFontTitle.setSize(12); Font Univallef = new Font(); Univallef.setColor(BaseColor.RED); Univallef.setFamily("Arial"); Univallef.setSize(18); Image header = Image .getInstance(PdfCreator.class.getResource("/biblioteca/gui/resources/minilogo.png")); header.setAlignment(Image.ALIGN_CENTER); header.scaleToFit(50, 75); Paragraph Univalle = new Paragraph("Universidad del Valle", Univallef); Univalle.setAlignment(Paragraph.ALIGN_CENTER); Paragraph pTitulo = new Paragraph(titulo, myFontTitle); pTitulo.setAlignment(Paragraph.ALIGN_CENTER); Paragraph biblioteca = new Paragraph("Biblioteca Digital EISC", myFontTitle); biblioteca.setAlignment(Paragraph.ALIGN_CENTER); Paragraph developers = new Paragraph( "Desarrollado por:\n Mara Cristina Bustos \n Alejandro Valds Villada", myFontTitle); developers.setAlignment(Paragraph.ALIGN_CENTER); Paragraph Fecha = new Paragraph("Fecha y Hora de Reporte: " + fecha, myFontTitle); document.open(); // step 4 document.add(header); document.add(new Paragraph("\r\n")); document.add(Univalle); document.add(new Paragraph("\r\n")); document.add(pTitulo); document.add(new Paragraph("\r\n")); document.add(biblioteca); document.add(new Paragraph("\r\n")); document.add(developers); document.add(new Paragraph("\r\n")); document.add(Fecha); document.add(new Paragraph("\r\n")); for (int i = 0; i < tablas.size(); i++) { document.add(new Paragraph(NombreTablas.get(i))); document.add(new Paragraph(encabezado + (tablas.get(i).getRows().size() - 1))); document.add(new Paragraph("\r\n")); document.add(tablas.get(i)); } // step 5 document.close(); } catch (DocumentException de) { System.err.println(de); } catch (IOException ioex) { System.err.println(ioex); } } static public void createDinamicPdf(String path, String titulo, String encabezado, ArrayList<Element> contenido) { Document document = new Document(); //step 2 try { PdfWriter.getInstance(document, new FileOutputStream(path)); Font myFontTitle = new Font(); myFontTitle.setFamily("Arial"); myFontTitle.setStyle(Font.BOLD); myFontTitle.setSize(12); Font Univallef = new Font(); Univallef.setColor(BaseColor.RED); Univallef.setFamily("Arial"); Univallef.setSize(18); Image header = Image .getInstance(PdfCreator.class.getResource("/biblioteca/gui/resources/minilogo.png")); header.setAlignment(Image.ALIGN_CENTER); header.scaleToFit(50, 75); Paragraph Univalle = new Paragraph("Universidad del Valle", Univallef); Univalle.setAlignment(Paragraph.ALIGN_CENTER); Paragraph pTitulo = new Paragraph(titulo, myFontTitle); pTitulo.setAlignment(Paragraph.ALIGN_CENTER); Paragraph biblioteca = new Paragraph("Biblioteca Digital EISC", myFontTitle); biblioteca.setAlignment(Paragraph.ALIGN_CENTER); Paragraph developers = new Paragraph( "Desarrollado por:\n Mara Cristina Bustos \n Alejandro Valds Villada", myFontTitle); developers.setAlignment(Paragraph.ALIGN_CENTER); Paragraph Fecha = new Paragraph("Fecha y Hora de Reporte: " + fecha, myFontTitle); //Paragraph Introduccion = new Paragraph("Reporte de usuarios registrados"); document.open(); // step 4 document.add(header); document.add(new Paragraph("\r\n")); document.add(Univalle); document.add(new Paragraph("\r\n")); document.add(pTitulo); document.add(new Paragraph("\r\n")); document.add(biblioteca); document.add(new Paragraph("\r\n")); document.add(developers); document.add(new Paragraph("\r\n")); document.add(Fecha); document.add(new Paragraph("\r\n")); // document.add(Introduccion); document.add(new Paragraph("\r\n")); for (int i = 0; i < contenido.size(); i++) { document.add(contenido.get(i).getClass().equals(new PdfPTable(2).getClass()) ? (PdfPTable) contenido.get(i) : contenido.get(i)); } // step 5 document.close(); } catch (DocumentException de) { System.err.println(de); } catch (IOException ioex) { System.err.println(ioex); } } }