2017-04-12 81 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將具有更高的優先級, –

相關問題