2013-06-18 10 views
6

C'è un metodo nella classe di font PDFBox, PDFont, chiamata getFontHeight che sembra abbastanza semplice. Tuttavia, non capisco perfettamente la documentazione e quali sono i parametri.Ottieni l'altezza del carattere di un personaggio in PDFBox

getFontHeight questo otterrà la larghezza di un carattere font.

Parametri:

  • c - il codice del carattere per ottenere la larghezza per.
  • offset: l'offset nell'array. lunghezza
  • La lunghezza dei dati.

Returns: La larghezza è di 1.000 unità di spazio del testo, vale a dire 333 o 777

È questo il metodo giusto da utilizzare per ottenere l'altezza di un personaggio in PDFBox ed in caso affermativo Come? È una specie di relazione tra altezza del carattere e dimensione del carattere che posso usare?

risposta

6

Credo che la risposta contrassegnata come corretta richiede ulteriori chiarimenti.Non ci sono "errori" per font per getHeight() e quindi credo che non sia una buona pratica indovinare manualmente il coefficiente per ogni nuovo font. Indovina che potrebbe essere bello per i tuoi scopi, semplicemente usa CapHeight invece di Height.

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

che restituirà il valore simile a quello che si sta cercando di ottenere correggendo l'altezza con 0.865 per Helvetica. Ma sarà universale per qualsiasi tipo di carattere.

I documenti PDFBox non spiegano troppo cosa sia. Ma puoi guardare l'immagine nell'articolo Cap_height di wikipedia per capire meglio come funziona e scegliere il parametro adatto alla tua specifica attività.

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

7

MODIFICA: l'altezza del cappuccio era ciò che stavo cercando. Vedi la risposta accettata.

Dopo aver scavato nella fonte di PDFBox ho scoperto che questo dovrebbe fare il trucco di calcolare l'altezza del carattere.

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

Il metodo non è perfetto, però. Se si disegna un rettangolo con l'altezza 200 e una Y con la dimensione del carattere 200, si ottiene l'altezza del carattere 231.2 calcolata con il metodo precedente anche se in realtà viene stampata più piccola del rettangolo.

Ogni carattere ha un errore diverso ma con helvetica è vicino a 13.5 precedere troppo indipendentemente dalla dimensione del carattere. Pertanto, per ottenere l'altezza del carattere giusta per helvetica questo funziona ...

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

questo è un metodo di lavoro per dividere il testo e trovare l'altezza

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

Per importati True Type fonts l'altezza totale del font è

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

Troverete che font.getFontDescriptor().getFontBoundingBox().getHeight() è maggiore del 20% rispetto al valore precedente poiché include un 20% che porta al valore sopra, ma se si prende il valore superiore e si rimuove il 20%, il carattere sarà giusto uno accanto all'altro

+0

ci sono più problemi nella formula: * (A) * La ** ** Descent è un numero negativo; perché la tua formula abbia un senso in tutto il suo valore assoluto (ad esempio '-... getFontDescriptor(). getDescent()') dovrebbe essere usato. * (B) * Per determinare ** Ascent ** viene esclusa l'altezza dei glifi per i caratteri accentati; se consideri parte accentata del carattere, quindi, la formula non può essere corretta. Inoltre includi una "dimensione in punti" senza spiegarla. Questo valore non è banale. – mkl

Problemi correlati