Получить высоту шрифта символа в 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, чтобы лучше понять, как оно работает, и выбрать параметр, подходящий для вашей конкретной задачи.

https://en.wikipedia.org/wiki/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%, шрифт будет рядом друг с другом