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 0000000000..fb83598a71 Binary files /dev/null and b/pdf-2/src/main/resources/excelsample.xlsx differ diff --git a/pdf-2/src/main/resources/pdfsample.pdf b/pdf-2/src/main/resources/pdfsample.pdf new file mode 100644 index 0000000000..f646f54db7 Binary files /dev/null and b/pdf-2/src/main/resources/pdfsample.pdf differ