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

如何修复iText生成PDF表格时的行列不规则问题

解决iText v9 VB.NET表格行列不规则问题

问题根源分析

  • 表格列数与跨列设置不匹配:第一个表格初始化定义为8列,但首单元格使用colspan=9,直接导致布局错乱
  • 跨行跨列逻辑混乱:单元格的rowspan设置未统一规划,行与列的单元格数量无法对齐
  • 单元格数量溢出:第二个表格定义为8列,但实际添加的单元格总数超过列数,破坏表格结构

修正后的代码

' 第一个表格:统一列数为9,匹配首单元格的colspan=9
Dim mytable7 As Table = New Table(9)

Dim commodityStr As String = "Commodities requiring special Or additional care Or attention in handling Or stowing must be so marked And packaged as to ensure safe transportation with ordinary care. See Section 2(e) of NMFC Item 360"

' 首行跨9列的标题单元格
mytable7.AddCell(New Cell(1, 9) _
    .Add(New Paragraph("CARRIER INFORMATION")) _
    .SetTextAlignment(TextAlignment.CENTER) _
    .SetFontSize(8) _
    .SetFontColor(ColorConstants.WHITE) _
    .SetBackgroundColor(ColorConstants.BLACK))

' 第二行单元格:共5个单元格,其中前4个rowspan=2,最后一个rowspan=1(LTLONLY)
mytable7.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("HANDELING UNIT").SetFontSize(FontSize.Small).SetTextAlignment(TextAlignment.CENTER)))
mytable7.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("PACKAGE").SetFontSize(FontSize.Small).SetTextAlignment(TextAlignment.CENTER)))
mytable7.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("WEIGHT").SetFontSize(FontSize.Small).SetTextAlignment(TextAlignment.CENTER)))
mytable7.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("HM").SetFontSize(FontSize.Small).SetTextAlignment(TextAlignment.CENTER)))
' 商品描述单元格:rowspan=2,占2行
mytable7.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("COMMODITY DESCRIPTION").SetTextAlignment(TextAlignment.CENTER).SetFontSize(FontSize.Small)) _
    .Add(New Paragraph(commodityStr).SetFontSize(FontSize.XSmall).SetTextAlignment(TextAlignment.CENTER)))
' LTLONLY单元格:仅占1行,放在第二行末尾
mytable7.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("LTLONLY").SetFontSize(FontSize.Small).SetTextAlignment(TextAlignment.CENTER)))

document.Add(mytable7)

' 第二个表格:8列宽度数组,确保单元格数量与列数匹配
Dim columnwidth As Single() = {38.0F, 38.0F, 37.0F, 37.0F, 50.0F, 50.0F, 60.0F, 50.0F}
Dim table8 As Table = New Table(columnwidth)

' 第一行前4个单元格:rowspan=2,占两行
table8.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("22").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))
table8.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("SKD").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))
table8.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("3").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))
table8.AddCell(New Cell(2, 1) _
    .Add(New Paragraph("CTN").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))

' 第一行剩余4个单元格(对应第5-8列)
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("2800lbs").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("HM").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("Used Books 42x42x56").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("NMFC#").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))

' 第二行补充剩余的单元格(第5-8列,因为前4列被跨行单元格占据)
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("").SetFontSize(FontSize.Medium))) ' 空单元格占位
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("").SetFontSize(FontSize.Medium)))
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("").SetFontSize(FontSize.Medium)))
table8.AddCell(New Cell(1, 1) _
    .Add(New Paragraph("LTL").SetFontSize(FontSize.Medium).SetTextAlignment(TextAlignment.CENTER)))

document.Add(table8)

关键修正说明

  1. 列数匹配:将第一个表格的列数从8改为9,与首单元格的colspan=9保持一致,避免列数溢出
  2. 跨行逻辑统一:重新规划每个单元格的rowspan,确保每行的单元格总列数(含跨列)等于表格总列数
  3. 单元格数量对齐:第二个表格中,跨行单元格占据两行,因此需要在第二行补充对应数量的单元格(包括空单元格占位),保证每行的单元格数量匹配表格列数

内容的提问来源于stack exchange,提问作者dan ashley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:45:18