我是 iText 的新手,目前正在用 java 做一个小项目。
我想打印出一个表格“标题”,然后是表格本身。发生的情况是,有时数据会导致表格标题出现在页面底部,而表格从下一页开始。
我想将表格标题和表格放在一起,即如果没有空间在标题之后开始表格,则将两者都移到下一页。
我目前通过创建一个段落对象来添加标题,然后在它之后添加一个 PDFTable 对象。我在下面提取了一些示例代码,基本上代表了我目前正在做的事情:
// Add a table title
Paragraph tableTitle = new Paragraph();
tableTitle .setAlignment(1);
tableTitle .add("This is my table title");
tableTitle .setSpacingAfter(12);
try {
document.add(tableTitle );
} catch (DocumentException e) {
throw new ReportingException("Couldn't add section title", e);
}
// Now add the table
PDFTable currentTable = new PdfPTable(3);
// add the headers and data to the table etc...
:
:
如有任何指点,我们将不胜感激。
谢谢
最佳答案
由于您是 iText 新手,最好从 iText 7 而不是 iText 5 开始。我知道您使用的是 iText 5,因为我看到您使用 PdfPTable
。
iText 7 与以前的版本不兼容。 iText 5 从头开始重写,一劳永逸地解决了许多已知的技术问题。由于您是 iText 的新手,这对您来说应该无关紧要:您没有任何需要从版本 5 迁移到版本 7 的旧代码。
您可以通过阅读 iText 7: Building Blocks 了解有关使用 iText 7 的更多信息教程。在 Chapter 4 ,您会发现 setKeepWithNext()
方法。在本教程中,此方法用于将章节标题保留在该章节第一段的同一页上:
BufferedReader br = new BufferedReader(new FileReader(SRC));
String line;
Div div = new Div();
while ((line = br.readLine()) != null) {
document.add(new Paragraph(line)
.setFont(bold).setFontSize(12)
.setMarginBottom(0)
.setKeepWithNext(true));
div = new Div()
.setFont(font).setFontSize(11)
.setMarginBottom(18);
while ((line = br.readLine()) != null) {
div.add(
new Paragraph(line)
.setMarginBottom(0)
.setFirstLineIndent(36)
);
if (line.isEmpty()) {
document.add(div);
break;
}
}
}
document.add(div);
如果您坚持使用 iText 5,您可以使用变通方法,但这会使您的代码更加复杂。解决方法可能涉及使用 ColumnText
(但代码中的行数会显着增加),将表标题添加为标题行(但如果表分布在不同页面上,则标题将重复),将标题和表格包装在“保持在一起”的另一个对象中(但这并不总是有效,具体取决于组合对象中存储的数据量)。
关于java - 如何防止段落和下表之间出现分页符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40251610/