2011-04-05 288 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); 我与你有同样的问题,当上面添加代码时我发现它可以工作,希望这可以解决你的问题,谢谢。