【问题标题】:unable to calculate itext PdfPTable/PdfPCell height properly无法正确计算 itext PdfPTable/PdfPCell 高度
【发布时间】:2014-08-18 08:33:55
【问题描述】:

我在尝试生成 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 生成的,我猜它“按原样”不是很有用...
提前致谢!

【问题讨论】:

    标签: java height itext pdfptable


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 非常感谢布鲁诺!出于某种原因,我认为setWidthPercentage 也可以解决问题。也许是因为表格的高度不是零,而当我之前寻找答案时,未渲染的表格返回的高度等于零。我将尝试计算表格的宽度并设置这些属性。
    • 更新:在计算并设置了确切的宽度后,现在一切正常。再次非常感谢您的回答和这个很酷的乐器!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多