有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

  1. # 1 楼答案

    我最近也遇到了同样的问题。可以通过使用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);
         }
     }
    
  2. # 2 楼答案

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

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

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