在最后一页底部创建pdf表(错误的官方解决方案)

时间:2017-05-05 14:47:50

标签: java pdf itext

This is official iText solution for creating a table on the last page at the bottom in pdf document.此解决方案将我的表放在最后一个pdf页面的底部。大。

不幸的是,它导致我的桌子变得更窄。这就是我不想要的。我已经尝试了几个小时让桌子再次变宽,但没有成功。我无法解决它。移动前如何将桌子放在原始大小的底部?这个问题的最佳解决方案是什么?

问题图片

Picture of the problem

在移动之前,我的表的宽度仅基于table.setWidthPercentage(100)创建;然后它开始报告异常,表的宽度必须大于零。

table.setWidths(我表中的列数);

我尝试将table.setTotalWidth()设置为不等于零的值,然后使用iText中的官方代码覆盖它。但没有成功。我正在寻找一些优雅的解决方案。

代码:

public static void main(String[] args)
{
    Document document = new Document(PageSize.A4);
    PdfWriter writer = null;
try {
    writer = PdfWriter.getInstance(document,
    new FileOutputStream("C:/radek-folder/calendar.pdf"));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
   document.open();

   PdfPTable datatable = createHeaderTable();
   document.add(datatable);
   datatable = createFooterTable();

   drawTableAtTheEndOfPage(document, writer, datatable);

   document.close();
   System.out.println("done");
}

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

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

   private static PdfPTable createFooterTable() throws DocumentException {
   int[] columnWidths = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
   PdfPTable datatable = new PdfPTable(columnWidths.length);
   datatable.setKeepTogether(true);
   datatable.setWidthPercentage(100);
   datatable.setWidths(columnWidths);
   datatable.getDefaultCell().setPadding(5);

   datatable.getDefaultCell().setHorizontalAlignment(horizontalAlignment);
   datatable.getDefaultCell().setVerticalAlignment(verticalAlignment);

   for (int i = 0; i < 100; i++) {
       addCellToTable(datatable, horizontalAlignmentLeft, 
   verticalAlignmentMiddle, "Přehledová tabulka", columnWidths.length, 1, 
   fontTypeBold, fontSizeRegular, cellLayout_Bottom);
   }

   return datatable;
}

1 个答案:

答案 0 :(得分:2)

  

我插入(document.leftMargin() - 50)例如,它随桌子移动到一边。我尝试了各种各样的价值观,但我找不到合适的价值观。在工作的三天内,我将尝试零: - )

你现在应该尝试零!

事实上,样本来源的that official samplethe answer here on stack overflow在应用边距时略有错误:

datatable.setTotalWidth(document.right(document.rightMargin()) - 
    document.left(document.leftMargin()));

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

因为Document方法leftbottomrighttop本身已经应用了匹配的边距,例如

public float left(float margin) {
    return pageSize.getLeft(marginLeft + margin);
}

因此,推荐的代码有效地应用了两次边距!

因此,您的方法drawTableAtTheEndOfPage应如下所示:

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

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