Java tutorial
/******************************************************************************* * Copyright (c) 2013, 2016 Preparatic and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.preparatic.archivos; import java.sql.ResultSet; import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.ListItem; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.pdf.ColumnText; import com.lowagie.text.pdf.MultiColumnText; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfPageEventHelper; import com.lowagie.text.pdf.PdfWriter; import com.preparatic.ConfigProperties; import com.preparatic.entidades.PreguntaTest; import com.preparatic.entidades.Test; public class PdfGenerator { private static Logger logger = LogManager.getLogger(PdfGenerator.class); //mod_AZE_2018-02-04 (para que entren las 130 respuestas en una sola hoja) //private static final float distanciaInterPregunta = 15; //mod_AZE_2018-02-04 //private static final float distanciaTituloPregunta = 30; //mod_AZE_2018-02-04 private static final float distanciaInterPregunta = 10; //mod_AZE_2018-02-04 private static final float distanciaTituloPregunta = 25; //mod_AZE_2018-02-04 private Document docpregs; private Document docsols; private final com.lowagie.text.List listaPreguntas; private com.lowagie.text.List listaRespuestas; private final com.lowagie.text.List listaSoluciones; private final Font miFuentePregs = new Font(Font.UNDEFINED, 9, Font.NORMAL); private final Font miFuenteSols = new Font(Font.UNDEFINED, 10, Font.NORMAL); private final Test test; private String tituloTematica; /** * * @param numTest * @param idBloque * 0 si no es un bloque. */ public PdfGenerator(Test test) { this.test = test; // Generar las listas de preguntas. listaPreguntas = new com.lowagie.text.List(true); listaSoluciones = new com.lowagie.text.List(true); } /** * Ade al test una coleccin de preguntas. * * @param resultados */ public void agregarPreguntas(ResultSet resultados) throws Exception { while (!resultados.isLast()) { resultados.next(); agregarPregunta(resultados); } } public void agregarPreguntas(List<PreguntaTest> resultados) throws Exception { // resultados.forEach(pt -> agregarPregunta(pt)); for (int i = 0; i < resultados.size(); ++i) { agregarPregunta(resultados.get(i), i + 1 == resultados.size()); } } /** * Ade una pregunta al test. * * @param resultados * @throws Exception */ private void agregarPregunta(PreguntaTest pregunta, boolean isLast) { // Creamos una lista para las respuestas. listaRespuestas = new com.lowagie.text.List(true, true); listaRespuestas.add(new ListItem(pregunta.getRespuesta_a(), miFuentePregs)); listaRespuestas.add(new ListItem(pregunta.getRespuesta_b(), miFuentePregs)); listaRespuestas.add(new ListItem(pregunta.getRespuesta_c(), miFuentePregs)); listaRespuestas.add(new ListItem(pregunta.getRespuesta_d(), miFuentePregs)); // Incorporamos la lista de respuestas en un nico Prrafo Paragraph parrafoPregunta = new Paragraph(pregunta.getPregunta(), miFuentePregs); parrafoPregunta.setKeepTogether(true); parrafoPregunta.add(listaRespuestas); if (!isLast) parrafoPregunta.setSpacingAfter(distanciaInterPregunta); // Metemos la pregunta como un Li en ListaPreguntas. ListItem li = new ListItem(parrafoPregunta); li.setKeepTogether(true); listaPreguntas.add(li); String cadenaSolucion = pregunta.getRespuesta_correcta().toUpperCase(); if (pregunta.getTemas() != null) cadenaSolucion += " (T" + pregunta.getTemas() + ")"; listaSoluciones.add(new ListItem(cadenaSolucion, miFuenteSols)); } private void agregarPregunta(ResultSet resultados) throws Exception { // Creamos una lista para las respuestas. listaRespuestas = new com.lowagie.text.List(true, true); listaRespuestas.add(new ListItem(resultados.getString("RESPUESTA_A"), miFuentePregs)); listaRespuestas.add(new ListItem(resultados.getString("RESPUESTA_B"), miFuentePregs)); listaRespuestas.add(new ListItem(resultados.getString("RESPUESTA_C"), miFuentePregs)); listaRespuestas.add(new ListItem(resultados.getString("RESPUESTA_D"), miFuentePregs)); // Incorporamos la lista de respuestas en un nico Prrafo Paragraph parrafoPregunta = new Paragraph(resultados.getString("PREGUNTA"), miFuentePregs); parrafoPregunta.setKeepTogether(true); parrafoPregunta.add(listaRespuestas); if (!resultados.isLast()) parrafoPregunta.setSpacingAfter(distanciaInterPregunta); // Metemos la pregunta como un Li en ListaPreguntas. ListItem li = new ListItem(parrafoPregunta); li.setKeepTogether(true); listaPreguntas.add(li); String cadenaSolucion = resultados.getString("RESPUESTA_CORRECTA").toUpperCase(); if (resultados.getString(7) != null) cadenaSolucion += " (T" + resultados.getString("TEMAS") + ")"; listaSoluciones.add(new ListItem(cadenaSolucion, miFuenteSols)); } /** * Genera un pdf para las preguntas y otro para las soluciones. * * @throws Exception */ public String guardarPDF() throws Exception { // Abrir documentos docpregs = new Document(); docsols = new Document(); String pregsFilename = FactoriaArchivo.pdfTestFilename(test.getTipoTest(), test.getIdBloqueTematicaAnho(), test.getIdTest()); PdfWriter writerPregs = PdfWriter.getInstance(docpregs, FactoriaArchivo.pdfTest(test.getTipoTest(), test.getIdBloqueTematicaAnho(), test.getIdTest())); TestFooter footerPregs = new TestFooter(test.getTitulo()); //mod_AZ_2018-02-04 writerPregs.setPageEvent(footerPregs); PdfWriter.getInstance(docsols, FactoriaArchivo.pdfSol(test.getTipoTest(), test.getIdBloqueTematicaAnho(), test.getIdTest())); docpregs.open(); docsols.open(); docpregs.setMargins(80, 80, 72, 36); docsols.setMargins(80, 80, 36, 36); // Aadir logo Image gif = Image.getInstance(ConfigProperties.getProperty("files.rootDir") + "/images/logo-alpha.png"); //mod_AZE_2018-02-04 (logo con fondo blanco) gif.setAlignment(Image.LEFT); gif.scaleAbsolute(148, 46); //mod_AZE_2018-02-04 (para que entre bien el logo nuevo) docpregs.add(gif); docsols.add(gif); ponerTitulo(docpregs, docsols); // Adimos las preguntas al documento de preguntas docpregs.add(listaPreguntas); /* * Aadimos las respuestas, en varias columnas al documento de * respuestas. */ MultiColumnText multiColumnTextSoluciones = new MultiColumnText(); multiColumnTextSoluciones.addRegularColumns(docsols.left(), docsols.right(), 20f, Integer.parseInt(ConfigProperties.getProperty("tests.solucion.columnas"))); multiColumnTextSoluciones.addElement(listaSoluciones); docsols.add(multiColumnTextSoluciones); // Cerramos los documentos docpregs.close(); docsols.close(); return pregsFilename; } public void setTituloTematica(String tituloTematica) { this.tituloTematica = tituloTematica; } private void ponerTitulo(Document docpregs, Document docsols) { // Titulos de los tests. String tituloPregs, tituloSols, subtitulo = ""; tituloPregs = "Test " + test.getIdTestStr(); tituloSols = "Soluciones de test " + test.getIdTestStr(); try { // Ponemos los titulos Paragraph parrafo = new Paragraph(tituloPregs, new Font(Font.UNDEFINED, Font.DEFAULTSIZE, Font.BOLD)); parrafo.setAlignment(Paragraph.ALIGN_CENTER); parrafo.setSpacingAfter(distanciaTituloPregunta); docpregs.add(parrafo); parrafo = new Paragraph(tituloSols, new Font(Font.UNDEFINED, Font.DEFAULTSIZE , Font.BOLD)); parrafo.setAlignment(Paragraph.ALIGN_CENTER); parrafo.setSpacingAfter(distanciaTituloPregunta); docsols.add(parrafo); switch (test.getTipoTest()) { case BLOQUE: subtitulo = "Bloque " + test.getIdBloqueTematicaAnho(); break; case TEMA: subtitulo = "Tema " + test.getIdBloqueTematicaAnho(); break; case EXAMEN: subtitulo = "Examen " + test.getIdBloqueTematicaAnho(); break; case AO: subtitulo = "Ao " + test.getIdBloqueTematicaAnho(); break; case ALEATORIO: case RELEVANCIA: default: subtitulo = ""; break; } // SubTtulo if (subtitulo != "") { parrafo = new Paragraph(subtitulo, new Font(Font.UNDEFINED, Font.DEFAULTSIZE, Font.BOLD)); parrafo.setSpacingAfter(distanciaInterPregunta); parrafo.setAlignment(Paragraph.ALIGN_CENTER); docpregs.add(parrafo); docsols.add(parrafo); } //mod_AZE_2018-02-04 START // Aadir en el pi de pgina // - la versin actual de la aplicacin y // - el link al foro de preguntas String app_version = ConfigProperties.getProperty("app.version"); String test_foro_link = ConfigProperties.getProperty("tests.foro.link"); if (app_version != "") { parrafo = new Paragraph(app_version, new Font(Font.UNDEFINED, Font.DEFAULTSIZE - 2, Font.NORMAL)); parrafo.setSpacingAfter(distanciaInterPregunta); parrafo.setAlignment(Paragraph.ALIGN_CENTER); docpregs.add(parrafo); //docsols.add(parrafo); //No lo agregamos en el documento de soluciones para que se imprima correctamente } if (test_foro_link != "") { String temp = "Foro para comunicar errores o dudas en las preguntas de test: " + test_foro_link; parrafo = new Paragraph(temp, new Font(Font.UNDEFINED, Font.DEFAULTSIZE - 2, Font.ITALIC)); parrafo.setSpacingAfter(distanciaInterPregunta); parrafo.setAlignment(Paragraph.ALIGN_CENTER); docpregs.add(parrafo); //docsols.add(parrafo); //No lo agregamos en el documento de soluciones para que se imprima correctamente } //mod_AZE_2018-02-04 END } catch (DocumentException e) { logger.error("Crear PDF. Poner ttulo."); logger.error(e.getMessage()); } } } class TestFooter extends PdfPageEventHelper { Font ffont = new Font(Font.UNDEFINED, Font.DEFAULTSIZE - 2, Font.NORMAL); private int pageNumber; private String title; public TestFooter(String title) { this.title = title; } @Override public void onChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title) { pageNumber = 1; } @Override public void onStartPage(PdfWriter writer, Document document) { pageNumber++; } @Override public void onEndPage(PdfWriter writer, Document document) { PdfContentByte cb = writer.getDirectContent(); // Phrase header = new Phrase("this is a header", ffont); // ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, // header, // (document.right() - document.left()) / 2 + document.leftMargin(), // document.top() + 10, 0); Phrase footer = new Phrase(String.format(title + ", pgina %d", pageNumber), ffont); ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, (document.right() - document.left()) / 2 + document.leftMargin(), document.bottom() - 10, 0); } }