/* * Copyright (C) 2022 Alessandro Iezzi * * This file is part of Simply Reports. * * Simply Reports is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Simply Reports 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Simply Reports. If not, see . */ package it.alessandroiezzi.simplyreports.pdf; import com.lowagie.text.*; import com.lowagie.text.Font; import com.lowagie.text.pdf.*; import java.awt.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.function.Supplier; public abstract class PDFTable extends PDFEntity { private final List entities; private final List cells = new ArrayList<>(); private final int[] widths; private PDFTableHeader header; private PDFTableFooter footer; private final String[] columnTitles; public PDFTable(List entities, String[] columnTitles, int...widths) { this.entities = entities; this.widths = widths; this.columnTitles = columnTitles; generateSignature(); } private void generateSignature() { SimpleDateFormat sdfDate = new SimpleDateFormat("dd/MM/yyyy"); SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm"); Date now = new Date(); addFooter(new PDFTableFooter(null, "Generato con Simply Reports il " + sdfDate.format(now) + " alle " + sdfTime.format(now), null, null, 0)); } protected abstract int getNumberOfColumns(); protected abstract void mapRow(E entity); public void addCell(PdfTableCell cell) { cells.add(cell); } public void addCell(Supplier value) { addCell(new PdfTableCell(value)); } public void addHeader(PDFTableHeader header) { this.header = header; } public void addFooter(PDFTableFooter footer) { this.footer = footer; } @Override protected PdfPTable generate(PdfWriter writer) { try { PdfPTable table = new PdfPTable(getNumberOfColumns()); table.setWidthPercentage(100); if (widths != null && widths.length > 0) table.setWidths(widths); else throw new IllegalArgumentException("widths is mandatory!"); for (E entity : this.entities) { mapRow(entity); } if (header != null && writer != null) { if (header.getColspan() == null) { header.setColspan(widths.length); } table.addCell(header.generate(writer)); } if (columnTitles != null && columnTitles.length > 0) { for (String columnTitle : columnTitles) { Font f = new Font(Font.HELVETICA, 8.0f, Font.BOLD, Color.BLACK); Chunk c = new Chunk(columnTitle, f); Paragraph p = new Paragraph(c); p.setAlignment(Element.ALIGN_CENTER); PdfPCell cell = new PdfPCell(); cell.setUseAscender(true); cell.setPadding(5); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.addElement(p); table.addCell(cell); } } for (PdfTableCell cell : cells) { table.addCell(cell.getValue()); } if (footer != null && writer != null) { if (footer.getColspan() == null) { footer.setColspan(widths.length); } table.addCell(footer.generate(writer)); } return table; } catch (DocumentException ex) { throw new RuntimeException(ex); } } }