Java 表的冲突,当页脚一牢固地设置在底部时

Java 表的冲突,当页脚一牢固地设置在底部时,java,itext,Java,Itext,以下屏幕截图显示了我遇到的问题: 注意:我只想把绿色表格放在整个pdf文件的最后,而不是每一页 是否有一些优雅的解决方案来查找页面上的X、Y位置并手动创建新页面 这是我的代码(使用iText): private static PdfPTable createHeaderTable()引发DocumentException{ int[]columnWidths=新的int[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1}; PdfPTable datatable=新的PdfPTabl

以下屏幕截图显示了我遇到的问题:

注意:我只想把绿色表格放在整个pdf文件的最后,而不是每一页

是否有一些优雅的解决方案来查找页面上的X、Y位置并手动创建新页面

这是我的代码(使用iText):

private static PdfPTable createHeaderTable()引发DocumentException{
int[]columnWidths=新的int[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1};
PdfPTable datatable=新的PdfPTable(列宽.长度);
datatable.setWidthPercentage(100);
datatable.setWidths(列宽度);
datatable.getDefaultCell().setPadding(5);
datatable.getDefaultCell().setHorizontalAlignment(对齐);
datatable.getDefaultCell().setVerticalAlignment(对齐);
对于(int i=0;i<90;i++){
addCellToTable(数据表、水平对齐左、,
垂直对齐中间,“Přehledovátabulka”,柱宽.长度,
1、字体粗体、字体大小规则、单元格布局(底部);
}
私有静态PdfPTable createFooterTable()引发DocumentException{
int[]columnWidths=新的int[]{1,1,1,1,1,1,1};
PdfPTable datatable=新的PdfPTable(列宽.长度);
//datatable.setKeepTogether(true);
datatable.setWidthPercentage(100);
datatable.setWidths(列宽度);
datatable.getDefaultCell().setPadding(5);
datatable.getDefaultCell().setHorizontalAlignment(对齐);
datatable.getDefaultCell().setVerticalAlignment(对齐);
//..添加的单元格与按标题表添加的单元格相同(此处较高)。。。
返回数据表;
}
公共静态void main(字符串[]args)
抛出FileNotFoundException、DocumentException{
文件=新文件(页面大小为A4);
PdfWriter writer=null;
试一试{
writer=PdfWriter.getInstance(文档,
新文件输出流(“C:/radek文件夹/calendar.pdf”);
}catch(filenotfounde异常){
e、 printStackTrace();
}
document.open();
PdfPTable datatable=createHeaderTable();
文件。添加(数据表);
datatable=createFooterTable();
内页的绘图表(文档、编写器、数据表);
document.close();
系统输出打印项次(“完成”);
}
内页专用静态无效绘图表(文档、PDF编写器、,
PdfPTable(数据表){
datatable.setTotalWidth(
document.right(document.rightsmargin())-
document.left(document.leftMargin());
datatable.writeSelectedRows(0,-1,document.left(document.leftMargin()),
datatable.getTotalHeight()+document.bottom(document.bottomMargin()),
writer.getDirectContent());
}

我将您的问题作为的副本关闭,因为我(错误地)认为您希望在文档的每一页中添加一个表

您用澄清更新了您的问题,现在它是此问题的副本:

堆栈溢出不允许我将问题重复两次关闭,因此我必须在此处复制/粘贴我以前的答案:

有一个非常古老的方法叫做
getVerticalPosition()
,它采用
boolean
作为参数。我不以这种方法为荣,因为它是一种 getter方法,在使用一系列
document.add()
操作后,它不仅会为您提供页面上的Y位置,还可以 更改当前的Y位置(这不是getter方法所要做的) 应该这样做)

如果您将
false
作为参数传递,它将为您提供当前Y, 这可能是最后一个
块的基线位置
补充说

如果将
true
作为参数传递,该方法将首先添加换行符 并给出“下一行”文本的基线位置 您将添加

请注意,iText 7中修复了许多设计缺陷(其中一些缺陷可以追溯到我2000年的iText原始设计);iText 7是对iText的完全重写。

我的解决方案:

  private static void drawTableAtTheEndOfPageAndWholeDocument
  (Document document, PdfWriter writer, PdfPTable datatable) 
  {
     datatable.setTotalWidth(document.right() - document.left());

     if (writer.getVerticalPosition(false) - datatable.getTotalHeight()
         - document.bottom() < 0) { 

      // new page if there is too little space for the final table on 
      // current page
        document.newPage();
     }

     datatable.writeSelectedRows(0, -1, document.left(),
     datatable.getTotalHeight() + document.bottom(), 
     writer.getDirectContent());
  }
endofpage和wholedocument上的私有静态无效绘图表
(文档、PDF编写器、PdfPTable datatable)
{
setTotalWidth(document.right()-document.left());
if(writer.getVerticalPosition(false)-datatable.getTotalHeight()
-document.bottom()<0{
//如果上最后一个表的空间太小,请新建页面
//当前页
document.newPage();
}
datatable.writeSelectedRows(0,-1,document.left(),
datatable.getTotalHeight()+document.bottom(),
writer.getDirectContent());
}

您的问题是问题组合的重复。您应该在页面事件中添加页脚表。请参阅和,当您将表添加为页脚(或页眉)时,您不必担心拆分主表以便自动分发。您只需确保页边距定义正确。但我的目的不是在每一页上都有它,而是在最后一页上。我查看了您发送给我的链接,并仔细研究了它们。我不想为其中一页保留空间在每一页的整个文档的末尾都有一个页脚表。或者,是否真的有可能以某种方式进行更改并在我的问题中使用它?我仍在研究它,但我不确定。我误解了你的问题。我重新打开了你的问题。我查看了该链接。因此,如果我理解正确,有(在iText 5中)除了使用getVerticalPosition方法外,没有其他选择。那么这个问题不会重复,因为这正是我所问的问题-是否有其他方法来处理这个问题,而不是手动使用这种方法。在我看来,把这个问题留在这里是好的,现在很明显,没有其他方法了。
  private static void drawTableAtTheEndOfPageAndWholeDocument
  (Document document, PdfWriter writer, PdfPTable datatable) 
  {
     datatable.setTotalWidth(document.right() - document.left());

     if (writer.getVerticalPosition(false) - datatable.getTotalHeight()
         - document.bottom() < 0) { 

      // new page if there is too little space for the final table on 
      // current page
        document.newPage();
     }

     datatable.writeSelectedRows(0, -1, document.left(),
     datatable.getTotalHeight() + document.bottom(), 
     writer.getDirectContent());
  }