我正在使用pdfbox和easytablehttps://github.com/vandeseer/easytable用于创建动态页面,效果非常好。但我确实希望在所有页面中添加标题。我尝试过下面的事情。
1) Tablebuilder是在写入行之前创建的,因此我们可以创建一个完美的Tablebuilder,因为行是动态的。
2) 在创建tablebuilder时,试图在中间插入标题,但这也不是完美的,因为TableDrawer根据行高使行足够
任何想法/帮助都将不胜感激。
该项目需要类似的产出-https://github.com/eduardohl/Paginated-PDFBox-Table-Sample.唯一的问题是内容不像easytable那样动态。
这个答案是在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
中的表生成代码进行了测试。对于生产代码,您应该应用进一步的测试。
除了@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列表中的默认头值?