Java iText:如何在新页面上重复表格单元格内容?

Java iText:如何在新页面上重复表格单元格内容?,java,itext,Java,Itext,我想生成一个包含客户订单的表。(简化的)表格如下所示。如果客户有多个订单,我只需将客户信息添加到客户的第一行。因此,订单1到3属于客户1,订单4和5属于客户2 Customer | Order (header row) -------------+-------------------------------------------- Name 1 | Item 1 (Order 1) Street | City | ------

我想生成一个包含客户订单的表。(简化的)表格如下所示。如果客户有多个订单,我只需将客户信息添加到客户的第一行。因此,订单1到3属于客户1,订单4和5属于客户2

   Customer   |  Order   (header row)
 -------------+--------------------------------------------
  Name 1      | Item 1 (Order 1)
  Street      |
  City        |
 -------------+--------------------------------------------
              | Item 1 (Order 2)
              | Item 2
 -------------+--------------------------------------------
              | Item 1 (Order 3)
 -------------+--------------------------------------------
  Name 2      | Item 1 (Order 4)
  Street      | Item 2
  City        | Item 3
              | Item 4
 -------------+--------------------------------------------
              | Item 1 (Order 5)
这很好,除非我得到一个分页符/新页面。在本例中,该表将如下所示:

   Customer   |  Order
 -------------+--------------------------------------------
  Name 1      | Item 1 (Order 1)
  Street      |
  City        |
 -------------+--------------------------------------------
              | Item 1 (Order 2)
              | Item 2
 ### new page ###
   Customer   |  Order
 -------------+--------------------------------------------
              | Item 1 (Order 3)
 -------------+--------------------------------------------
  Name 2      | Item 1 (Order 4)
  Street      | Item 2
  City        | Item 3
              | Item 4
 -------------+--------------------------------------------
              | Item 1 (Order 5)
   Customer   |  Order
 -------------+--------------------------------------------
  Name 1      | Item 1 (Order 1)
  Street      |
  City        |
 -------------+--------------------------------------------
              | Item 1 (Order 2)
              | Item 2
 ### new page ###
   Customer   |  Order
 -------------+--------------------------------------------
  Name 1      | Item 1 (Order 3)
  Street      |
  City        |
 -------------+--------------------------------------------
  Name 2      | Item 1 (Order 4)
  Street      | Item 2
  City        | Item 3
              | Item 4
 -------------+--------------------------------------------
              | Item 1 (Order 5)
但我希望在新页面的第一个customer单元格中重复customer 1,因此它看起来如下所示:

   Customer   |  Order
 -------------+--------------------------------------------
  Name 1      | Item 1 (Order 1)
  Street      |
  City        |
 -------------+--------------------------------------------
              | Item 1 (Order 2)
              | Item 2
 ### new page ###
   Customer   |  Order
 -------------+--------------------------------------------
              | Item 1 (Order 3)
 -------------+--------------------------------------------
  Name 2      | Item 1 (Order 4)
  Street      | Item 2
  City        | Item 3
              | Item 4
 -------------+--------------------------------------------
              | Item 1 (Order 5)
   Customer   |  Order
 -------------+--------------------------------------------
  Name 1      | Item 1 (Order 1)
  Street      |
  City        |
 -------------+--------------------------------------------
              | Item 1 (Order 2)
              | Item 2
 ### new page ###
   Customer   |  Order
 -------------+--------------------------------------------
  Name 1      | Item 1 (Order 3)
  Street      |
  City        |
 -------------+--------------------------------------------
  Name 2      | Item 1 (Order 4)
  Street      | Item 2
  City        | Item 3
              | Item 4
 -------------+--------------------------------------------
              | Item 1 (Order 5)
我认为填充单元格可以通过组合页面/单元格事件来完成,但这需要将所有客户单元格的最小高度设置为填充的客户单元格的高度,因为我不知道新页面将在何时/何地出现。如果我有大客户单元格和小订单单元格,这将浪费大量空间。
有什么想法吗?我如何建立一个像上面那样的表格,并在分页符/新页面后重复某个单元格的内容?

我找到了一个可能的解决方案(对于iText 5.1+):

  • 将表格添加到
    列文本中
  • 在循环中使用
    ColumnText.go()
    将表写入文档
  • 每次
    go()
    之后,获取通过
    ColumnText.getRowsDrawn()写入的行数
  • 创建一个新的
    PdfPTable
    (使用与原始表格相同的设置)
  • 将所有行从
    ColumnText.getRowsDrawn()
    复制到原始表的末尾,然后逐单元格复制到新表中。现在我可以用所需的数据替换第一行的第一个空单元格
  • 使用
    ColumnText.setText(null)
  • 将副本添加到
    列文本中

别忘了用副本替换“原始”表,否则会得到一个无限循环。在添加任何内容之前,不要忘记先复制并设置原始行的任何页眉或页脚行。

我最近也遇到了同样的问题。您可以通过使用IText的事件来实现这一点