From 6aea90c6eceaeb86dff9c7fde5d4284c8c6ceb37 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 28 Oct 2024 18:11:41 +0530 Subject: [PATCH 1/5] Updated code for pdf tabel updation --- .../gepafin/tendermanagement/dao/PdfDao.java | 166 +++++++++--------- .../gepafin/tendermanagement/util/Utils.java | 26 +++ 2 files changed, 112 insertions(+), 80 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index a2c03a5b..702c61d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -16,6 +16,7 @@ import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -91,73 +92,73 @@ public class PdfDao { Font boldSmallFont = new Font(Font.FontFamily.HELVETICA, 10, Font.BOLD,new BaseColor(105, 105, 105)); // Adding the "Documenti Allegati" section title - document.add(new Paragraph(" ")); - -// pageEvent.setTotalPages(writer.getPageNumber()); - document.newPage(); -// pageEvent.setTotalPages(writer.getPageNumber()); - document.add(new Paragraph("Documenti Allegati", sectionFont)); - document.add(new Paragraph(" ")); - - -// 1. Autocertificazione possesso Requisiti - Paragraph p1 = new Paragraph(); - p1.add(new Chunk("1. ", boldSmallFont)); - p1.add(new Chunk("Autocertificazione possesso Requisiti ", boldSmallFont)); - p1.add(new Chunk("ai sensi degli artt. 46 e 47 del DPR 445/2000", smallFont)); - document.add(p1); - document.add(new Paragraph(" ")); - - - -// 2. Informativa Privacy relativa al trattamento dei dati personali - Paragraph p2 = new Paragraph(); - p2.add(new Chunk("2. ", boldSmallFont)); - p2.add(new Chunk("Informativa Privacy relativa al trattamento dei dati personali", boldSmallFont)); - document.add(p2); - document.add(new Paragraph(" ")); - - -// 3. Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari - Paragraph p3 = new Paragraph(); - p3.add(new Chunk("3. ", boldSmallFont)); - p3.add(new Chunk("Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari prospettici come da tabella di cui all’Appendice 9", boldSmallFont)); - document.add(p3); - document.add(new Paragraph(" ")); - - -// 4. Rilevazione Centrale dei Rischi - Paragraph p4 = new Paragraph(); - p4.add(new Chunk("4. ", boldSmallFont)); - p4.add(new Chunk("Rilevazione Centrale dei Rischi riferita agli ultimi 36 mesi disponibili alla data di presentazione della Domanda", boldSmallFont)); - document.add(p4); - document.add(new Paragraph(" ")); - - -// 5. Schema di presentazione dei dati di bilancio - Paragraph p5 = new Paragraph(); - p5.add(new Chunk("5. ", boldSmallFont)); - p5.add(new Chunk("Schema di presentazione dei dati di bilancio", boldSmallFont)); - document.add(p5); - document.add(new Paragraph(" ")); - - -// 6. Dettagli bilanci in forma abbreviata - Paragraph p6 = new Paragraph(); - p6.add(new Chunk("6. ", boldSmallFont)); - p6.add(new Chunk("Dettagli bilanci in forma abbreviata", boldSmallFont)); - document.add(p6); - document.add(new Paragraph(" ")); - - -// 7. Relazione aziendale illustrativa - Paragraph p7 = new Paragraph(); - p7.add(new Chunk("7. ", boldSmallFont)); - p7.add(new Chunk("Relazione aziendale illustrativa", boldSmallFont)); - document.add(p7); - document.add(new Paragraph(" ")); - - addColoredLines(writer,document,greenColor); +// document.add(new Paragraph(" ")); +// +//// pageEvent.setTotalPages(writer.getPageNumber()); +// document.newPage(); +//// pageEvent.setTotalPages(writer.getPageNumber()); +// document.add(new Paragraph("Documenti Allegati", sectionFont)); +// document.add(new Paragraph(" ")); +// +// +//// 1. Autocertificazione possesso Requisiti +// Paragraph p1 = new Paragraph(); +// p1.add(new Chunk("1. ", boldSmallFont)); +// p1.add(new Chunk("Autocertificazione possesso Requisiti ", boldSmallFont)); +// p1.add(new Chunk("ai sensi degli artt. 46 e 47 del DPR 445/2000", smallFont)); +// document.add(p1); +// document.add(new Paragraph(" ")); +// +// +// +//// 2. Informativa Privacy relativa al trattamento dei dati personali +// Paragraph p2 = new Paragraph(); +// p2.add(new Chunk("2. ", boldSmallFont)); +// p2.add(new Chunk("Informativa Privacy relativa al trattamento dei dati personali", boldSmallFont)); +// document.add(p2); +// document.add(new Paragraph(" ")); +// +// +//// 3. Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari +// Paragraph p3 = new Paragraph(); +// p3.add(new Chunk("3. ", boldSmallFont)); +// p3.add(new Chunk("Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari prospettici come da tabella di cui all’Appendice 9", boldSmallFont)); +// document.add(p3); +// document.add(new Paragraph(" ")); +// +// +//// 4. Rilevazione Centrale dei Rischi +// Paragraph p4 = new Paragraph(); +// p4.add(new Chunk("4. ", boldSmallFont)); +// p4.add(new Chunk("Rilevazione Centrale dei Rischi riferita agli ultimi 36 mesi disponibili alla data di presentazione della Domanda", boldSmallFont)); +// document.add(p4); +// document.add(new Paragraph(" ")); +// +// +//// 5. Schema di presentazione dei dati di bilancio +// Paragraph p5 = new Paragraph(); +// p5.add(new Chunk("5. ", boldSmallFont)); +// p5.add(new Chunk("Schema di presentazione dei dati di bilancio", boldSmallFont)); +// document.add(p5); +// document.add(new Paragraph(" ")); +// +// +//// 6. Dettagli bilanci in forma abbreviata +// Paragraph p6 = new Paragraph(); +// p6.add(new Chunk("6. ", boldSmallFont)); +// p6.add(new Chunk("Dettagli bilanci in forma abbreviata", boldSmallFont)); +// document.add(p6); +// document.add(new Paragraph(" ")); +// +// +//// 7. Relazione aziendale illustrativa +// Paragraph p7 = new Paragraph(); +// p7.add(new Chunk("7. ", boldSmallFont)); +// p7.add(new Chunk("Relazione aziendale illustrativa", boldSmallFont)); +// document.add(p7); +// document.add(new Paragraph(" ")); +// +// addColoredLines(writer,document,greenColor); document.close(); @@ -272,14 +273,17 @@ public class PdfDao { document.add(valueTable); } else { - PdfPCell valueCell = new PdfPCell(new Phrase(String.valueOf(value), valueFont)); + String fieldValue1= (String) value; + if(Utils.isValidDateString(fieldValue1)){ + fieldValue1=Utils.formatDateString(String.valueOf(value)); + } + PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell valueCell.setMinimumHeight(30f); valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners - valueTable.addCell(valueCell); document.add(valueTable); } @@ -356,6 +360,7 @@ public class PdfDao { PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + headerCell.setFixedHeight(rowHeight); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header table.addCell(headerCell); // Add the header cell to the table @@ -364,16 +369,15 @@ public class PdfDao { } // Add data rows matching stateFieldMap keys - for (Map.Entry stateField : stateFieldMap.entrySet()) { - for (String key : orderedKeys) { // Iterate over the ordered keys - Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present - PdfPCell dynamicCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); - dynamicCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell - dynamicCell.setMinimumHeight(rowHeight); - dynamicCell.setPadding(7f); + for (String key : orderedKeys) { + Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present + PdfPCell dataCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); + dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell + dataCell.setMinimumHeight(rowHeight); + dataCell.setFixedHeight(rowHeight); + dataCell.setPadding(7f); - table.addCell(dynamicCell); // Add the dynamically created cell to the table - } + table.addCell(dataCell); // Add the cell to the table } // Check if adding another row would exceed max height @@ -485,7 +489,7 @@ public class PdfDao { } fieldValue = matchedLabels; } - + // Further processing of field value (e.g., finding labels in options) fieldValue = findLabelInOptions(content.getSettings(), fieldValue); } else { @@ -494,7 +498,9 @@ public class PdfDao { } try { - addLabelValuePair(writer,document, contentLabel, fieldValue, labelFont,valueFont,content); + if((contentLabel!=null && Boolean.FALSE.equals(contentLabel.isEmpty())) || (fieldValue!=null && !StringUtils.isEmpty((CharSequence) fieldValue))) { + addLabelValuePair(writer, document, contentLabel, fieldValue, labelFont, valueFont, content); + } } catch (DocumentException e) { log.error("Error checking object: " + e.getMessage(), e); diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index a845aaad..1c86aa6b 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -4,12 +4,18 @@ import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.regex.Pattern; import java.util.stream.Collectors; +import com.itextpdf.styledxmlparser.jsoup.Jsoup; import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; @@ -369,5 +375,25 @@ public class Utils { throw new RuntimeException("Error converting map to string", e); } } + public static boolean isValidDateString(String dateStr) { + Pattern datePattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"); + return datePattern.matcher(dateStr).matches(); + } + // Method to convert a valid date string to the "dd-MM-yyyy" format + public static String formatDateString(String dateStr) { + String originalFormatPattern = "yyyy-MM-dd'T'HH:mm:ss"; + String targetFormatPattern = "dd-MM-yyyy"; + + try { + SimpleDateFormat originalFormat = new SimpleDateFormat(originalFormatPattern); + Date date = originalFormat.parse(dateStr); + SimpleDateFormat targetFormat = new SimpleDateFormat(targetFormatPattern); + + return targetFormat.format(date); + } catch (ParseException e) { + log.error("error while prcoessing date formate"); + return null; + } + } } From fc6293b3d386b1d8a27b2954ff2a6e4b6ecaa3da Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 28 Oct 2024 19:54:35 +0530 Subject: [PATCH 2/5] updated pdf code --- src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 702c61d1..4318127e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -465,7 +465,7 @@ public class PdfDao { .collect(Collectors.toList()); fieldValue = names; } - } else if (name.equals("checkboxes")) { + } else if (name.equals("checkboxes") && fieldValue instanceof List) { List check = (List) fieldValue; List settingResponseBeans = content.getSettings(); List matchedLabels = new ArrayList<>(); From 564d5d5dd2e602feaee53c233e3349a03dbb7a1c Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 28 Oct 2024 20:07:11 +0530 Subject: [PATCH 3/5] Updated code for pdf table issue --- .../gepafin/tendermanagement/dao/PdfDao.java | 29 ++++++++++++------- .../gepafin/tendermanagement/util/Utils.java | 27 +++++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 4318127e..2cf1d32b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -277,6 +277,9 @@ public class PdfDao { if(Utils.isValidDateString(fieldValue1)){ fieldValue1=Utils.formatDateString(String.valueOf(value)); } + if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ + fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + } PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value @@ -352,7 +355,6 @@ public class PdfDao { List orderedKeys = new ArrayList<>(trueKeys); orderedKeys.addAll(falseKeys); // Iterate through extracted data to populate the table - for (Map row : extractedData) { // Add headers once if (!headersAdded) { for (String key : orderedKeys) { @@ -369,16 +371,23 @@ public class PdfDao { } // Add data rows matching stateFieldMap keys - for (String key : orderedKeys) { - Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present - PdfPCell dataCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); - dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell - dataCell.setMinimumHeight(rowHeight); - dataCell.setFixedHeight(rowHeight); - dataCell.setPadding(7f); + for (Map row : extractedData) { + // Add data rows matching stateFieldMap keys + for (String key : orderedKeys) { + if (stateFieldMap.containsKey(key)) { // Only add data cell if key is in stateFieldMap + Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present + String fieldValue= (String) value; + if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ + fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + } + PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); + dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell + dataCell.setMinimumHeight(rowHeight); + dataCell.setPadding(7f); - table.addCell(dataCell); // Add the cell to the table - } + table.addCell(dataCell); // Add the cell to the table + } + } // Check if adding another row would exceed max height if (table.getTotalHeight() + rowHeight > maxTableHeight) { diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 1c86aa6b..53050f6c 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -4,6 +4,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; +import java.text.DecimalFormat; +import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; @@ -396,4 +398,29 @@ public class Utils { return null; } } + public static String convertItalianAmountToDouble(String amount) throws NumberFormatException { + // Step 1: Remove the thousands separator and replace the decimal separator + String normalizedAmount = amount.replace(".", "").replace(",", "."); + + // Step 2: Parse the string to a double + double value = Double.parseDouble(normalizedAmount); + if (value <= 0) { + return amount; + } + // Step 3: Format the double to 2 decimal places + DecimalFormat decimalFormat = new DecimalFormat("#.00"); + return decimalFormat.format(value); // Return formatted string + } + public static boolean isItalianFormattedAmount(String input) { + // Regular expression to match Italian-style amounts (e.g., 41.003,00 or 123,45) + if (!input.contains(",")) { + return false; // Return false if there is no comma + } + String sanitizedInput = input.replace(",", ""); + + // Step 2: Check if the remaining string is a whole number + String wholeNumberPattern = "^\\d+$"; // Regex to match whole numbers + + return sanitizedInput.matches(wholeNumberPattern); + } } From bf1c252c6e0b2bed1b5465a95ca2ffc84c31597a Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 28 Oct 2024 22:15:25 +0530 Subject: [PATCH 4/5] Updated code for pdf updation --- .../gepafin/tendermanagement/dao/PdfDao.java | 7 ++- .../gepafin/tendermanagement/util/Utils.java | 52 ++++++++++++++----- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 2cf1d32b..d2e29e84 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -278,7 +278,7 @@ public class PdfDao { fieldValue1=Utils.formatDateString(String.valueOf(value)); } if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ - fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); valueCell.setPadding(5f); // Increase padding for better spacing @@ -362,7 +362,6 @@ public class PdfDao { PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell.setFixedHeight(rowHeight); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header table.addCell(headerCell); // Add the header cell to the table @@ -378,7 +377,7 @@ public class PdfDao { Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present String fieldValue= (String) value; if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ - fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell @@ -498,7 +497,7 @@ public class PdfDao { } fieldValue = matchedLabels; } - + // Further processing of field value (e.g., finding labels in options) fieldValue = findLabelInOptions(content.getSettings(), fieldValue); } else { diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 53050f6c..cb8aa153 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -398,24 +398,50 @@ public class Utils { return null; } } - public static String convertItalianAmountToDouble(String amount) throws NumberFormatException { - // Step 1: Remove the thousands separator and replace the decimal separator - String normalizedAmount = amount.replace(".", "").replace(",", "."); +// public static String convertItalianAmountToDouble(String amount) throws NumberFormatException { +// // Step 1: Remove the thousands separator and replace the decimal separator +// String normalizedAmount = amount.replace(".", "").replace(",", "."); +// +// // Step 2: Parse the string to a double +// double value = Double.parseDouble(normalizedAmount); +// if (value <= 0) { +// return amount; +// } +// // Step 3: Format the double to 2 decimal places +// DecimalFormat decimalFormat = new DecimalFormat("#.00"); +// return decimalFormat.format(value); // Return formatted string +// } - // Step 2: Parse the string to a double - double value = Double.parseDouble(normalizedAmount); - if (value <= 0) { - return amount; + public static String convertToItalianFormat(String amount) { + try { + // Step 1: Sanitize and standardize the input + String sanitizedAmount = amount.trim(); + if (sanitizedAmount.matches("\\d")) { + return sanitizedAmount; + } + // Step 2: Handle Italian-style input (e.g., "37.192,00") + if (sanitizedAmount.contains(".") && sanitizedAmount.contains(",")) { + // Assume the period is a thousand separator and the comma is a decimal separator + sanitizedAmount = sanitizedAmount.replace(".", "").replace(",", "."); + } else if (sanitizedAmount.contains(",")) { + // If the input contains only a comma, treat it as a decimal separator + sanitizedAmount = sanitizedAmount.replace(",", "."); + } + // Step 3: Parse the cleaned-up string into a double + double parsedAmount = Double.parseDouble(sanitizedAmount); + // Step 4: Format the parsed amount to Italian format + NumberFormat italianFormat = NumberFormat.getInstance(Locale.ITALY); + italianFormat.setMinimumFractionDigits(2); + italianFormat.setMaximumFractionDigits(2); + + return italianFormat.format(parsedAmount); + } catch (NumberFormatException e) { + // In case of any issues with parsing, return a default or error message + return "Invalid amount format"; } - // Step 3: Format the double to 2 decimal places - DecimalFormat decimalFormat = new DecimalFormat("#.00"); - return decimalFormat.format(value); // Return formatted string } public static boolean isItalianFormattedAmount(String input) { // Regular expression to match Italian-style amounts (e.g., 41.003,00 or 123,45) - if (!input.contains(",")) { - return false; // Return false if there is no comma - } String sanitizedInput = input.replace(",", ""); // Step 2: Check if the remaining string is a whole number From efad8596dc1f549ba8d4b986221f453684c818df Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 28 Oct 2024 23:21:16 +0530 Subject: [PATCH 5/5] updated code for html content for pdf --- .../gepafin/tendermanagement/dao/PdfDao.java | 14 ++-- .../tendermanagement/util/PdfUtils.java | 66 +++++++++++++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index d2e29e84..766492ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.util.PdfUtils; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.apache.commons.lang3.StringUtils; @@ -207,7 +208,9 @@ public class PdfDao { // Loop through the list of strings and create a cell for each string for (String item : values) { - PdfPCell valueCell = new PdfPCell(new Phrase(item, valueFont)); + +// PdfPCell valueCell = new PdfPCell(new Phrase(item, valueFont)); + PdfPCell valueCell = PdfUtils.htmlToPdfPCell(item, valueFont); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell @@ -280,7 +283,8 @@ public class PdfDao { if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } - PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); +// PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); + PdfPCell valueCell = PdfUtils.htmlToPdfPCell(fieldValue1, valueFont); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell @@ -359,7 +363,8 @@ public class PdfDao { if (!headersAdded) { for (String key : orderedKeys) { String headerValue = stateFieldMap.get(key); // Header text - PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header +// PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header + PdfPCell headerCell = PdfUtils.htmlToPdfPCell(headerValue, null); headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header @@ -379,7 +384,8 @@ public class PdfDao { if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } - PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); +// PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); + PdfPCell dataCell = PdfUtils.htmlToPdfPCell(value != null ? value.toString() : "", textFont); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell dataCell.setMinimumHeight(rowHeight); dataCell.setPadding(7f); diff --git a/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java b/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java new file mode 100644 index 00000000..cfa32b03 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java @@ -0,0 +1,66 @@ +package net.gepafin.tendermanagement.util; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Element; +import com.itextpdf.text.Font; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.html.simpleparser.HTMLWorker; +import com.itextpdf.text.html.simpleparser.StyleSheet; +import com.itextpdf.text.Paragraph; + +import java.io.StringReader; +import java.util.List; + +import org.springframework.stereotype.Component; + +@Component +public class PdfUtils { + + + + public static PdfPCell htmlToPdfPCell(String htmlContent, Font font) { + PdfPCell cell = new PdfPCell(); + + // Check if the content is not null or empty + if (htmlContent != null && !htmlContent.trim().isEmpty()) { + // Wrap plain text in a paragraph tag if it doesn't contain any HTML + // Check if the string does not contain any '<' or '>' characters + if (!htmlContent.contains("<") || !htmlContent.contains(">")) { + htmlContent = "

" + htmlContent + "

"; // Wrap in paragraph tags + } + + try { + // Create a list to hold the elements parsed from the HTML + List elements = HTMLWorker.parseToList(new StringReader(htmlContent), new StyleSheet()); + + // Create a paragraph to hold the formatted text + Paragraph paragraph = new Paragraph(); + + // Add each element to the paragraph + for (Element element : elements) { + // If the element is a Paragraph, set the font directly + if (element instanceof Paragraph) { + ((Paragraph) element).setFont(font); + } + // If the element is a Chunk, set the font directly + else if (element instanceof com.itextpdf.text.Chunk) { + ((com.itextpdf.text.Chunk) element).setFont(font); + } + // Add the element to the paragraph + paragraph.add(element); + } + + // Add the paragraph to the cell + cell.addElement(paragraph); + + } catch (Exception e) { + e.printStackTrace(); // Log the exception for debugging + } + } + + return cell; + } + +} + + +