У меня 9 разных сущностей с разным количеством полей
Я пытаюсь создать PDF-файл из всех них. Я нашел это решение для создания PDF:
public class PDFGenerator {
private static Logger logger = LoggerFactory.getLogger(PDFGenerator.class);
public static ByteArrayInputStream customerPDFReport(List<Customer> customers) {
Document document = new Document();
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
PdfWriter.getInstance(document, out);
document.open();
// Add Text to PDF file ->
Font font = FontFactory.getFont(FontFactory.COURIER, 14, BaseColor.BLACK);
Paragraph para = new Paragraph( "Customer Table", font);
para.setAlignment(Element.ALIGN_CENTER);
document.add(para);
document.add(Chunk.NEWLINE);
PdfPTable table = new PdfPTable(3);
// Add PDF Table Header ->
Stream.of("ID", "First Name", "Last Name")
.forEach(headerTitle -> {
PdfPCell header = new PdfPCell();
Font headFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD);
header.setBackgroundColor(BaseColor.LIGHT_GRAY);
header.setHorizontalAlignment(Element.ALIGN_CENTER);
header.setBorderWidth(2);
header.setPhrase(new Phrase(headerTitle, headFont));
table.addCell(header);
});
for (Customer customer : customers) {
PdfPCell idCell = new PdfPCell(new Phrase(customer.getId().toString()));
idCell.setPaddingLeft(4);
idCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
idCell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(idCell);
PdfPCell firstNameCell = new PdfPCell(new Phrase(customer.getFirstName()));
firstNameCell.setPaddingLeft(4);
firstNameCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
firstNameCell.setHorizontalAlignment(Element.ALIGN_LEFT);
table.addCell(firstNameCell);
PdfPCell lastNameCell = new PdfPCell(new Phrase(String.valueOf(customer.getLastName())));
lastNameCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
lastNameCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
lastNameCell.setPaddingRight(4);
table.addCell(lastNameCell);
}
document.add(table);
document.close();
}catch(DocumentException e) {
logger.error(e.toString());
}
return new ByteArrayInputStream(out.toByteArray());
}
}
В этом решении используются Stream.of("ID", "First Name", "Last Name")
и customer.getId().toString()
, но я не знаю, для какой сущности пользователь хочет создать PDF, поэтому я не могу использовать методы get.
Мне нужно что-то вроде AbstractPDFGenerator, который будет создавать PDF для любого числа полей сущностей и заполнять их без получателей.
Какой лучший способ создания PDF для нескольких объектов?