Hi, it is hard to state much without a fully runnable test-case. It may be caused by some low-level change in JDK Font-Handling or some changes in the releases of POI.
We may be able to state more if you can produce a small self-sufficient test-case, i.e. including pictures/input-files, ... to let others analyze where the change happens. You can also help analysis greatly if you try a few of the many intermediate versions of POI to narrow down when things changed for you. Ideally attach it to a new issue at https://bz.apache.org/bugzilla/ so we can handle it via our usual flow. Thanks... Dominik. On Tue, Jan 24, 2023 at 10:56 AM Dhaval Kaushik <dkaus...@argusoft.in> wrote: > Hello team, > > We are getting the padding issue with setting the image for SXSSWorkbook > for 5.2.3 apache poi version and java 17 > > On using setDx1() and setDy1() to give padding, the changes are not seen > for SXSSFWorkbook. A similar code is working for XSSFWorkbook. We > are currently using java version 17 and the latest apache poi version > 5.2.3. The same issue is not seen in the versions of java 8 and 3.14 apache > poi. The below code is used to add padding in the cell for the setting > image in the workbook. > > anchor.setDx1(centerPosPx * Units.EMU_PER_PIXEL); > anchor.setDy1(centerPosPy * Units.EMU_PER_PIXEL); > > *Here I described my code to draw a logo image in a workbook using apache > poi 5.2.3, which works fine in the versions of java 8 and 3.14 apache poi.* > > int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG); > > CreationHelper helper = workbook.getCreationHelper(); > ClientAnchor anchor = helper.createClientAnchor(); > > anchor.setCol1(colStart); //Col Start > anchor.setRow1(rowStart); //Row Start > anchor.setCol2(colEnd); //Col End > anchor.setRow2(rowEnd); //Row End > > //create a picture anchored to Top-Left Corner > Drawing drawing = sheet.createDrawingPatriarch(); > Picture pict = drawing.createPicture(anchor, pictureIdx); > pict.resize(1); > > //get the picture width > int pictWidthPx = (int) (pict.getImageDimension().width * > reSizeRatio); > int pictHeightPx = (int) (pict.getImageDimension().height * > reSizeRatio); > > //get the cell width colStart to colEnd > float cellWidthPx = 0f; > for (int col = colStart; col <= (colEnd - 1); col++) { > cellWidthPx += sheet.getColumnWidthInPixels(col); > } > > //get the cell width colStart to colEnd > float cellHeightPx = 0f; > for (int row = rowStart; row <= (rowEnd - 1); row++) { > cellHeightPx += (sheet.getRow(row).getHeightInPoints() * > Units.EMU_PER_POINT) / Units.EMU_PER_PIXEL; > } > > //calculate the center position > int centerPosPx = Math.round(cellWidthPx / 2f - (float) > pictWidthPx / 2f); > int centerPosPy = Math.round(cellHeightPx / 2f - (float) > pictHeightPx / 2f); > if (centerPosPx < 0) { > centerPosPx = 0; > } > if (centerPosPy < 0) { > centerPosPy = 0; > } > > //determine the new first anchor column dependent of the center > position > //and the remaining pixels as Dx > int anchorCol1 = 0; > for (int col = colStart; col <= (colEnd - 1); col++) { > if (Math.round(sheet.getColumnWidthInPixels(col)) < > centerPosPx) { > centerPosPx -= > Math.round(sheet.getColumnWidthInPixels(col)); > anchorCol1 = col + 1; > } else { > break; > } > } > > //determine the new first anchor row dependent of the center > position > //and the remaining pixels as Dx > int anchorRow1 = 0; > for (int row = rowStart; row <= (rowEnd - 1); row++) { > float cellHeight = (sheet.getRow(row).getHeightInPoints() * > Units.EMU_PER_POINT) / Units.EMU_PER_PIXEL; > if (Math.round(cellHeight) < centerPosPy) { > centerPosPy -= Math.round(cellHeight); > anchorRow1 = row + 1; > } else { > break; > } > > } > > //set the new upper left anchor position > anchor.setCol1(anchorCol1); > anchor.setRow1(anchorRow1); > > //set the remaining pixels up to the center position as Dx in unit > EMU > anchor.setDx1(centerPosPx * Units.EMU_PER_PIXEL); > anchor.setDy1(centerPosPy * Units.EMU_PER_PIXEL); > > //resize the pictutre to original size again > //this will determine the new bottom rigth anchor position > anchor.setDx2(-anchor.getDx1()); > anchor.setDy2(-anchor.getDy1()); > pict.resize(); > > > *The output of SXSSWorkbook's Logo:* > [image: SXSSWorkbook_logo.png] > > *The output of XSSWorkbook's Logo:* > [image: XSSWorkbook_lgo.png] > > *Above mentioned logos have the same code but workbook types are different > only. Please suggest to me regarding SXSSFWorkbook's draw image issue.* > > Dhaval K > > Business Relationship Manager > > Argusoft > +91-7567877390 > dkaus...@argusoft.in > Book An Appointment <https://www.cloudhq.net/meeting/dkaus...@argusoft.in> > > > On Thu, Jan 5, 2023 at 2:35 PM Nick Burch <apa...@gagravarr.org> wrote: > >> On Thu, 5 Jan 2023, Dhaval Kaushik wrote: >> > Also, this error only comes on using tomcat and java 17 version. The >> > apache-poi version is 3.14. On upgrading to a higher version it breaks >> some >> > existing code which is not correct. So is apache-poi not compatible with >> > java 17 in tomcat? >> >> Apache POI 3.14 was released in 2016 - >> https://poi.apache.org/devel/history/changes-3x.html#3.14 >> >> The fact that a version that is almost 7 years old, and predates Java 17 >> by almost as long, doesn't work perfectly isn't a huge surprise. You need >> to use a more modern release >> >> The latest Apache POI release is 5.2.3, you should try that. There are a >> lot of bug fixes in the last 7 years, see >> https://poi.apache.org/changes.html >> for a summary of the recent ones >> >> Nick >> >