Java easytable - 使用 for 循环在 table 中创建行

Java easytable - Create rows in table using for loop

我正在尝试使用 vandeseer 的 easytable 创建一个带有 header 行的 table,然后使用 for 循环创建一些行。

我能做的最好的就是创建两个单独的 table 并将它们彼此对齐。第一个 table 是 header 行,第二个 table 我希望 for 循环填充许多行。这是使用 PDFBox 渲染时的样子。

我当前的代码:

private void drawActiveCelUserRolesTable(PDPageContentStream contentStream, List<CelUser> users) {
        

            //draw table header
            Table activeUsersHeader = Table.builder()
                    .addColumnsOfWidth(100,100,100,100,100)
                    .addRow(Row.builder()
                            .add(TextCell.builder().text("Last Name").borderWidth(1).build())
                            .add(TextCell.builder().text("First Name").borderWidth(1).build())
                            .add(TextCell.builder().text("Role Name").borderWidth(1).build())
                            .add(TextCell.builder().text("Effective Date").borderWidth(1).build())
                            .add(TextCell.builder().text("Expiry Date").borderWidth(1).build())
                            .build())

                    .build();

            TableDrawer headerDrawer = TableDrawer.builder()
                    .contentStream(contentStream)
                    .startX(HEADER_TABLE_LOCATION_X)
                    .startY(HEADER_TABLE_LOCATION_Y-50)
                    .table(activeUsersHeader)
                    .build();

            headerDrawer.draw();

            Table activeUsersRows = Table.builder()
                    .addColumnsOfWidth(100,100,100,100,100)
                    .addRow(Row.builder()
                            .add(TextCell.builder().text("Joe").borderWidth(1).build())
                            .add(TextCell.builder().text("Bob").borderWidth(1).build())
                            .add(TextCell.builder().text("ADM").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/20").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/21").borderWidth(1).build())
                            .build())

                    .build();

            TableDrawer rowDrawer = TableDrawer.builder()
                    .contentStream(contentStream)
                    .startX(HEADER_TABLE_LOCATION_X)
                    .startY(HEADER_TABLE_LOCATION_Y - 67)
                    .table(activeUsersRows)
                    .build();

            rowDrawer.draw();
            
}

我试过使用 for 循环来填充行,如下所示,但显然行不通。

            Table activeUsersRows = Table.builder()
                .addColumnsOfWidth(100,100,100,100,100)
                for (int i = 0; i < 5; i++) {

                    .addRow(Row.builder()
                            .add(TextCell.builder().text("Joe").borderWidth(1).build())
                            .add(TextCell.builder().text("Bob").borderWidth(1).build())
                            .add(TextCell.builder().text("ADM").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/20").borderWidth(1).build())
                            .add(TextCell.builder().text("17/12/21").borderWidth(1).build())
                            .build())

                    .build();

                }

我试过查看文档,但似乎找不到任何类似的内容。我看过使用 Table.TableBuilder 的示例,但由于某些原因,这些 table 不会呈现在 pdf 上。因此,为什么我只使用 Table class.

这应该很简单。你看过这个 Q/A 了吗? 我猜您想在每个新页面上重复 header 行,对吗?如果是这样,它应该很简单:

RepeatedHeaderTableDrawer.builder()
    .table(createTable())
    .startX(50)
    .startY(100F)
    .endY(50F) // <-- If the table is bigger, a new page is started
    .build()

也许还可以看看 this class

更新:

如果它真的只是关于使用 for 循环来填充 header 下面的行,技巧是将 TableBuilder 分配给局部变量。下面用一个最小的工作解决方案说明了这一点:

try (final PDDocument document = new PDDocument()) {
    final PDPage page = new PDPage(PDRectangle.A4);
    document.addPage(page);

    try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {

        // Build the table
        final Table.TableBuilder myTableBuilder = Table.builder()
                .addColumnsOfWidth(200, 200)
                .padding(2)
                .addRow(Row.builder()
                        .add(TextCell.builder().text("Header 1").build())
                        .add(TextCell.builder().text("Header 2").build())
                        .build());

        for (int i = 0; i < 20; i++) {
            myTableBuilder
                    .addRow(Row.builder()
                            .add(TextCell.builder().text("1st cell on row " + i).build())
                            .add(TextCell.builder().text("2nd cell on row " + i).build())
                            .build())
                    .build();
        }

        // Set up the drawer
        TableDrawer tableDrawer = TableDrawer.builder()
                .contentStream(contentStream)
                .startX(20f)
                .startY(page.getMediaBox().getUpperRightY() - 20f)
                .table(myTableBuilder.build())
                .build();

        // And go for it!
        tableDrawer.draw();
    }

    document.save("example.pdf");
}