使用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方法,我需要迭代字符串的各个部分,并根据使用的字体加上每个字符串的长度。寻找一个如何做到这一点的例子。
答案 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;