当前位置: 首页 > 知识库问答 >
问题:

PDFBOX-使用easytable在所有页面中显示标题

扶高歌
2023-03-14

我正在使用pdfbox和easytablehttps://github.com/vandeseer/easytable用于创建动态页面,效果非常好。但我确实希望在所有页面中添加标题。我尝试过下面的事情。

1) Tablebuilder是在写入行之前创建的,因此我们可以创建一个完美的Tablebuilder,因为行是动态的。

2) 在创建tablebuilder时,试图在中间插入标题,但这也不是完美的,因为TableDrawer根据行高使行足够

任何想法/帮助都将不胜感激。

该项目需要类似的产出-https://github.com/eduardohl/Paginated-PDFBox-Table-Sample.唯一的问题是内容不像easytable那样动态。

共有2个答案

云英才
2023-03-14

这个答案是在easytable还不支持重复表头的早期编写的。与此同时,它确实如此,请看易相处的作家菲洛诺斯的答案。

easytable不支持重复表格页眉或页脚。我应该说还没有,因为这个特性实际上很容易实现。

但是,很难在easytable之上实现,因为该库(像许多其他库一样)遭受过多的数据隐藏:许多有趣的成员变量和方法是私有的,因此扩展类不是一个可行的选择。

但是你可以做的是将标题行作为一个单独的表格处理,你一次又一次地绘制它!缺点是设置有点重复。

对于您提到的测试代码TwoPagesTableTest,可以这样更改:

final Table.TableBuilder tableHeaderBuilder = Table.builder()
        .addColumnOfWidth(200)
        .addColumnOfWidth(200);

CellText dummyHeaderCell = CellText.builder()
        .text("Header dummy")
        .backgroundColor(Color.BLUE)
        .textColor(Color.WHITE)
        .borderWidth(1F)
        .build();

tableHeaderBuilder.addRow(
        Row.builder()
                .add(dummyHeaderCell)
                .add(dummyHeaderCell)
                .build());

Table tableHeader = tableHeaderBuilder.build();

final Table.TableBuilder tableBuilder = Table.builder()
        .addColumnOfWidth(200)
        .addColumnOfWidth(200);

CellText dummyCell = CellText.builder()
        .text("dummy")
        .borderWidth(1F)
        .build();

for (int i = 0; i < 50; i++) {
    tableBuilder.addRow(
            Row.builder()
                    .add(dummyCell)
                    .add(dummyCell)
                    .build());
}

TableDrawer drawer = TableDrawer.builder()
        .table(tableBuilder.build())
        .startX(50)
        .endY(50F) // note: if not set, table is drawn over the end of the page
        .build();

final PDDocument document = new PDDocument();

float startY = 100F;

do {
    TableDrawer headerDrawer = TableDrawer.builder()
            .table(tableHeader)
            .startX(50)
            .build();

    PDPage page = new PDPage(PDRectangle.A4);
    document.addPage(page);
    try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
        headerDrawer.startY(startY);
        headerDrawer.contentStream(contentStream).draw();
        drawer.startY(startY - tableHeader.getHeight());
        drawer.contentStream(contentStream).draw();
    }

    startY = page.getMediaBox().getHeight() - 50;
} while (!drawer.isFinished());

document.save("twoPageTable-repeatingHeader.pdf");
document.close();

(RepeatingTableHeaders testcreateTwoPageTableRepeatingHeader

如您所见,代码首先创建一个单独的表tableHeader,其中只包含标题行。然后在每页上首先添加该表,然后添加body rows表的一部分。

结果是:每页上都有表格标题。。。

警告一句:这是一个概念证明,我只使用TwoPagesTableTest中的表生成代码进行了测试。对于生产代码,您应该应用进一步的测试。

傅明知
2023-03-14

除了@mkl的答案和评论之外:在当前版本的库中,有一个类可以满足这个需求。

所以你的代码基本上可以归结为:

try (final PDDocument document = new PDDocument()) {

    RepeatedHeaderTableDrawer.builder()
            .table(createTable())
            .startX(50)
            .startY(100F)
            .endY(50F) // note: if not set, table is drawn over the end of the page
            .build()
            .draw(() -> document, () -> new PDPage(PDRectangle.A4), 50f);

    document.save("your-awesome-document.pdf");
}
 类似资料:
  • 问题内容: 我有两个列表,当我用下面的代码绘图时,x轴只显示 最多12个(最多15个)。我可以知道如何显示x列表中的所有值吗 x轴?提前谢谢。 如果我在“set xticklabels”函数中设置minor=True,它将显示所有 x=2,4,6,8,…,16。。。但我想要所有的价值观。 P、 我的x轴没有排序,应该显示如图所示。 问题答案: Add this: To your code befo

  • 问题内容: 如果表格的长度超过一页,如何在所有页面中重复a的标题? 问题答案: 看的。在那里定义为标题的行应保留在新页面上。 第一行作为标题。 请参阅API。

  • 问题 如何在页面中心显示用户登录? 详细信息 左侧显示用户登录数据 实际上,我需要在页面中心显示用户登录数据。 这包括用户名和密码的标签以及复选框和标签记住 用户名和密码的用户登录标题和按钮提交和输入框 意思是全部移到中间。

  • 我正在使用PDFbox下载PDF。我想在中间添加一些新页面。 此代码在PDF结尾处插入新页面。如何在另一个位置插入页面?

  • 我有一个带有标头的Spring Boot REST控制器,它可以有多个值: 并使用Springfox实现了Swagger。当我加载Swagger UI时,我只能从版本标题列表中看到并选择v1选项。如何在Swagger UI中显示所有表头值以供选择?如何更改Swagger UI列表中的默认头值?