2013-06-18 26 views
6

Istnieje metoda w klasie czcionek PDFBox, PDFont, o nazwie getFontHeight, która brzmi dość prosto. Jednak nie bardzo rozumiem dokumentację i jakie parametry oznaczają.Uzyskaj wysokość czcionki postaci w PDFBox

getFontHeight Otrzyma szerokość czcionki dla postaci.

Parametry:

  • C - kod znaku, aby uzyskać szerokość.
  • offset - Przesunięcie do tablicy. długość
  • Długość danych.

Powroty: Szerokość w 1000 jednostkę przestrzeni tekstu, czyli 333 lub 777

ta metoda jest właściwy do użycia, aby uzyskać wysokość znaku w PDFBox a jeśli tak, w jaki sposób? Czy jest to jakiś rodzaj związku między wysokością czcionki a rozmiarem czcionki, z której mogę korzystać?

Odpowiedz

6

Uważam, że odpowiedź oznaczona jako poprawna wymaga dodatkowych wyjaśnień.Nie ma "błędu" na czcionkę dla getHeight() i dlatego uważam, że nie jest to dobrą praktyką ręczne odgadywanie współczynnika dla każdej nowej czcionki. Zgadnij, może to być dobre dla twoich celów, po prostu użyj CapHeight zamiast Height.

float height = (font.getFontDescriptor().getCapHeight())/1000 * fontSize; 

To zwróci wartość podobną do tego, co starają się dostać przez korygowanie wysokości z 0,865 do Helvetica. Ale będzie uniwersalna dla każdej czcionki.

Dokumenty PDFBox nie wyjaśniają zbyt wiele, co to jest. Ale możesz spojrzeć na obraz w artykule Cap_height wikipedii, aby lepiej zrozumieć, jak działa i wybrać parametr pasujący do konkretnego zadania.

https://en.wikipedia.org/wiki/Cap_height

7

EDYCJA: Wysokość czapki była tym, czego szukałem. Zobacz zaakceptowaną odpowiedź.

Po wykopaniu źródła PDFBox odkryłem, że powinno to pomóc w obliczeniu wysokości czcionki.

int fontSize = 14; 
PDFont font = PDType1Font.HELVETICA; 
font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize 

Metoda ta nie jest jednak idealna. Jeśli narysujesz prostokąt o wysokości 200 i Y z rozmiarem 200, otrzymasz wysokość czcionki 231,2 obliczoną powyższą metodą, mimo że faktycznie jest ona drukowana mniejszą niż prostokąt.

Każda czcionka ma inny błąd, ale w przypadku helveticy jest ona zbliżona do wartości 13,5 za dużo niezależnie od rozmiaru czcionki. Dlatego, aby uzyskać odpowiednią wysokość czcionki dla helvetica, to działa ...

font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize * 0.865 
0

jest to metoda pracy na podział tekstu i znalezienie wysokość

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; 
} 
0

za importowane True Type Czcionki łączna wysokość czcionki jest

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

Znajdziecie że font.getFontDescriptor().getFontBoundingBox().getHeight() jest o 20% większy niż powyższa wartość, ponieważ zawiera 20% prowadzących do powyższej wartości, ale jeśli wybierzesz najwyższą wartość i usuniesz 20%, czcionka będzie obok siebie zbyt dokładnie

+0

Istnieje wiele problemów w formule: * (A) * The Descent ** ** jest liczbą ujemną; aby twoja formuła miała jakikolwiek sens, należy użyć jej wartości bezwzględnej (tj. '-... getFontDescriptor(). getDescent()'). * (B) * Dla określenia ** Ascent ** wysokość glifów dla znaków akcentowanych jest wykluczona; jeśli uznasz znaki akcentowane za część czcionki, zatem formuła nie może być właściwa. Ponadto dodajesz "wielkość punktu" bez wyjaśnienia tego. Ta wartość nie jest trywialna. – mkl