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

но это не работает. setHorizontalAlignment центрируется, но не setVerticalAlignment.

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

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

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

Это решение адаптировано из email от Paulo Soares.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

cell.setBackgroundColor(BaseColor.GRAY);
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setUseAscender(true);