Java 获取PDFBox中字符的字体高度

Java 获取PDFBox中字符的字体高度,java,fonts,font-size,pdfbox,Java,Fonts,Font Size,Pdfbox,PDFBox的字体类PDFont中有一个名为getFontHeight的方法,听起来很简单。但是,我不太理解文档和参数代表什么 这将获得字符的字体宽度 参数: c-获取宽度的字符代码 偏移量-阵列中的偏移量。长度 数据的长度 返回:宽度为1000个文本空间单位,即333或777 此方法是否适合用于获取PDFBox中字符的高度?如果是,如何获取?我可以使用字体高度和字体大小之间的某种关系吗 编辑:帽子的高度是我想要的。见公认的答案 在挖掘了PDFBox的源代码后,我发现这应该可以计算字体高度

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

这将获得字符的字体宽度

参数:

  • c-获取宽度的字符代码
  • 偏移量-阵列中的偏移量。长度
  • 数据的长度
返回:宽度为1000个文本空间单位,即333或777


此方法是否适合用于获取PDFBox中字符的高度?如果是,如何获取?我可以使用字体高度和字体大小之间的某种关系吗

编辑:帽子的高度是我想要的。见公认的答案

在挖掘了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
也许用这个


似乎是文本的环绕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;
}
public float heightForWidth(float width)引发IOException{
浮动高度=0;

String[]split=getText().split((?对于导入的True Type字体,字体的总高度为

(org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getDescent()+org.apache.pdfbox.pdmodel.font.PDFont.getFontDescriptor().getAscent()+org.apache.pdfbox.getFontDescriptor().getLeading())*点大小*org.apache.pdfbox.pdmodel.font.PDFont.getFontMatrix().getValue(0,0)


您将发现
font.getFontDescriptor().getFontBoundingBox().getHeight()
比上面的值大20%,因为它在上面的值上包含了一个20%的前导,但是如果你取最上面的值并删除20%,字体也会紧靠在一起

我相信标记为右的答案需要一些额外的说明。getHeight()的每种字体都没有“错误”因此,我认为手动猜测每种新字体的系数不是一个好的做法。 我想这对你来说是件好事,用CapHeight代替Height

float height = ( font.getFontDescriptor().getCapHeight()) / 1000 * fontSize;
这将返回一个值,该值与您试图通过对Helvetica的高度进行0.865修正得到的值相似。但它对于任何字体都是通用的

PDFBox文档没有太多解释它是什么。但是你可以查看wikipedia Cap_height文章中的图片,更好地了解它是如何工作的,并选择适合你特定任务的参数


您的公式中存在多个问题:(A)下降是一个负数;要使公式有任何意义,应使用其绝对值(即
-…getFontDescriptor()。getDescent()
)。(B)为了确定上升,重音字符的字形高度被排除;如果你考虑重音字符部分的字体,因此,公式不能是正确的。此外,你包括一个<代码>点大小< /代码>没有解释它。这个值不是微不足道的。