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

但这不起作用。 居中但不居中。setHorizontalAlignmentsetVerticalAlignment

我做错了什么吗?我如何将其垂直对齐在中间?

任何帮助将不胜感激。


答案 1

根据洛瓦吉的说法:

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绘制边界框,它只是比神奇的开/关开关更费力)。

该解决方案改编自Paulo Soares的电子邮件


答案 2

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


推荐