iText5如何设置带图片的表格单元格固定高度并自适应缩放图片
解决方案
你遇到的问题核心是API调用错误+未提前手动计算图片缩放比例,按以下步骤修改即可:
- 替换无效的高度设置API
iText 5中setCalculatedHeight是框架内部渲染时自动计算赋值的属性,手动调用不会生效,固定单元格高度需使用setFixedHeight方法。 - 提前计算单元格可用宽高,手动按比例缩放图片
不要依赖iText默认的图片适配逻辑,提前获取单元格的可用宽度、你设定的固定高度,计算出最小缩放比例对图片进行等比缩放,避免拉伸或撑高单元格。
修改后的完整代码如下:
// 提前定义你需要的单元格固定高度,可自行调整 final float CELL_FIXED_HEIGHT = 50f; Paragraph p = new Paragraph(); p.add(new Phrase("This is a new paragraph!")); PdfPTable table = new PdfPTable(2); table.setWidthPercentage(100); // 提前计算单格可用宽度:页面可用宽度 * 表格占比 / 列数 float pageAvailableWidth = doc.getPageSize().getWidth() - doc.leftMargin() - doc.rightMargin(); float cellAvailableWidth = (pageAvailableWidth * table.getWidthPercentage() / 100) / table.getNumberOfColumns(); for(int i=0;i<imageArr.size();i++) { //imageArr.size()%2==0! PdfPCell cell = new PdfPCell(); // 直接设置单元格固定高度 cell.setFixedHeight(CELL_FIXED_HEIGHT); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); String name = imageArr.get(i); String path = imgFolder + File.separator + name; File f = new File(path); if(f.isFile()) { Image img = Image.getInstance(path); // 计算等比缩放比例,保证图片宽不超过单元格宽、高不超过单元格固定高度 float scaleWidth = cellAvailableWidth / img.getWidth(); float scaleHeight = CELL_FIXED_HEIGHT / img.getHeight(); float finalScale = Math.min(scaleWidth, scaleHeight); img.scalePercent(finalScale * 100); // 设置图片居中对齐 img.setAlignment(Image.ALIGN_CENTER | Image.ALIGN_MIDDLE); cell.addElement(img); } else { cell.addElement(new Phrase(name)); } table.addCell(cell); } p.add(table); doc.add(p);
如果需要处理文本内容超过单元格高度的场景,可以额外添加cell.setNoWrap(true)或者自定义单元格渲染器裁剪溢出内容,避免高度失效。
内容的提问来源于stack exchange,提问作者Neph
相关产品推荐
相关产品推荐

