3

我在尝试生成 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;
}

wheregetPdfObject方法返回一个 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,它我猜“按原样”不是很有用......
在此先感谢!

4

2 回答 2

7

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

可以通过将表格添加到文档来定义宽度。一旦表格被渲染,总高度是已知的。

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

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

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

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

于 2014-06-27T09:45:15.967 回答
2

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

table.setTotalWidth(595);
table.setLockedWidth(true);
于 2016-11-26T08:27:18.060 回答