iText: вертикальное выравнивание ячейки PdfTable - PullRequest
12 голосов
/ 05 апреля 2011

Я пытаюсь выровнять текст моей ячейки по вертикали так, чтобы он находился посередине высоты ячейки.

Это мой код:

    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.

Я что-то не так делаю?как я могу вертикально выровнять его по центру?

Любая помощь будет оценена.

Ответы [ 4 ]

21 голосов
/ 28 ноября 2012

По Лоуаги:

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 рисовать ограничивающие рамки, это просто больше работы, чем волшебный выключатель).

Это решение адаптировано из электронного письма от Пауло Соареса .

14 голосов
/ 06 февраля 2017

Добавить cell.setUseAscender(true) до c1.setVerticalAlignment(Element.ALIGN_MIDDLE); У меня та же проблема с вами, когда я добавляю приведенный выше код, я считаю, что он может работать, надеюсь, это поможет решить вашу проблему, спасибо.

0 голосов
/ 11 апреля 2019

Вы не можете делать так:

cell.setBackgroundColor(BaseColor.GRAY);
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setUseAscender(true);
0 голосов
/ 24 января 2019

Вы можете использовать опцию ExtraParagraphSpace:

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