【问题标题】:iText tables - how to keep multi row cells on one page?iText 表格 - 如何在一页上保留多行单元格?
【发布时间】:2013-05-07 20:37:54
【问题描述】:

我正在 iText 中创建一个表格,其中列出了某个日期的事件。如果某个日期有多个事件,我将日期单元格的 rowspan 属性设置为事件数。我目前正在为每个事件使用一行,因为我想显示该事件的附加信息并希望使所有内容保持一致。 基本上我的表可以是这样的:

 Date   | Event     | Details
--------+-----------+---------------
 date 1 | event 1   | details 1
--------+-----------+---------------
 date 2 | event 2 1 | more 
        |           | details 2 1
        +-----------+---------------
        | event 2 2 | details 2 2
--------+-----------+---------------

包含date 2 的单元格的行跨度为 2。

我在循环中使用ColumnText.go() 添加表格。

如果我将表格写入文档并且只剩下足够的空间供event 2 1 使用,event 2 2 将转到新页面。在添加date 2之前如何强制一个新页面?

使用PdfPTable.setSplitLate(true) 似乎不会影响多行单元格。也不会将date 2 单元格的固定高度设置为两行的组合高度。

  • 一种解决方案是对第 2 列和第 3 列使用嵌套表(并将第 2 列和第 3 列视为一列)

  • 在我使用的 iText 版本中无法正常工作的另一种解决方案是使用 PdfPTable.writeSelectedRows() 并仅写入适合页面的(组合)行。问题是,这样会忽略行跨度,Date 单元格看起来只跨行。

还有其他方法吗?

【问题讨论】:

  • 当前 iText 中一个可能的解决方案可能是 PdfPTable.keepRowsTogether(int []) - 不幸的是,它在我必须使用的 iText 版本中不可用
  • 你用的是哪个版本?

标签: java itext


【解决方案1】:

您可以为每一行创建一个表并使用PdfPTable.setKeepTogether(true),它甚至适用于 iText 2.1.7,但我不建议继续使用该版本。这是一个示例,其中outputFile 是正在创建 PDF 文件的文件类型变量。

Document document = new Document(new Rectangle(620, 150));
PdfWriter.getInstance(document, new FileOutputStream(outputFile));

document.open();

PdfPTable headerRow = new PdfPTable(3);
headerRow.setKeepTogether(true);
headerRow.addCell("Date");
headerRow.addCell("Event");
headerRow.addCell("Details");

PdfPTable firstRow = new PdfPTable(3);
firstRow.setKeepTogether(true);
firstRow.addCell("date 1");
firstRow.addCell("event 2 1");
firstRow.addCell("more\ndetails 2 1");

PdfPTable secondRow = new PdfPTable(3);
secondRow.setKeepTogether(true);
PdfPCell cell = new PdfPCell(new Phrase("date 2"));
cell.setRowspan(2);
secondRow.addCell(cell);
secondRow.addCell("event 2 1");
secondRow.addCell("more\ndetails 2 1");
secondRow.addCell("event 2 2");
secondRow.addCell("details 2 2");

document.add(headerRow);
document.add(firstRow);
document.add(secondRow);

document.close();

老实说,我认为嵌套表是更好的主意。

【讨论】:

  • 与问题无关,如果您使用的是 iText 2.1.7,我会在这里查看itextpdf.com/tags/itext-217 以了解有关该特定版本的更多信息。
【解决方案2】:
        Document document = new Document(PageSize.A4, 30, 30, 100, 150);
        document.SetPageSize(iTextSharp.text.PageSize.A4);
        PdfWriter writer = PdfWriter.GetInstance(document, fs);
        writer.PageEvent = new ITextEvents();
        document.Open();
        iTextSharp.text.Font fntHead2 = new iTextSharp.text.Font(bfntHead, 11, 1, BaseColor.BLACK);
        Paragraph para = new Paragraph();
        Chunk glue = new Chunk(new VerticalPositionMark());
        Phrase ph1 = new Phrase();

        Paragraph main = new Paragraph();
        ph1.Add(new Chunk("Left Side", fntHead2)); 
        ph1.Add(glue); // Here I add special chunk to the same phrase.    
        ph1.Add(new Chunk("Right Side", fntHead2)); 
        para.Add(ph1);
        document.Add(para);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2023-03-24
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多