2017-04-12 123 views
1

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

例如,在下面的代码中,有英文和俄文两种字符。我想根据由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方法,我需要遍历字符串的各部分,并根据所使用的字体累加每个字符串的长度。寻找一个如何做到这一点的例子。

回答

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; 
+0

谢谢!比我想象的要简单。欣赏基于1000的宽度和字体大小的解释。 –

+0

如何知道首选字体? –

+0

@JoeEltgroth,如果你不知道首选字体,你可以传递任何字符串,甚至是空字符串。首选字体就像在HTML中指定font-family一样。另一种字体将用于“首选”字体无法呈现所需字形的情况。但是,如果你在你的字体提供者中有“Arial”和“Times New Roman”,并且你将“Arial”设置为首选字体,那么Arial将具有更高的优先级, –

相关问题