在Itext 7中找到需要多种字体的字符串宽度

时间:2017-04-12 15:29:46

标签: pdf fonts itext7

使用iText 7(7.0.2),如何找到包含需要不同字体的字符的字符串的宽度?

例如,在下面的代码中,有英文和俄文字符。我想根据FontProvider分配给每个字符的字体找到该字符串的宽度。

String s = "Hello world! Здравствуй мир! Hello world! Здравствуй мир!";
FontProvider sel = new FontProvider();
sel.addFont(fontsFolder + "NotoSans-Regular.ttf");
sel.addFont(fontsFolder + "Puritan2.otf");

如果字符串只有可以用一种字体呈现的字符,我可以这样做:

PdfFont font = PdfFontFactory.createFont(fontsFolder + "Puritan2.otf", PdfEncodings.IDENTITY_H, true);
font.getWidth(s, 12f); 

鉴于FontProvider本身没有getWidth方法,我需要迭代字符串的各个部分,并根据使用的字体加上每个字符串的长度。寻找一个如何做到这一点的例子。

1 个答案:

答案 0 :(得分:2)

在非常低的级别上,你确实必须根据每个部分使用的字体迭代分解的原始字符串。

代码如下所示:

// Get the strategy that is responsible for splitting. 
// The "FreeSans" argument is the "preferred" font.
FontSelectorStrategy strategy = sel.getStrategy(s, Arrays.asList("FreeSans"));
float totalWidth = 0;
while (!strategy.endOfText()) {
    for (Glyph glyph : strategy.nextGlyphs()) {
        totalWidth += glyph.getWidth();
    }
}
// Division by font unit size, because glyph.getWidth() is a 1000-based value
totalWidth /= 1000;
// Multiplication by font size
totalWidth *= 12;