获取PDFBox中字符的字体高度

时间:2013-06-18 14:41:26

标签: java fonts font-size pdfbox

PDFBox的字体类中有一个方法,PDFont,名为getFontHeight,听起来很简单。但是我不太了解文档以及参数代表什么。

  

getFontHeight   这将获得角色的字体宽度。

     

参数:

     
      
  • c - 获取宽度的字符代码。
  •   
  • offset - 数组的偏移量。长度
  •   
  • 数据的长度。
  •   
     

返回:宽度为1000单位的文本空间,即333或777

这种方法是否正确用于获取PDFBox中字符的高度,如果是这样的话?我可以使用字体高度和字体大小之间的某种关系吗?

5 个答案:

答案 0 :(得分:9)

我认为标记为正确的答案需要进一步澄清。 getHeight()的每种字体都没有“错误”,因此我认为手动猜测每种新字体的系数并不是一个好习惯。 猜猜它可能对你的目的很好,只需使用CapHeight而不是Height。

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

通过用Helvetica的0.865校正高度,这将返回类似于你想要得到的值。但它对于任何字体都是通用的。

PDFBox文档没有解释太多它是什么。但您可以查看维基百科Cap_height文章中的图像,以更好地了解它的工作原理,并选择适合您特定任务的参数。

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

答案 1 :(得分:8)

编辑:帽子高度是我想要的。请参阅接受的答案。

在深入研究PDFBox的源代码后,我发现这应该可以解决字体高度的问题。

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

但这种方法并不完美。如果您绘制一个高度为200的矩形和一个字体大小为200的Y,您将获得使用上述方法计算的字体高度231.2,即使它实际上打印的尺寸小于矩形。

每种字体都有不同的错误,但是对于helvetica,它与字体大小无关,接近13.5%。因此,为了获得helvetica的正确字体高度,这可以...

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

答案 2 :(得分:0)

也许用这个?

http://pdfbox.apache.org/apidocs/org/apache/pdfbox/util/TextPosition.html

看起来像文本的环绕效用。如果它考虑到字体错误,我没有查看源代码。

答案 3 :(得分:0)

这是分割文本和找到高度的工作方法

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

答案 4 :(得分:0)

对于导入的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%,那么字体将是下一个太彼此了