Получить высоту шрифта символа в PDFBox
в классе шрифтов PDFBox, PDFont, есть метод с именем getFontHeight, который звучит достаточно просто. Однако я не совсем понимаю документацию и то, что означают параметры.
getFontHeight
Это позволит получить ширину шрифта для символа.параметры:
- c-код символа для получения ширины.
- offset - смещение в массиве. длина
- длина данных.
возвращает: ширина составляет 1000 единиц текстового пространства, т. е. 333 или 777
этот метод полезен, чтобы получить высоту символа в PDFBox и если да, то как? Это какая-то связь между высотой шрифта и размером шрифта, который я могу использовать вместо этого?
5 ответов
Я считаю, что правильный ответ требует некоторых дополнительных разъяснений. Для getHeight() нет" ошибки " для каждого шрифта, и поэтому я считаю, что не рекомендуется вручную угадывать коэффициент для каждого нового шрифта. Предполагаю, что это может быть хорошо для ваших целей проще использовать Колпачоквысота вместо высоты.
float height = ( font.getFontDescriptor().getCapHeight()) / 1000 * fontSize;
это вернет значение, подобное тому, которое вы пытаетесь получить, исправив высоту с помощью 0.865 для Helvetica. Но она будет универсальной для любого шрифт.
документы PDFBox не слишком много объясняют, что это такое. Но вы можете посмотреть на изображение в статье wikipedia Cap_height, чтобы лучше понять, как оно работает, и выбрать параметр, подходящий для вашей конкретной задачи.
EDIT: высота крышки была тем, что я искал. См. принятый ответ.
после копания в источнике PDFBox я обнаружил, что это должно сделать трюк вычисления высоты шрифта.
int fontSize = 14;
PDFont font = PDType1Font.HELVETICA;
font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize
метод не идеален. Если вы нарисуете прямоугольник с высотой 200 и Y с размером шрифта 200, вы получите высоту шрифта 231.2, рассчитанную с помощью вышеуказанного метода, даже если он на самом деле напечатан меньше прямоугольника.
каждый шрифт имеет другую ошибку, но с helvetica она близка к 13.5 precent слишком много независимо от размера шрифта. Поэтому, чтобы получить правильную высоту шрифта Гельветика это работает...
font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize * 0.865
может это использовать?
http://pdfbox.apache.org/apidocs/org/apache/pdfbox/util/TextPosition.html
похоже на обертывание util для текста. Я не смотрел в источнике, если он учитывает ошибку шрифта, хотя.
это рабочий метод для разделения текста и нахождения высоты
public float heightForWidth(float width) throws IOException {
float height = 0;
String[] split = getTxt().split("(?<=\W)");
int[] possibleWrapPoints = new int[split.length];
possibleWrapPoints[0] = split[0].length();
for (int i = 1; i < split.length; i++) {
possibleWrapPoints[i] = possibleWrapPoints[i - 1] + split[i].length();
}
float leading = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
int start = 0;
int end = 0;
for (int i : possibleWrapPoints) {
float w = font.getStringWidth(getTxt().substring(start, i)) / 1000 * fontSize;
if (start < end && w > width) {
height += leading;
start = end;
}
end = i;
}
height += leading;
return height + 3;
}
для импортированных шрифтов True Type общая высота шрифта составляет
(org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getDescent() + org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getAscent() + org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getLeading()) * point size * org.apache.pdfbox.pdmodel.font.PDFont.getFontMatrix().getValue(0, 0)
вы найдете, что font.getFontDescriptor().getFontBoundingBox().getHeight()
на 20% больше, чем указанное выше значение, поскольку оно включает в себя 20% лидирующее значение, но если вы возьмете верхнее значение и удалите 20%, шрифт будет рядом друг с другом