Вместо того, чтобы искать другие библиотеки, как насчет поиска лучшего способа вычисления ширины текста смешанного размера / стиля?
float width = ColumText.getWidth(phrase);
Фраза расширяет ArrayList различными функциями и атрибутами текстового макета.Абзац расширяет фразу.Каждый блок имеет определенный Font
со своим собственным цветом, размером и основным шрифтом PDF.Каждый блок имеет свой собственный «подъем текста» для настройки своей базовой линии.
Какую версию iText вы используете?ColumnText существует уже довольно давно.
Итак, вы хотите кернинг между обычными и надстрочными буквами?Это не очень хорошая идея для меня.Кернинг - это корректировка, поэтому, например, буква «Т» может выступать над «j».Значения кернинга предполагают общую базовую линию и размер шрифта.Вы никогда не будете делиться базовой линией, и почти наверняка будете иметь разные размеры шрифта при работе с надстрочным текстом.И даже если вы решите, что это хорошая идея - использовать эти значения (и я бы не согласился), вы указали размер базового текста или размер шрифта верхнего индекса?
Я считаю, что выцель здесь (границы текста с верхним индексом / нижним индексом с обычным текстом) приведет к ухудшению компоновки, а не к улучшению.
Или я вас неправильно понимаю?Позвольте мне перечитать ваш комментарий:
Но если вы также хотите разместить этот текст, включающий верхний индекс на странице, вам нужно использовать PdfContentByte.
Не совсемуверен, что вы имеете в виду там.Если вы хотите разместить текст в произвольном месте на странице, да, вам в значительной степени необходимо использовать PdfContentByte
.
При его использовании я не нашел способа печати сложного текстаэто включает в себя верхний индекс сразу.
Весь текст в данной команде «показывать текст» должен иметь одинаковый шрифт / размер / цвет / и т. Д.Так работает PDF , но это не является ограничением iText.
Я думаю, что это позволяет печатать только один фрагмент текста за время.
Правильно.
Поэтому я не могу измерить текст с верхним индексомпринимая во внимание кернинг, а затем поместите его в какую-то позицию на странице
. Вам необходимо сложить все ширины разных кусков вместе.Я не могу поверить, что кернинг между обычным и надстрочным текстом - хорошая идея, но образец PDF, показывающий, что проблема может убедить меня в этом.
Мне кажется, вам нужно использовать BaseFont.getWidthPointKerned(String text, float fontSize)
.Верхний индекс, нижний индекс или обычный, это все о размере шрифта и шрифте.А если вы используете Absolutely Insist, вы можете использовать BaseFont.getKerning(int c1, int c2)
, чтобы получить значение кернинга между любыми двумя буквами в одном и том же шрифте , и использовать это для определения кернинга между фрагментами.
Другой способ рисования текста с помощью iText & PdfContentByte
- с помощью ColumnText
.Я полагаю, что iText использует ColumnText при разметке абзацев, но я должен посмотреть на код, чтобы быть уверенным.
В любом случае, ваш код может выглядеть примерно так:
ColumnText colTx = new ColumnText(contByte);
// paragraphs are phrases.
colTx.addText(phraseWithSuperAndSubScriptStuff);
colTx.setSimpleColumn(llx, lly, urx, ury);
colTx.go();