From d04ea21febfa40c9d63d719d862b397efc8aa69c Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Tue, 12 Dec 2023 09:38:13 +0800 Subject: [PATCH 1/3] 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 zcmeHN1y>x|)@@vZySsak06~I=&}bT$;O_3$5Zv9J0Kp0F8Z;0zI5ZYWu;30~XJ+1- znaq5@;Jxa#>aJQ{=d7x8&%XQIeM(sl4jvDH2tWn^0Mr1Z!)yyZ7yuv+9ss}vAj9fN z+S|F9+PUbfdODaozv1w(wV^72hh@qGz(Vi;-|=4@fr_M2#Xc@9>C0Dll3VP+Xak`|f`_`* z^ho(RKMwBGcM%dNIB9Dg<>8TvJtfxHk2cE$q&YVAfq13X#eo$h7Wf3B0h`&2gX-98 z11)G}+NFX+OFa-p^;K+vk@wSBo0GURR+h}(dZ(N0vha~K-pd4Tdhe8}HC336KrK!; zsdAmpOwByA2F9?fTp@8C7%Sszh;5zx6bif~AKpitm1z&eS+jQe==ykdF~vllDc`g{ z!?)09*U1qBQwL7X1C*^J>j^5k?LPbVzrZh)AN|owwQ@_pj!V|RMrzWU6B}ouNJL}H z26;D_Bc&wB&l2cYGBn&Q(5-Y}Oy*-(Jc+agFMaihcY*z_^|V_8Yq*=5&NuV`GW1Qz zdw*hEC+P4v<(ohE10n$M_y`A3{u?YC)VOHRpt&XwMcor9EcKmCZJaqdexCma$Nyps z{^ivx5)_pBxX?n5UfqQbUCyq=VM)lji@$24R`m;zUB+yPE~Fz}>0%_qQY8t3lkxBH zyBk?r5sv;oM18TrTM>zaCq&!mUKx^l=o|FI4#q*-)Qflc=d!2wK({W?B_@6D^qxD+>H*Zz;D+BABny50E&9)y~B$qA_a|1moCr^n{WQEZ^0h7Bk)T~!M(ig}l z?RRDhp5xX%g*Ry1WaV-cWqcw&Aud#*Lo$^9%n8oh1?g>SN9!&Uwc%5eBC--F=*fC*^zg9*I@nlgV)mI}2=yFvjxUwz9*m}AAB80r9^43?PA z`|L{Ybhpd*PCY2Rm&5Pzz=w8gGYBgd5m5ieL>*WuxpWv2 z!B;PYYyG8n1T+-FLNt=RQb}KEs`0cqV{ss6a{+z3vPBYko0-U{WeY)0dXm3FO$ck) zsw}`yFqO2y!ucKMq)2jTfDYB_qvuXP&3nf$-89$zAljqGMJRU5cx(!i;(&NRD$B zQrCQeBx5C9it}D}qh}KC$m!KBWxJxc>iHK(SE<^P@ExeCJAE7(%Ia0NnQuc`s7}n8 ztBJtsRhjM-n7@8WLa#H`ss4oP1Q`>YLujBO6ZmvP`{@GcqgjC(q_3k&|9m+>q#Ryg zIjzp$i-VYq?FXSna0&sn@2*{GS(M(FcuW5SvGxv6JMh~Ym0C+{7^F{roAO>hXb(aB zmiY)vc^-pSmyh1(Vu~S!k9JACkVjK51imYY+&miPODBH=PS+8}OIvD5mq%^|v!{wa zMhZCmwP7+f_(F-@BMuqcq8N98O?#@BUWU{b)n&f5d@d$9rTddpd@C`mLnz*Qol_o; z7nE|BYkZrF{Op?g)=gQqtr|MJ`L!LJw#?6{dKigRMPiK!Z@HGy%H7*l)l7^w68n}Z zqpDf*qI@cH;U2B6;;*@>1u#HK+PG2-1d6f-*I*g8HAf!qu@hmpY;eMT$h1QcY*Rk} zV$Zq%NP_HUg!@QyKC2m3bHll`5ZyAbNoiAJDm@A6a~iyQj_x0=q_DnQ5HXpW%GU2Q z6G3wVT+;pFC5mEfjG4^@;3-YfbOY;`psbc@wlN%yIbauB@8c$rjEyqJo_Op-0f?QB zonn23*L?J?n?Y4J734O>X5$8h2t|iZrbSvAqA3e&={oJRq4@gw=<;21MM~ElBzSA7 zZ#t@s0;62Cq)%YRwlh~mp2HpYHlaf(bX|DXbM3`_T{mZ5rx_#SP7@>IxTrp7l~Pp4 z2*IWM_4}S<*MxzR!NF6{yGxo|>*d}DLy3cYNGrLGRqV5tE5d(6t0qRqpcoXbvrhm3 z^xx6y?BZ!->ilzI?^oA}%@n}%gJLyk+dV`sfB{?CmLW*>eVewW**jl818#L+@qzS& zs*A46`M9^Qg*xP?nK2D0W4cZkb~X|_DBxu6lDp|`+}dz-c`kxq)CD3>{!yZ)jRmLDaeAw$ zGIiz_5Anl;f6s}W=pm&Ud7~o+KY4VKt-(5p-N!PJE-1hjCDq|qmk3OZfSaX`l8p}G zn#CqLn+!|zGm@#%F4t@Lit6Ay+gMSYJN4$8HFw6GPRx%2ly)V4W^okc#{k;5zUi*G zb%<{OW>CypaVo_0INR0jxq~`V-`yinP>Epgjbxb!i z{}i0Hs!{KrLDtK3eSy%iQBlk0Hh1dcE~BTw%|QBmf?@DI?k!K%vs!Y_OYngjkl(?T z>`6=|dtvF2fGzslShF_oTfVX&_jgg?6KxZ8S|NIrriP7XBNBj(f?!v}+-TPU?S8(r z6DQDc6(G`FYLhI80iNR}J01xCm|GY<&ofW2{NSg_ThDk`q8{3PbXufXj{WVqUrn$l zON)}Bv^g8mIR6#=m$zsaU4iY*RHIjcn!^aSQ%{UKybx0&#ll*&3|^q_sRYn?Z-2ew zTzcx*++IQ@Ih*6yw`DFt!j-w6MOSr0x^&-sCa4A0wX~4CSYFQd`+6n(koe4old7Jf zvTGrT8-r$W=U69m)X-`ao&3`hg`LM$L5G>(!;#skRYM0etv#_#ie7tOcoXoM4rh2Z z|B`JBY60ZtQ48||jy%npnA*0_W5s!Q`mBB-{O&+2Wplx#=qQ4IBF9-@+VY1C4x(NQ zvIM8%@RUw*WIt;n*JAPUR|e)p;>)e{Y;8#B`uwTZ$?zhVxL~4;KDh{QYG9(lO|Zh1 zjMCMPU;7o5`u<6bJ%m`Dibw#!0M$<&;5TA)u`snY<^1jZ^e5oku@~#zgFkrPG~2^g{2of2Qd}BOO>z}NtzOaL+?0?MWL(z zMmfniHcwl*O_yl{)OJIUlzHeVDY?w?^E!1op6W>Rl1Y2gn~p1lCeUOU0CJq0#cGMxaC?Eh9L?^p3{1HuQ z0{KI8B$FVde~Eq?8OJ^Zhrys(l^GqVc2zA3eki7mXyoE9N`7Myu1N~I@G$BhmT$ac z&70+?;>;28e)#e2G_*^^|7`cVPya(p1B;v;61|Gb;cTq_`&*K91~b9VZkoP0|pT=PBOQHmvBTp}Y+`#~LE`=e^z_=q9W5R7qq z4D%wppG%@YK@5A>t@Lno2v$#r>U*zi%|Y)HndSgOyKtBFLM!EQ3tdcl^~+j>W#cF} zBKPNzvW(FmKOA!8R}xQK!rQ_p;;j!kfE9qt9iBXm4bVb#jpY%V`dPye(dJspwq*2&tuPN2r#gnmB+v>hj>sb*W6Iw&) zb8z{Ez26=fwcvQY4-%Am%17QAX|l!byHl zj9ZE~{m&BQoOY*LB8hn7Mcn42m4%%bqiIIivdTze47)KMC$DXfO7EZ~bP249G+h*KoNpKl=Mj2-`aXHFjY!2MYJkYQ zNz_?$!jNZlr)5%u#vqw|A6UUUG_H1@WdLKEP-gvw*(nv7)%5Z>$+pJa-Z9XFfGHe% zt>~IWY6bX4U^`3ID?0{50m28nO}Q00%{+&&%azd9CA$}mtYx0+MR4fz#(~w(zHZP! ze^un56Q0<|ikRx6>0%7)wRNDdVF)rR8sSP{82*EGI@!%pYOmeqp-ws+Mflhz;qD9HJ{g6?Rl4-L zm9fPNW}N0KgD;J3If<5i(~;o?BllwL1e&&_=}LE2g#5Xx2Ma! zsl}*;)QRVNG$yvSG!0`jn1MlMqF>1Fy1@#$iG`Ne`WknasBg{#v4wU z$L`AAFol@#L#R~JbKOM65yYqQY2Hcw?E38f$>_Y3WCgaY8Ua|M+M5|-tdyCKSS~_C z9^5^&mLV%duX7YB!Rsnj4i9A?*T^gA7RY)#D5GOL;GXaBV;5;^aJ1ruTr|5_JgdhZ5C*Kk7G&9ZuMj^l81n|&-8J2FyU{}W-u`prhC z?t+iw5jIu!ZNo^OmaUsruvvo$6MTna;l%!z=fQfFI!EYUD>aj3!aq7_(J>Zh?UeWU zQ5&3^bdas+P5lbBN|BO*LZwZl_j&hJti}f0%)Ta_fJ>{k#>an^GA@Sk80(;w?hpz9 zK=kLn)Y-z+)WwhQdIbuC0XIrZai3^Z;sg>k*SXMPRKo*D}rLwf3 zdcNWvK#j{h#YB!$Q|sILXpzO(uU_|^L8K|WW;8Ts$P!B z?FA#5`<3#=Cq>|qJc0oV4oTwV$fECe&kzl&bjMi=l4a)PlusMgt6pZ+VEpX(ijIj( zVdR}y&| zMcB@Q-pdxesOpLz_|Lo;**bd{UA~=BMMOQM%co3-Q-+SuP%_4Jg{6%5V)`;_DHL#_ zBsjL~-oHE5qOR$+Rh5!VpOlWPVw}nR-1>0M3^B3$+W+B>bf%j<@1>aRQceq~?E=EX zas7&S1)MU}j4z`p{>J=FMauqRsm{XA&%IzY4Du|(OJjEF8q!m2eZrZs^{E>;+a+bl zx&<+1$ukLE^iwPOOx2kDah51?(oIEM_lto*)Or703(f zv}KIIO#sTuH`1pbZ!jKy%OGfyJU%8Ry|D}8!g^aB=mY5f$|*GuvgHV50_9AxP%W-@ zwymOO1_M!);zfu%(^rZz?WgO{`nb~$kB^gu>*HwBUxePG(n#!XX>37}P5k@R__D?4 zT~AP*y+~?~18h_Y$cd;%AseR1iF9Jz>?5iT$GG2%MeBYbT|jr2kB`5_^8@oMd8Km& zHsI$^tm;Fu3aqti+!H(+Af^%d&jGb^Cr`Qyih-!I*Yxz)EnIppt&D(H*kR@sMR6&) z`mme3OAEWHJA|f$=0(LR^FPJLf7aPH0xchrpnow#HA}qTf$nT!=wxc5;^Jg!Xa3vH z)@E`E*e8aC2=VT5C%Ra*0X2ltF>7OEHUw6#Vh+!3^HJf)j zuJpd5*-Kgn;%RXNG(WA}ctfw()Wk>#n!bR7hq}{LBYgaJ9R!?n zDVj7jqly`Bt0nQZIZ$lv!D+0bJ!ws?6V8>3jzHjLsEKvnfrTyqEH?V0RIcRv)SPu< z^3>eB<)*GP8=Vgh{)so-0`@LZUrL$Ln+A+?H}IQiE4Ydt#6Hn3r_X4J3wp?%#}i%1 zepea-d(E3TL{pkzemR)9h=9-sDNJic$&l}BY}H0s<|v$g_Z>;QO@8Ha7Z0}_HN1O708ZR_-Q3*;vHQtX$fou6&s|;f| zu@i3Mrb-;h>Uj3l=_~BdEMFC@_<2veHL1@9rHXy+xZWO%vuV+AJwy4T7Crtt0}BsK z5M6QhOy=`8OQ(4Jsji$JKZ(-}SaNjZjtw^?e4w|`7EMzh90@Bc#2_Ezwn`dOiz}qO zOy83q)NEO?A*y>oK+3UtO~6IJh06Lv*Xgq(X4IIJ6jBi$?v&5G7vL2*9}!_uD2svl z;litC7!|ln zqi88#B_~0wK-}T8xAri(CPVh*dmMzaKPlyHO{9K5Z637I(8SdFubF4^#d|Crnt2RR ze#ZK1<{3IT{4epKA^YRVN>H$0`q_|zyP$+$Ar)LvMgvzAyb?N_D1b?DGgmA&&Tpg( ztBBv9Q)--?S#Vp7rsUKUEhw$Ve8cJ`zZJ;2?ezK;cr|3?+Lt-keT}nIRvfJ}@R;Paj#T*9jpa~2Wn?xVuz*o5SR}&oj?C4^m*QqH&2^XN%GfTe0BJ}6o8VzD zJ6EUuMSE!zI$gzydDb(3mfhR-nHda*J;XbTa`&;d=ye*s;yV7(a_QrDL;AwymgkO; zul&%7`JI7aVA-K;^Y7n${Ac?9GycmLAj)!ockuV_^nVP0j;T<7~9wjQ`Y_e>MG8CHvD98S7s)vtJ$j zTIc`iAQY;A|MB4esQQ2P@@oW?{4)auz77S~FqVgWfGI>6vp+t%Gx3UT?0{)qQvvg4j-rXM*bRR`p?bx)X zh5wS!o{7^w=)66(S?r@@RFnCo-#<#v*%lUw3aA`%n8VEebr1jEa|^?>XFRSd+InP8 zIqPJZce2aE1S<<0Z^_Hdzc2et`jdonXZ^many7O-kAxcM^NVj(RDA!;X=2sSD`)s7 zPj*bT>{$8ym95^wNqeH7th>1(_15$=!9jnN5AJ+;a^|EDFO&Z8Oh4;oAj>&f`=jjk zZ7*(4aJjlEeV+N$6?-#d&2%s8-#Yq8(oXmEvedec8C}axdWI;^T=v93zAJP0-bae( z-9F^lzN(Eq)q4HS>8oD^>pY^Z7cH;PxwUEg?O@r$H#YK|!PeMM#otgH3e%a0q zm-Y5pUeb$Pn?HT}t)ubNRlohLy?l0=?j40Y|Mt9}^>Jh0$)!C*3{Be!NSBSRzE1UIKQ+gIkgy= z#@+JsNIau5m4I9U5;4?wN-RzV3wxyIl%#d6yXFCNQf6Mdet2e{V_tD4 zjBjTLGaTd=k_{)qT#z4-%>{*4G0?xIK>r!)duOH;M}q=1C>G%qGc+yEi6x0S`RU+* zE=CU&bA;l6qWqN7=KI#)d|QMg|t97Di^;1{UfD z2I`vnzWFJ56(BrQQIwj-WuRce1#|)wD43a=8k;JlDZs=mjDevK0t$I>F-s$0u%L+< z7-EPS8W;kT44OJ~Lts)t6*Dw21I7fJn4y6sLad}HF*7H%2vi&gXI7;uSm+1k=a(pe zA|puOGcPS)0Tk3gri((fje%*BaY}M>s->xgMXGU1s##jHX_BRZL6W7hrE!XJnjK*k hpa@q5M~5yfqPU7n5{pW}A!cY~X33?h>gw;t1ps{5SL*-( literal 0 HcmV?d00001 From 29c0b906b5845bdd935ac20c073b88a8f590c51c Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Wed, 13 Dec 2023 10:33:56 +0800 Subject: [PATCH 2/3] BAEL-7278 Modify the code based on the feedback --- .../exceltopdf/ExcelToPDFConverter.java | 140 ++++++++++++++---- pdf-2/src/main/resources/excelsample.xlsx | Bin 9352 -> 9591 bytes pdf-2/src/main/resources/pdfsample.pdf | Bin 1591 -> 1713 bytes 3 files changed, 111 insertions(+), 29 deletions(-) diff --git a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java index 38318616aa..b4013f0d49 100644 --- a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java +++ b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java @@ -3,10 +3,13 @@ package com.baeldung.exceltopdf; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.math.BigDecimal; import java.util.Iterator; import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFSheet; @@ -14,31 +17,40 @@ 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.FontFactory; 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; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + public class ExcelToPDFConverter { + private static final Logger logger = LogManager.getLogger(ExcelToPDFConverter.class); + 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); @@ -48,6 +60,7 @@ public class ExcelToPDFConverter { // Add header with sheet name as title Paragraph title = new Paragraph(worksheet.getSheetName(), new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD)); + title.setSpacingAfter(20f); title.setAlignment(Element.ALIGN_CENTER); document.add(title); @@ -63,7 +76,8 @@ public class ExcelToPDFConverter { } private static void createAndAddTable(XSSFSheet worksheet, Document document) throws DocumentException, IOException { - PdfPTable table = new PdfPTable(worksheet.getRow(0).getPhysicalNumberOfCells()); + PdfPTable table = new PdfPTable(worksheet.getRow(0) + .getPhysicalNumberOfCells()); table.setWidthPercentage(100); addTableHeader(worksheet, table); addTableData(worksheet, table); @@ -74,9 +88,27 @@ public class ExcelToPDFConverter { 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()); + + String headerText; + switch (cell.getCellType()) { + case STRING: + headerText = cell.getStringCellValue(); + break; + case NUMERIC: + headerText = String.valueOf(BigDecimal.valueOf(cell.getNumericCellValue())); + break; + case BLANK: + headerText = ""; // or null + break; + default: + logger.warn("Unsupported cell type: {}", cell.getCellType()); + headerText = ""; // or throw an exception + break; + } + PdfPCell headerCell = new PdfPCell(new Phrase(headerText, getCellStyle(cell))); - headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); + setBackgroundColor(cell, headerCell); + setCellAlignment(cell, headerCell); table.addCell(headerCell); } } @@ -91,42 +123,81 @@ public class ExcelToPDFConverter { 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 = ""; - } + if (cell.getCellType() == CellType.STRING) { + cellValue = cell.getStringCellValue(); + } else if (cell.getCellType() == CellType.NUMERIC) { + cellValue = String.valueOf(cell.getNumericCellValue()); } 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); + setBackgroundColor(cell, cellPdf); + setCellAlignment(cell, cellPdf); table.addCell(cellPdf); } } } - private static Font getCellStyle(Cell cell) throws DocumentException, IOException { - Font font = new Font(Font.FontFamily.HELVETICA, 12); + private static void setBackgroundColor(Cell cell, PdfPCell cellPdf) { + // 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)); + } + } + } + } + + private static void setCellAlignment(Cell cell, PdfPCell cellPdf) { CellStyle cellStyle = cell.getCellStyle(); - org.apache.poi.ss.usermodel.Font cellFont = cell.getSheet().getWorkbook().getFontAt(cellStyle.getFontIndexAsInt()); + + HorizontalAlignment horizontalAlignment = cellStyle.getAlignment(); + VerticalAlignment verticalAlignment = cellStyle.getVerticalAlignment(); + + switch (horizontalAlignment) { + case LEFT: + cellPdf.setHorizontalAlignment(Element.ALIGN_LEFT); + break; + case CENTER: + cellPdf.setHorizontalAlignment(Element.ALIGN_CENTER); + break; + case JUSTIFY: + case FILL: + cellPdf.setVerticalAlignment(Element.ALIGN_JUSTIFIED); + break; + case RIGHT: + cellPdf.setHorizontalAlignment(Element.ALIGN_RIGHT); + break; + } + + switch (verticalAlignment) { + case TOP: + cellPdf.setVerticalAlignment(Element.ALIGN_TOP); + break; + case CENTER: + cellPdf.setVerticalAlignment(Element.ALIGN_MIDDLE); + break; + case JUSTIFY: + cellPdf.setVerticalAlignment(Element.ALIGN_JUSTIFIED); + break; + case BOTTOM: + cellPdf.setVerticalAlignment(Element.ALIGN_BOTTOM); + break; + } + } + + private static Font getCellStyle(Cell cell) throws DocumentException, IOException { + Font font = new Font(); + 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) { @@ -138,6 +209,7 @@ public class ExcelToPDFConverter { } } } + if (cellFont.getItalic()) { font.setStyle(Font.ITALIC); } @@ -156,6 +228,16 @@ public class ExcelToPDFConverter { if (cellFont.getBold()) { font.setStyle(Font.BOLD); } + + String fontName = cellFont.getFontName(); + if (FontFactory.isRegistered(fontName)) { + font.setFamily(fontName); // Use extracted font family if supported by iText + } else { + logger.warn("Unsupported font type: {}", fontName); + // - Use a fallback font (e.g., Helvetica) + font.setFamily("Helvetica"); + } + return font; } diff --git a/pdf-2/src/main/resources/excelsample.xlsx b/pdf-2/src/main/resources/excelsample.xlsx index fb83598a71b1b53eed3538c0f6182cd1aca76f48..771d312ae0146760a9f537e3eb71272b9df79a07 100644 GIT binary patch delta 3732 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 delta 3489 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 diff --git a/pdf-2/src/main/resources/pdfsample.pdf b/pdf-2/src/main/resources/pdfsample.pdf index f646f54db7a6a37969462df2da737e4eb4e949c4..320931762ae109d8c8a23e77131b969818f8a054 100644 GIT binary patch delta 1023 zcmdnavypd#V!gSkp}t#YPDyH!zFSUWNvca~a(+sxon3KBQEFl?SH+yE;irRc8;IQf zt^ID2UO?&BEz=z4PYF_(cdq1RCeMDRhl zx;A}Xn-5DkWvcNdc|47%6>!cx8qy}%ruX2^?~gY(oBlb?TRv&Qp9^j#_C11Uz2z?M z*>iH5$~&Pa>Gk14jcT4Ov+7j@GbXtd@=BP4(_$5_-bo(o^0VAetp61Y zR0CGBz*FexSKqC=J6(V*uvV48nEO}WPiRtM@}0zC;;D2&rSs9RWj~S<(kg?2W5x?vG z$)aC8;%{daI9SvlEA3p*yZUp?S=P;}uk!*Qfk7h4*dCC7b(ZAkfnRoSu1&cPY z9}hVH=4be{qxbU<-Ojd^nbDkk>EI%#=T}!fOp`lj`@gIE-^AF-FXJwzBvqVDne}&X z?7H2SJ`!`b)tjgL-OJw9b5pp8HS1u4iuk6==7VlFsLteE)l`^<5Ej(Je76B_{f0YGu6o7V?Lkt%FT`^HwG{CJkdl z17jmoOKk%Sbpr!+O?}_|6c=Cy(QvUcGB7eWG%|!LnEaT(h8AWRVnB-~PhmB8N;66|GE6csPf0Z~F|#l=G&4&w kPcunLv$QlaNU}&Yva=ziVlpqA0++F+A(yJEtG^o;0Fu|Xq5uE@ delta 879 zcmdnUyPao(V!fG>rM_EcPDyH!zFSUWNvca~a(+sxon3KBQEFl?SH+y(u+u@e9R&8g z)_&%}H}B1x>VAiLEfW}4-3i@j;P*#^Wt~X<{7COIo^NX&ck6upwxueq+MEAsWUM5A zVC9PAqOSd#2RzzqzJFt8bY1a&)#UuUJKjDh`t^h5{%lX~FU#uxh4!{R)zS|$P}=+N z`@VJSR=0aC{C3Z{>l&NhdV?P?cuOXGEpOm!;&Nz{x4s~?Yum2q&n7Vi8~e|ce^B2a zop5PGUrk)Ob;6U{I*muoJuK0(f#M%@a_@?Dw=YqxnK11^@0OPI%(%G)?;oY- zYzvD-1yl|>%wcB#x`%)7xrO1`GagqJZ9OuloOQCyJK1Gnf|Z4hx8!B!-P zvwmMyP1L!aM?#JB`NcOXD!zZ_G_mUEl{0*kCp)HEcC38<%2sb-{iHq7PuAVska}zS znc$#5$_IBoJUMgHhnGozc&4BAGLYq*to>1T`?eQ1C%9bQls?aV>WaOYv1YoL^=}=0 zBx$F6dRb~+$BeFJCp|-yXD)kUAm5d_d+#H~^KKtjhMwt`CzcK9#I@VgDBH6Z^W8?|mv~>b286EAFf|qi(%a ziR*vG4$jJl`|Il_+uJ1BMYYRqIJ4)HjM}Exvm@4UPd*09bxUui#(w?JtGyb!7zwvb1tk2BG#BO9@VQOJyHra+%3eJvYH50cm zHc~JE0fjsTE-=Huz|zQc@+wwUdjmsb3^{W{Lv%4i12Yp0F+&5($$V_)P6nn)#wp3k xsg|Y|7OBQ5sb*=(rb(6t21%C2mc}W@X?8Y*R7`GXQ{XZ(v*c1$b@g}S0s!cQhMoWb From 1d9a0246fe93b3cf579d3cd99e4d7f152505168c Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Wed, 13 Dec 2023 17:46:25 +0800 Subject: [PATCH 3/3] BAEL-7278 create getCellText method to reduce duplicated code. --- .../exceltopdf/ExcelToPDFConverter.java | 45 ++++++++----------- pdf-2/src/main/resources/pdfsample.pdf | 4 +- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java index b4013f0d49..97d7b36bd6 100644 --- a/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java +++ b/pdf-2/src/main/java/com/baeldung/exceltopdf/ExcelToPDFConverter.java @@ -88,24 +88,7 @@ public class ExcelToPDFConverter { Row headerRow = worksheet.getRow(0); for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) { Cell cell = headerRow.getCell(i); - - String headerText; - switch (cell.getCellType()) { - case STRING: - headerText = cell.getStringCellValue(); - break; - case NUMERIC: - headerText = String.valueOf(BigDecimal.valueOf(cell.getNumericCellValue())); - break; - case BLANK: - headerText = ""; // or null - break; - default: - logger.warn("Unsupported cell type: {}", cell.getCellType()); - headerText = ""; // or throw an exception - break; - } - + String headerText = getCellText(cell); PdfPCell headerCell = new PdfPCell(new Phrase(headerText, getCellStyle(cell))); setBackgroundColor(cell, headerCell); setCellAlignment(cell, headerCell); @@ -113,6 +96,23 @@ public class ExcelToPDFConverter { } } + public static String getCellText(Cell cell) { + String cellValue; + switch (cell.getCellType()) { + case STRING: + cellValue = cell.getStringCellValue(); + break; + case NUMERIC: + cellValue = String.valueOf(BigDecimal.valueOf(cell.getNumericCellValue())); + break; + case BLANK: + default: + cellValue = ""; + break; + } + return cellValue; + } + private static void addTableData(XSSFSheet worksheet, PdfPTable table) throws DocumentException, IOException { Iterator rowIterator = worksheet.iterator(); while (rowIterator.hasNext()) { @@ -122,14 +122,7 @@ public class ExcelToPDFConverter { } for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) { Cell cell = row.getCell(i); - String cellValue; - if (cell.getCellType() == CellType.STRING) { - cellValue = cell.getStringCellValue(); - } else if (cell.getCellType() == CellType.NUMERIC) { - cellValue = String.valueOf(cell.getNumericCellValue()); - } else { - cellValue = ""; - } + String cellValue = getCellText(cell); PdfPCell cellPdf = new PdfPCell(new Phrase(cellValue, getCellStyle(cell))); setBackgroundColor(cell, cellPdf); setCellAlignment(cell, cellPdf); diff --git a/pdf-2/src/main/resources/pdfsample.pdf b/pdf-2/src/main/resources/pdfsample.pdf index 320931762a..6a47504513 100644 --- a/pdf-2/src/main/resources/pdfsample.pdf +++ b/pdf-2/src/main/resources/pdfsample.pdf @@ -23,7 +23,7 @@ endobj <> endobj 7 0 obj -<> +<> endobj xref 0 8 @@ -36,7 +36,7 @@ xref 0000001186 00000 n 0000001231 00000 n trailer -<]>> +<<6a28b1036b62f3808f3bfb62a88a5239>]>> %iText-5.5.13.3 startxref 1391