Java中使用PdfWriter生成PDF时单元格显示异常、部分跳页问题
问题分析与解决
我尝试使用PdfWriter创建PDF,相关代码如下:
Document document = new Document(PageSize.A4); PdfWriter.getInstance(document, new FileOutputStream("some file path")); document.open(); Font font1 = FontFactory.getFont(FontFactory.HELVETICA_BOLD); font1.setSize(10); font1.setColor(Color.BLUE); PdfPTable table = new PdfPTable(8); table.setWidthPercentage(100f); table.setWidths(new int[] { 1, 1, 1, 1, 1, 1, 1, 3 }); table.setSpacingBefore(10); table.setHorizontalAlignment(Element.ALIGN_CENTER); PdfPCell cell1 = new PdfPCell(); //cell1.setBorder(Rectangle.NO_BORDER); cell1.setHorizontalAlignment(Element.ALIGN_CENTER); cell1.setBackgroundColor(Color.DARK_GRAY); cell1.setPadding(5); font1.setColor(Color.WHITE); cell1.setPhrase(); table.addCell(cell1);
生成的PDF中所有单元格显示扭曲,呈现出异常压缩、样式混乱的状态,无法理解为何会出现这种情况。
问题根源
- 单元格无有效内容:代码中
cell1.setPhrase();未传入任何Phrase实例,导致单元格没有可渲染的文本内容,高度被压缩到极小值,搭配背景色后视觉上呈现扭曲效果。 - 表格列未完整填充:表格定义为8列,但仅添加了1个单元格,剩余7个单元格会使用默认样式自动生成,与自定义单元格的样式、尺寸不匹配,进一步加剧布局混乱。
修正后的代码
Document document = new Document(PageSize.A4); PdfWriter.getInstance(document, new FileOutputStream("some file path")); document.open(); Font font1 = FontFactory.getFont(FontFactory.HELVETICA_BOLD); font1.setSize(10); font1.setColor(Color.BLUE); PdfPTable table = new PdfPTable(8); table.setWidthPercentage(100f); table.setWidths(new int[] { 1, 1, 1, 1, 1, 1, 1, 3 }); table.setSpacingBefore(10); table.setHorizontalAlignment(Element.ALIGN_CENTER); // 自定义表头单元格 PdfPCell cell1 = new PdfPCell(); cell1.setHorizontalAlignment(Element.ALIGN_CENTER); cell1.setBackgroundColor(Color.DARK_GRAY); cell1.setPadding(5); font1.setColor(Color.WHITE); // 传入带文本和字体的Phrase,确保单元格有内容 cell1.setPhrase(new Phrase("表头1", font1)); table.addCell(cell1); // 填充剩余7个表头单元格,保证列数匹配 for (int i = 1; i < 8; i++) { PdfPCell cell = new PdfPCell(new Phrase("表头" + (i+1), font1)); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(Color.DARK_GRAY); cell.setPadding(5); table.addCell(cell); } // 示例:添加数据行 PdfPCell dataCell = new PdfPCell(new Phrase("数据内容", FontFactory.getFont(FontFactory.HELVETICA))); dataCell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(dataCell); // 补全该行剩余7个数据单元格... document.add(table); document.close();
核心修正点
- 调用
setPhrase()时必须传入包含文本和字体的Phrase对象,让单元格拥有可渲染内容,维持正常的高度和布局。 - 确保每一行的单元格数量与表格列数一致,避免自动生成的默认单元格破坏整体样式。
内容的提问来源于stack exchange,提问作者Swathi
相关产品推荐
相关产品推荐

