【问题标题】:Get page number in Itext获取 Itext 中的页码
【发布时间】:2015-02-19 15:42:58
【问题描述】:

我正在尝试使用 Itext 生成 pdf。我需要在其中构建带有标题的表格。但是我通过迭代列表并将单元格添加到表格中动态地添加页面上的所有内容,最后在交互完成后将表格添加到文档中。 document.add(table);

如果我的内容被移到下一页,我的作者和文档不会显示更新的页码,直到表格内容添加到文档中。我需要迭代并构建动态表格下一页它应该有表格的标题。我按照许多方法尝试了我的最佳水平。但是,我无法知道在迭代过程的中间内容何时移动到下一页。PDFWriter 正在向我显示页面进入循环之前的编号。当表格内容进入下一页时,我需要获取更新的页码。我不需要这个标题出现在所有页面上。我只需要它直到表格内容继续存在。请让我知道哪种是处理这种情况的最佳方法。谢谢

【问题讨论】:

  • 如果您要做的只是确保在表格滚动到多个页面的每个页面上输出标题,那么我认为您需要做的就是在您的表格实例上调用 setHeaderRows() 并iText 将负责其余的工作。stackoverflow.com/questions/11861040/…
  • @AlanHay 我认为您的链接不能解决问题。如果我正确理解了这个问题(它应该被投票关闭,因为它非常不清楚),这个人想要一个在单元格中显示页码的重复标题。但是:我不确定。在问题以人们可以真正理解所问内容的方式更新之前,我不会回答。
  • 对不起,如果我的问题不清楚,我不希望单元格中有重复的标题而不是页码,我正在尝试创建一个有动态行的表格,我能够成功这样做。但我的问题是,当第一个表上的内容继续到下一个时,我还需要一个标题来描述下一页上的表内容。我正在尝试使用页码来做到这一点。如果我知道内容已发送到下一页,我可以在表格内容转到下一页之前拦截并添加我的标题。我希望这次我清楚。希望这次我清楚
  • 我希望这次我很清楚 - 您也应该编辑问题本身的说明。话虽如此,您似乎正在寻找一个动态表格标题行,其中包含“表格 XXZ,继续”之类的内容?
  • @mkl 是的,这是一个动态表。谢谢

标签: java pdf-generation itext


【解决方案1】:

这个问题的另一个答案不是真正的答案,它指的是另一个问题的答案。如果这确实是当前问题的答案,那么当前问题应该被标记为重复。

话虽如此,我认为答案并不完全正确。我写了一个例子,产生这样的东西:

如您所见,第一页没有页眉,第二页和第三页只有一个页眉,上面写着“表 XYZ(续)”。我什至添加了一个页脚,上面写着“继续下一页”。如您所见,此页脚仅在表格拆分时出现。它不在最后一页上。问题中没有提出这个问题,并且很容易从我的代码中删除。

您可以在此处找到完整的代码示例:SimpleTable5

这些是相关部分:

PdfPTable table = new PdfPTable(5);
table.setWidthPercentage(100);
PdfPCell cell = new PdfPCell(new Phrase("Table XYZ (Continued)"));
cell.setColspan(5);
table.addCell(cell);
cell = new PdfPCell(new Phrase("Continue on next page"));
cell.setColspan(5);
table.addCell(cell);
table.setHeaderRows(2);
table.setFooterRows(1);
table.setSkipFirstHeader(true);
table.setSkipLastFooter(true);
for (int i = 0; i < 350; i++) {
    table.addCell(String.valueOf(i+1));
}
document.add(table);

如果你只想要一个标题:

PdfPTable table = new PdfPTable(5);
table.setWidthPercentage(100);
PdfPCell cell = new PdfPCell(new Phrase("Table XYZ (Continued)"));
cell.setColspan(5);
table.addCell(cell);
table.setHeaderRows(1);
table.setSkipFirstHeader(true);
for (int i = 0; i < 350; i++) {
    table.addCell(String.valueOf(i+1));
}
document.add(table);

与您的代码的不同之处在于您添加了以下行以避免标题出现在第一页上:

table.setSkipFirstHeader(true);

Repeat PdfPTable header in all the continuation pages using iText的回答中没有提到这个

【讨论】:

  • 很好的答案@Bruno Lowagie,但我怎么能在这个动态页脚行表中添加页码。
  • 使用单元格事件
  • 我使用 writer.getPageNumber() 但它只为我的所有页面返回 1
  • cell = new PdfPCell(new Phrase("Page No ${writer.getPageNumber()}", new Font(Font.FontFamily.HELVETICA, 8, Font.BOLD))) cell.setBorder( Rectangle.TOP) cell.setHorizo​​ntalAlignment(Element.ALIGN_RIGHT) cell.setVerticalAlignment(Element.ALIGN_MIDDLE) cell.setColspan(header.size()) table.addCell(cell) table.setHeaderRows(headerRows) table.setFooterRows(1) 表格。 setSkipLastFooter(true)
  • 您可能已经注意到,cmets 并不适合粘贴代码。事实上,cmets 通常不适合发布问题。应使用“发布问题”功能发布问题。说到这里。为什么${writer.getPageNumber()} 会起作用?那不是 iText 语法!这不是页面事件。使用页面事件!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2020-06-27
  • 2014-07-06
  • 2014-06-30
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多