2014-06-27 108 views
1

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

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这是不是很有用的“原样”我猜...
在此先感谢!

回答

4

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

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

如果您想事先知道高度,则需要事先定义宽度。例如,通过使用:

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

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

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

+0

非常感谢Bruno! 出于某种原因,我认为'setWidthPercentage'也有诀窍。也许是因为桌子的高度不是零,而当我在以前寻找答案时,未渲染的桌子将其高度返回为零。我将尝试计算表格的宽度并设置这些属性。 –

+0

更新:计算并设置确切的宽度后,现在一切正常。非常感谢你的回答和这个很酷的乐器! –

1

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

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