Commit 5658d28f by Joel Florentin

generar pdf de detalle postulante desde backend. estilo basico

parent 6726e237
...@@ -92,6 +92,13 @@ ...@@ -92,6 +92,13 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -20,6 +20,7 @@ import com.roshka.repositorio.ExperienciaRepository; ...@@ -20,6 +20,7 @@ import com.roshka.repositorio.ExperienciaRepository;
import com.roshka.repositorio.InstitucionRepository; import com.roshka.repositorio.InstitucionRepository;
import com.roshka.repositorio.PostulanteRepository; import com.roshka.repositorio.PostulanteRepository;
import com.roshka.repositorio.TecnologiaRepository; import com.roshka.repositorio.TecnologiaRepository;
import com.roshka.service.PdfGenerator;
import com.roshka.utils.Helper; import com.roshka.utils.Helper;
...@@ -169,5 +170,26 @@ public class PostulanteRRHHController { ...@@ -169,5 +170,26 @@ public class PostulanteRRHHController {
} }
} }
@GetMapping("/postulantes/{id}/pdf")
public ResponseEntity<Resource> downloadPDF(@PathVariable Long id) {
// Load file from database
PdfGenerator pdf = new PdfGenerator();
try {
Postulante postulante = post.findById(id)
.orElseThrow(() -> new Exception("Postulante no encontrado"));
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType("application/pdf"))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + "aver.pdf" + "\"")
.body(new ByteArrayResource(pdf.generatePdfReport(postulante)));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return ResponseEntity.notFound().build();
}
}
} }
\ No newline at end of file
package com.roshka.service;
import java.io.ByteArrayOutputStream;
import java.util.Date;
import java.util.stream.Collectors;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import org.springframework.stereotype.Component;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.roshka.modelo.Estudio;
import com.roshka.modelo.Experiencia;
import com.roshka.modelo.Postulante;
import com.roshka.utils.Helper;
@Component("pdfGenerator")
public class PdfGenerator {
private static Font COURIER = new Font(Font.FontFamily.COURIER, 20, Font.BOLD);
private static Font COURIER_MEDIUM = new Font(Font.FontFamily.COURIER, 16, Font.BOLD);
private static Font COURIER_SMALL = new Font(Font.FontFamily.COURIER, 14, Font.UNDERLINE);
public byte[] generatePdfReport(Postulante postulante) {
Document document = new Document();
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfWriter.getInstance(document, byteArrayOutputStream);
document.open();
addDocTitle(document, postulante);
createTable(document,postulante);
document.close();
System.out.println("------------------Your PDF Report is ready!-------------------------");
return byteArrayOutputStream.toByteArray();
} catch ( DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
private void addDocTitle(Document document, Postulante postulante) throws DocumentException {
Paragraph p1 = new Paragraph();
leaveEmptyLine(p1, 1);
p1.add(new Paragraph("Detalles del postulante", COURIER));
p1.setAlignment(Element.ALIGN_CENTER);
document.add(p1);
}
private void agregarEncabezado(Document document, String titulo) throws DocumentException {
Paragraph p1 = new Paragraph();
p1.setAlignment(Element.ALIGN_CENTER);
p1.add(new Paragraph(titulo, COURIER_MEDIUM));
document.add(p1);
}
private void agregarSubEncabezado(Document document, String titulo) throws DocumentException {
Paragraph p1 = new Paragraph();
p1.setAlignment(Element.ALIGN_CENTER);
p1.add(new Paragraph(titulo, COURIER_SMALL));
document.add(p1);
}
private void agregarLabelTexto(Document document, String label, Object texto) throws DocumentException{
if(texto == null) return;
if(texto instanceof Date) texto = Helper.formatDate((Date)texto, "dd-MM-yyyy");
Paragraph paragraph = new Paragraph();
paragraph.add(label + ": ");
paragraph.add(texto.toString());
document.add(paragraph);
}
private void createTable(Document document, Postulante postulante) throws DocumentException {
Paragraph paragraph = new Paragraph();
leaveEmptyLine(paragraph, 3);
//paragraph.add();
agregarEncabezado(document, "Datos personales");
agregarLabelTexto(document, "Nombre", postulante.getNombre() + " " + postulante.getApellido());
agregarLabelTexto(document, "Nro de Documento", postulante.getNroDocument());
agregarLabelTexto(document, "Correo", postulante.getCorreo());
agregarLabelTexto(document, "Direccion", postulante.getDireccion());
agregarLabelTexto(document, "Ciudad", postulante.getCiudad().getNombre());
agregarLabelTexto(document, "Telefono", postulante.getTelefono());
agregarLabelTexto(document, "Edad", Helper.calculateAge(postulante.getFechaNacimiento()) );
agregarLabelTexto(document, "Nivel de Ingles", postulante.getNivelIngles());
agregarLabelTexto(document, "Nacionalidad", postulante.getNacionalidad().getDescripcion());
agregarEncabezado(document, "Experiencias");
for(Experiencia ex : postulante.getExperiencias()){
agregarSubEncabezado(document, ex.getInstitucion());
agregarLabelTexto(document, "Fecha Inicio", ex.getFechaDesde());
agregarLabelTexto(document, "Fecha Fin", ex.getFechaHasta());
agregarLabelTexto(document, "Cargo", ex.getCargo());
agregarLabelTexto(document, "Tipo Experiencia", ex.getTipoExperiencia());
agregarLabelTexto(document, "Descripcion", ex.getDescripcion());
agregarLabelTexto(document, "Nombre Referencia", ex.getNombreReferencia());
agregarLabelTexto(document, "Telefono Referencia", ex.getTelefonoReferencia());
agregarLabelTexto(document, "Motivo Salida", ex.getMotivoSalida());
}
agregarEncabezado(document, "Estudios");
for(Estudio ex : postulante.getEstudios()){
agregarSubEncabezado(document, ex.getInstitucion().getNombre());
agregarLabelTexto(document, "Fecha Inicio", ex.getFechaDesde());
agregarLabelTexto(document, "Fecha Fin", ex.getFechaHasta());
agregarLabelTexto(document, "Tema de Estudio", ex.getTemaDeEstudio());
agregarLabelTexto(document, "Tipo de Estudio", ex.getTipoDeEstudio());
agregarLabelTexto(document, "Descripcion", ex.getEstado().toString());
}
agregarEncabezado(document, "Cargo al cual postula");
agregarList(postulante.getPostulaciones().stream()
.map(cc -> cc.getCargo().getNombre())
.collect(Collectors.toList()), document);
agregarEncabezado(document, "Tecnologias");
agregarList(postulante.getTecnologias().stream()
.map(cc -> cc.getTecnologia().getNombre())
.collect(Collectors.toList()),
document);
agregarEncabezado(document, "Referencias Personales");
agregarList(postulante.getReferencias().stream()
.map(cc -> "Nombre: " + cc.getNombre() + ". Relacion: " + cc.getRelacion() + ". Telefono: " + cc.getTelefono() )
.collect(Collectors.toList()),
document);
}
private void agregarList(java.util.List<String> items, Document document) throws DocumentException{
List list = new List(false);
for(String item : items){
list.add(new ListItem(item));
}
document.add(list);
}
private static void leaveEmptyLine(Paragraph paragraph, int number) {
for (int i = 0; i < number; i++) {
paragraph.add(new Paragraph(" "));
}
}
}
...@@ -3,9 +3,9 @@ package com.roshka.utils; ...@@ -3,9 +3,9 @@ package com.roshka.utils;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.YearMonth; import java.time.LocalDate;
import java.time.ZoneOffset; import java.time.Period;
import java.time.temporal.ChronoUnit; import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -46,6 +46,31 @@ public class Helper { ...@@ -46,6 +46,31 @@ public class Helper {
return Math.round(diff/30.d) ; return Math.round(diff/30.d) ;
} }
public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}
public static int calculateAge(LocalDate birthDate, LocalDate currentDate) {
if ((birthDate != null) && (currentDate != null)) {
return Period.between(birthDate, currentDate).getYears();
} else {
return 0;
}
}
public static int calculateAge(Date birthDate) {
LocalDate currentDate = LocalDate.now();
return calculateAge(convertToLocalDateViaSqlDate(birthDate),currentDate);
}
public static String formatDate(LocalDate fecha, String format){
if(fecha == null || format == null) return null;
return fecha.format(DateTimeFormatter.ofPattern(format));
}
public static String formatDate(Date fecha, String format){
return formatDate(convertToLocalDateViaSqlDate(fecha), format);
}
public static DBFile createFile(MultipartFile file) { public static DBFile createFile(MultipartFile file) {
// Normalize file name // Normalize file name
String fileName = StringUtils.cleanPath(file.getOriginalFilename()); String fileName = StringUtils.cleanPath(file.getOriginalFilename());
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%> <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<layout:extends name="layouts/base.jsp"> <layout:extends name="layouts/base.jsp">
<layout:put block="cssDeclaracion" type="APPEND"></layout:put> <layout:put block="cssDeclaracion" type="APPEND"></layout:put>
<layout:put block="contents" type="REPLACE"> <layout:put block="contents" type="REPLACE">
...@@ -44,8 +46,8 @@ ...@@ -44,8 +46,8 @@
<th scope="row">${sta.index+1}</th> <th scope="row">${sta.index+1}</th>
<td>${convocatoria.getCargo().getNombre()}</td> <td>${convocatoria.getCargo().getNombre()}</td>
<td>${convocatoria.getEstado().getDescripcion()}</td> <td>${convocatoria.getEstado().getDescripcion()}</td>
<td>${convocatoria.getFechaInicio().toString().split(" ")[0]}</td> <td><fmt:formatDate value="${convocatoria.getFechaInicio()}" pattern="dd-MM-yyyy" /></td>
<td>${convocatoria.getFechaFin().toString().split(" ")[0]}</td> <td><fmt:formatDate value="${convocatoria.getFechaFin()}" pattern="dd-MM-yyyy" /></td>
<td><a href="/postulantes?convId=${convocatoria.id}">Ver postulantes</a></td> <td><a href="/postulantes?convId=${convocatoria.id}">Ver postulantes</a></td>
<td><button onclick=window.location.href="/convocatoria/${convocatoria.id}">Cerrar convocatoria</button></td> <td><button onclick=window.location.href="/convocatoria/${convocatoria.id}">Cerrar convocatoria</button></td>
</tr> </tr>
......
...@@ -142,7 +142,10 @@ ...@@ -142,7 +142,10 @@
</div> </div>
</c:when> </c:when>
</c:choose> </c:choose>
<div class="col">
<a class="btn btn-link" target="__blank" href="/postulantes/${postulante.id}/pdf">Obtener pdf</a>
</div>
</div> </div>
</div> </div>
......
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<layout:extends name="layouts/base.jsp">
<layout:put block="contents" type="REPLACE">
<h2 style="text-align: center;">
DETALLE POSTULANTE
</h2>
${postulante.nombre} ${postulante.apellido}
</layout:put>
</layout:extends>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment