2014-06-27 110 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);