2011-04-05 448 views
10

我想垂直對齊我的Headet單元格文本是在單元格高度的中間。iText:PdfTable單元格垂直對齊

這是我的代碼:

PdfPCell c1 = new PdfPCell(cerate_phrase("" ,regular_bold)); 
    c1.setHorizontalAlignment(Element.ALIGN_CENTER); 
    c1.setVerticalAlignment(Element.ALIGN_MIDDLE); 
    c1.setBackgroundColor(BaseColor.LIGHT_GRAY); 
    table_.addCell(c1); 

但這並不工作.. setHorizo​​ntalAlignment爲中心,但沒有參考setVerticalAlignment。

我做錯了什麼?我怎麼能在中間?

任何幫助將意義重大。

+0

此問題已被多次詢問(並回答)。搜索PdfCell垂直對齊。 – 2011-04-05 18:28:15

+0

@ Mark Storer:我發現這個問題:iText - 垂直對齊不能在複合模式下工作 - 但它不適用於我。有任何想法嗎? – user590586 2011-04-07 09:49:21

+0

@MarkStorer你可以鏈接到愚蠢?我的搜索沒有任何東西。 – djeikyb 2012-11-28 18:28:16

回答

18

根據Lowagie:

PdfPCell cell = new PdfPCell(new Phrase("blah Blah blah"); 
cell.setVerticalAlignment(Element.ALIGN_MIDDLE); 

這始終是在技術意義上是正確的,但有時也很糟糕。

要居中,圍繞對象繪製一個框,找到它的中心,並將其與其周圍對象的中心對齊。

iText因此找到短語的中心,並對齊它。但是人類的眼睛有時會把注意力集中在大量的文本上,比如基線和帽高之間的字體部分。所以爲了讓它看起來不錯,你需要相對中心。

Phrase content = new Phrase("Blah blah blah", Font); 

Float fontSize = content.getFont().getSize(); 
Float capHeight = content.getFont().getBaseFont().getFontDescriptor(BaseFont.CAPHEIGHT, fontSize); 

Float padding = 5f;  

PdfPCell cell = new PdfPCell(content); 
cell.setPadding(padding); 
cell.setPaddingTop(capHeight - fontSize + padding); 

請注意,未使用PdfPCell方法setVerticalAlignment(..)。

看起來這似乎不一定適用於多行短語,但它確實如此。

Typography Line Terms

的問題是顯而易見的,如果iText的能顯示周圍的事物包圍盒(頭腦,你可以告訴iText的繪製邊界框,它的on/off開關比一個神奇的只是更多的工作)。

該解決方案改編自email from Paulo Soares

+0

這個想法很好,但它並不完美。我不認爲浮動「填充」應該固定爲「5f」 – 2013-01-15 13:02:44

+2

試試這個:setPaddingBottom(2 *(fontSize-capHeight));你調用'setVerticalAlignment(Element.ALIGN_MIDDLE);' – 2013-01-15 13:22:55

+0

@djeikyb超級你節省了我的時間..謝謝+1投票你的答案。 – 2017-05-01 09:31:19

6

添加cell.setUseAscender(true)之前c1.setVerticalAlignment(Element.ALIGN_MIDDLE); 我與你有同樣的問題,當上面添加代碼時我發現它可以工作,希望這可以解決你的問題,謝謝。