iText:PdfTable单元垂直对齐

问题描述 投票:12回答:4

我正在尝试垂直对齐mat标题单元格文本在单元格高度的中间。

这是我的代码:

    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);

但这不起作用。 setHorizontalAlignment居中,但不是setVerticalAlignment

难道我做错了什么?我怎样才能在中间垂直对齐?

任何帮助将不胜感激。

java pdf-generation itext vertical-alignment
4个回答
21
投票

根据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绘制边界框,它只是一个神奇的开/关切换工作),问题就很明显了。

该解决方案改编自email from Paulo Soares


14
投票

cell.setUseAscender(true)之前添加c1.setVerticalAlignment(Element.ALIGN_MIDDLE);我和你有同样的问题,当添加上面的代码我发现它可以工作,希望这可以解决你的问题,谢谢。


0
投票

您可以使用ExtraParagraphSpace选项:

c1.HorizontalAlignment = Element.ALIGN_CENTER;
c1.VerticalAlignment = Element.ALIGN_MIDDLE;
c1.ExtraParagraphSpace = 2;

0
投票

你不能这样做:

cell.setBackgroundColor(BaseColor.GRAY);
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setUseAscender(true);
© www.soinside.com 2019 - 2024. All rights reserved.