Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get the font height of a character in PDFBox

There is a method in PDFBox's font class, PDFont, named getFontHeight which sounds simple enough. However I don't quite understand the documentation and what the parameters stand for.

getFontHeight This will get the font width for a character.

Parameters:

  • c - The character code to get the width for.
  • offset - The offset into the array. length
  • The length of the data.

Returns: The width is in 1000 unit of text space, ie 333 or 777

Is this method the right one to use to get the height of a character in PDFBox and if so how? Is it some kind of relationship between font height and font size I can use instead?

like image 793
Simon Bengtsson Avatar asked Jun 18 '13 14:06

Simon Bengtsson


2 Answers

I believe the answer marked right requires some additional clarification. There are no "error" per font for getHeight() and hence I believe it is not a good practice manually guessing the coefficient for each new font. Guess it could be nice for your purposes simply use CapHeight instead of Height.

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

That will return the value similar to what you are trying to get by correcting the Height with 0.865 for Helvetica. But it will be universal for any font.

PDFBox docs do not explain too much what is it. But you can look at the image in the wikipedia Cap_height article to understand better how it is working and choose the parameter fit to your particular task.

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

like image 148
engilyin Avatar answered Sep 19 '22 14:09

engilyin


EDIT: Cap height was what I was looking for. See the accepted answer.

After digging through the source of PDFBox I found that this should do the trick of calculating the font height.

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

The method isn't perfect though. If you draw a rectangle with the height 200 and a Y with the font size 200 you get the font height 231.2 calculated with the above method even though it actually is printed smaller then the rectangle.

Every font has a different error but with helvetica it is close to 13.5 precent too much independently of font size. Therefore, to get the right font height for helvetica this works...

font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize * 0.865
like image 24
Simon Bengtsson Avatar answered Sep 17 '22 14:09

Simon Bengtsson