From d04ea21febfa40c9d63d719d862b397efc8aa69c Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Tue, 12 Dec 2023 09:38:13 +0800 Subject: [PATCH] BAEL-7278 first draft --- pdf-2/pom.xml | 18 ++ .../exceltopdf/ExcelToPDFConverter.java | 167 ++++++++++++++++++ pdf-2/src/main/resources/excelsample.xlsx | Bin 0 -> 9352 bytes pdf-2/src/main/resources/pdfsample.pdf | Bin 0 -> 1591 bytes 4 files changed, 185 insertions(+) create mode 100644 pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java create mode 100644 pdf-2/src/main/resources/excelsample.xlsx create mode 100644 pdf-2/src/main/resources/pdfsample.pdf diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml index ccbb5c9693..1a4bc226fd 100644 --- a/pdf-2/pom.xml +++ b/pdf-2/pom.xml @@ -35,6 +35,21 @@ pdfbox ${pdfbox.version} + + org.apache.poi + poi-ooxml + ${poi-ooxml.version} + + + org.apache.logging.log4j + log4j-api + ${log4j-api.version} + + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + @@ -52,6 +67,9 @@ 7.2.3 3.0.1 3.0.0-RC1 + 5.2.5 + 2.20.0 + 2.20.0 \ No newline at end of file diff --git a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java new file mode 100644 index 0000000000..38318616aa --- /dev/null +++ b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java @@ -0,0 +1,167 @@ +package com.baeldung.exceltopdf; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Iterator; + +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFColor; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Cell; +import com.itextpdf.text.BaseColor; +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.Phrase; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; + +public class ExcelToPDFConverter { + + public static XSSFWorkbook readExcelFile(String excelFilePath) throws IOException { + FileInputStream inputStream = new FileInputStream(excelFilePath); + XSSFWorkbook workbook = new XSSFWorkbook(inputStream); + inputStream.close(); + return workbook; + } + private static Document createPDFDocument(String pdfFilePath) throws IOException, DocumentException { + Document document = new Document(); + PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath)); + document.open(); + return document; + } + public static void convertExcelToPDF(String excelFilePath, String pdfFilePath) throws IOException, DocumentException { + XSSFWorkbook workbook = readExcelFile(excelFilePath); + Document document = createPDFDocument(pdfFilePath); + + for (int i = 0; i < workbook.getNumberOfSheets(); i++) { + XSSFSheet worksheet = workbook.getSheetAt(i); + + // Add header with sheet name as title + Paragraph title = new Paragraph(worksheet.getSheetName(), new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD)); + title.setAlignment(Element.ALIGN_CENTER); + document.add(title); + + createAndAddTable(worksheet, document); + // Add a new page for each sheet (except the last one) + if (i < workbook.getNumberOfSheets() - 1) { + document.newPage(); + } + } + + document.close(); + workbook.close(); + } + + private static void createAndAddTable(XSSFSheet worksheet, Document document) throws DocumentException, IOException { + PdfPTable table = new PdfPTable(worksheet.getRow(0).getPhysicalNumberOfCells()); + table.setWidthPercentage(100); + addTableHeader(worksheet, table); + addTableData(worksheet, table); + document.add(table); + } + + private static void addTableHeader(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException { + Row headerRow = worksheet.getRow(0); + for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) { + Cell cell = headerRow.getCell(i); + String headerText = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : String.valueOf(cell.getNumericCellValue()); + PdfPCell headerCell = new PdfPCell(new Phrase(headerText, getCellStyle(cell))); + headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(headerCell); + } + } + + private static void addTableData(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException { + Iterator rowIterator = worksheet.iterator(); + while (rowIterator.hasNext()) { + Row row = rowIterator.next(); + if (row.getRowNum() == 0) { + continue; + } + for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) { + Cell cell = row.getCell(i); + String cellValue; + if (cell != null) { + if (cell.getCellType() == CellType.STRING) { + cellValue = cell.getStringCellValue(); + } else if (cell.getCellType() == CellType.NUMERIC) { + cellValue = String.valueOf(cell.getNumericCellValue()); + } else { + cellValue = ""; + } + } else { + cellValue = ""; + } + PdfPCell cellPdf = new PdfPCell(new Phrase(cellValue, getCellStyle(cell))); + // Set background color + short bgColorIndex = cell.getCellStyle() + .getFillForegroundColor(); + if (bgColorIndex != IndexedColors.AUTOMATIC.getIndex()) { + XSSFColor bgColor = (XSSFColor) cell.getCellStyle() + .getFillForegroundColorColor(); + if (bgColor != null) { + byte[] rgb = bgColor.getRGB(); + if (rgb != null && rgb.length == 3) { + cellPdf.setBackgroundColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); + } + } + } + + cellPdf.setHorizontalAlignment(Element.ALIGN_CENTER); + table.addCell(cellPdf); + } + } + } + + private static Font getCellStyle(Cell cell) throws DocumentException, IOException { + Font font = new Font(Font.FontFamily.HELVETICA, 12); + CellStyle cellStyle = cell.getCellStyle(); + org.apache.poi.ss.usermodel.Font cellFont = cell.getSheet().getWorkbook().getFontAt(cellStyle.getFontIndexAsInt()); + + short fontColorIndex = cellFont.getColor(); + if (fontColorIndex != IndexedColors.AUTOMATIC.getIndex() && cellFont instanceof XSSFFont) { + XSSFColor fontColor = ((XSSFFont) cellFont).getXSSFColor(); + if (fontColor != null) { + byte[] rgb = fontColor.getRGB(); + if (rgb != null && rgb.length == 3) { + font.setColor(new BaseColor(rgb[0] & 0xFF, rgb[1] & 0xFF, rgb[2] & 0xFF)); + } + } + } + if (cellFont.getItalic()) { + font.setStyle(Font.ITALIC); + } + + if (cellFont.getStrikeout()) { + font.setStyle(Font.STRIKETHRU); + } + + if (cellFont.getUnderline() == 1) { + font.setStyle(Font.UNDERLINE); + } + + short fontSize = cellFont.getFontHeightInPoints(); + font.setSize(fontSize); + + if (cellFont.getBold()) { + font.setStyle(Font.BOLD); + } + return font; + } + + public static void main(String[] args) throws DocumentException, IOException { + String excelFilePath = "src/main/resources/excelsample.xlsx"; + String pdfFilePath = "src/main/resources/pdfsample.pdf"; + convertExcelToPDF(excelFilePath, pdfFilePath); + } +} diff --git a/pdf-2/src/main/resources/excelsample.xlsx b/pdf-2/src/main/resources/excelsample.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fb83598a71b1b53eed3538c0f6182cd1aca76f48 GIT binary patch literal 9352 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 literal 0 HcmV?d00001