无法正确计算itext PdfPTable / PdfPCell高度

时间:2014-06-27 09:24:25

标签: java height itext pdfptable

我在尝试生成PdfPTable并在将其添加到文档之前计算其高度时遇到问题。 PdfPTable的方法calculateHeights返回的高度比页面的高度大很多(当表格大约是页面高度的1/4时),所以我写了一个计算高度的方法:

protected Float getVerticalSize() throws DocumentException, ParseException, IOException {
    float overallHeight=0.0f;
    for(PdfPRow curRow : this.getPdfObject().getRows()) {
        float maxHeight = 0.0f;
        for(PdfPCell curCell : curRow.getCells()) {
            if(curCell.getHeight()>maxHeight) maxHeight=curCell.getHeight();
        }
        overallHeight+=maxHeight;
    }
    return overallHeight;
}

其中getPdfObject方法返回PdfPTable对象 使用调试器我发现单元格矩形的lly和ury坐标差异(以及因此高度)比将表格添加到文档后看起来要大得多(例如,一个单元格为20,另一个单元格为38高度在页面上看起来一样)。除了带有块的段落外,单元格中没有任何内容:

Font f = getFont();
        if (f != null) {
            int[] color = getTextColor();
            if(color != null) f.setColor(color[0],color[1],color[2]);
            ch = new Chunk(celltext, f);
            par = new Paragraph(ch);
        }
cell = new PdfPCell(par);
cell.setHorizontalAlignment(getHorizontalTextAlignment());
cell.setVerticalAlignment(getVerticalTextAlignment());

然后一个表添加了一个单元格,并将setWidthPercentage属性设置为某个浮点数。 我究竟做错了什么?为什么单元格的比例与生成PDF后看到的不同?也许我正在计算身高错误?不是PDF页面上单元格的高度应该严格地是lly和ury坐标之间的差异 对不起,我没有显示确切的代码,因为PDF是使用大量的中间步骤和对象生成的XML,并且它“不是很有用”我猜... 提前谢谢!

2 个答案:

答案 0 :(得分:7)

添加到可用宽度为400的页面的表格高度与添加到可用宽度为1000的页面的表格高度不同。您无法正确测量高度直到宽度已定义。

可以通过将表添加到文档来完成宽度的定义。渲染表格后,总高度已知。

如果您想提前知道高度,则需要提前定义宽度。例如,使用:

table.setTotalWidth(400);
table.setLockedWidth(true);

TableHeight示例中对此进行了解释。在table_height.pdf中,您会看到iText在添加表格之前返回0 的高度,在添加表格后高度为48 。 iText最初返回0,因为无法确定实际高度。

然后我们采用相同的表格,我们定义总宽度为50(比页面上可用宽度的原始80%小得多)。现在,当我们用相同的内容计算表格的高度时,iText会返回192而不是48.当您查看页面上的表格时,高度差异的原因是显而易见的。

答案 1 :(得分:2)

为了获得动态表格高度,我们应该设置并锁定表格的宽度。 在这里, 595是A4尺寸的纸张宽度。

table.setTotalWidth(595);
table.setLockedWidth(true);