PDFBox 的字体类 PDFont 中有一个名为 getFontHeight 的方法,听起来很简单。但是我不太了解文档以及参数代表什么。
getFontHeight
这将获得字符的字体宽度。参数:
- c - 获取宽度的字符代码。
- offset - 数组的偏移量。长度
- 数据的长度。
返回: 宽度为 1000 个文本空间单位,即 333 或 777
这种方法是否适合用于获取 PDFBox 中字符的高度,如果是,如何?我可以使用字体高度和字体大小之间的某种关系吗?
PDFBox 的字体类 PDFont 中有一个名为 getFontHeight 的方法,听起来很简单。但是我不太了解文档以及参数代表什么。
getFontHeight
这将获得字符的字体宽度。参数:
- c - 获取宽度的字符代码。
- offset - 数组的偏移量。长度
- 数据的长度。
返回: 宽度为 1000 个文本空间单位,即 333 或 777
这种方法是否适合用于获取 PDFBox 中字符的高度,如果是,如何?我可以使用字体高度和字体大小之间的某种关系吗?
我相信标记为正确的答案需要一些额外的说明。getHeight() 的每种字体都没有“错误”,因此我认为手动猜测每种新字体的系数并不是一个好习惯。猜猜它可能对您的目的很好,只需使用 CapHeight 而不是 Height。
float height = ( font.getFontDescriptor().getCapHeight()) / 1000 * fontSize;
这将返回与您尝试通过将 Helvetica 的高度校正为 0.865 来获得的值相似的值。但它对任何字体都是通用的。
PDFBox 文档没有过多解释它是什么。但是您可以查看维基百科 Cap_height 文章中的图像,以更好地了解它是如何工作的,并选择适合您特定任务的参数。
编辑:帽高是我要找的。请参阅已接受的答案。
在挖掘 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
也许用这个?
http://pdfbox.apache.org/apidocs/org/apache/pdfbox/util/TextPosition.html
似乎是文本的环绕实用程序。不过,如果它导致字体错误,我还没有查看源代码。
这是分割文本和查找高度的工作方法
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;
}
对于导入的 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%,字体也会紧挨着