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

时间:2013-06-20 14:35:47

标签: java itext

我想生成一个包含客户订单的表。 (简化)表如下所示。如果客户有多个订单,我只需在客户的第一行添加客户信息。因此订单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)

但我希望客户1在新页面的第一个客户单元格中重复,所以它看起来像这样:

   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)

我认为填充单元格可以通过组合的页面/单元格事件来完成,但是这需要将所有客户单元格的最小高度设置为填充的客户单元格的高度,因为我不知道何时/新页面将在何处发生。如果我有大量客户单元和小订单单元,这将浪费大量空间。 任何想法,我如何建立一个像上面那样的表,并在分页/新页面后重复某个单元格的内容?

2 个答案:

答案 0 :(得分:2)

我最近偶然发现了同样的问题。您可以使用IText的afterSplitTable事件来实现。

 public void afterSplitTable(PdfPTable table, PdfPRow startRow, int startIdx) { 

     // Get the previous value
     Phrase previous = table.getRow(startIdx - 1).getCells()[0].getPhrase();

     // The cell to add the previous value in
     PdfPCell newCell = table.getRow(startIdx).getCells()[0];

     // Check if the new cell is empty to prevent overwriting some content
     if (newCell.getPhrase().getContent() == ""){
          // set the phrase of the new cell to the phrase of the previous one
          newCell.setPhrase(previous);
     }
 }

答案 1 :(得分:1)

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

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

不要忘记用副本替换“原始”表格,否则你将获得无限循环。在添加任何内容之前,请不要忘记从原始行首先复制和设置任何页眉或页脚行。