1

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

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

4

2 回答 2

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);
     }
 }
于 2018-06-21T14:40:50.123 回答
1

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

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

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

于 2013-06-21T13:26:22.873 回答