You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中所有单元格显示扭曲,呈现出异常压缩、样式混乱的状态,无法理解为何会出现这种情况。


问题根源

  1. 单元格无有效内容:代码中cell1.setPhrase();未传入任何Phrase实例,导致单元格没有可渲染的文本内容,高度被压缩到极小值,搭配背景色后视觉上呈现扭曲效果。
  2. 表格列未完整填充:表格定义为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:24:56