iText: выравнивание ячейки по вертикали в формате PDF

#java #pdf-generation #itext #vertical-alignment

#java #генерация pdf #itext #выравнивание по вертикали

Вопрос:

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

Это мой код:

     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. Этот вопрос задавался (и на него давались ответы) несколько раз. Выполните поиск выравнивания по вертикали в ячейке PdfCell.

2. @ Mark Storer: Я нашел этот вопрос: iText — выравнивание по вертикали не работает в составном режиме — но у меня это не сработало. есть идеи?

3. @MarkStorer Не могли бы вы дать ссылку на дубликат? Мой поиск ничего не дал.

Ответ №1:

Согласно 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(..) не используется.

Кажется, что это не обязательно сработало бы для многострочной фразы, но это так.

Термины типографской строки

Проблема была бы очевидна, если бы iText мог показывать ограничивающие рамки вокруг объектов (имейте в виду, вы можете указать iText рисовать ограничивающие рамки, это просто больше работы, чем волшебный переключатель включения / выключения).

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

Комментарии:

1. Идея хорошая, но работает не идеально .. Я не думаю, что «заполнение» с плавающей точкой должно быть исправлено на «5f»

2. попробуйте это: setPaddingBottom(2*(fontSize-capHeight)); и вы вызываете setVerticalAlignment(Element.ALIGN_MIDDLE);

3. @djeikyb супер, ты сэкономил мое время.. Спасибо 1 голос за ваш ответ.

Ответ №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);