2017-04-12 16 views
1

iText 7(7.0.2)を使用すると、異なるフォントを必要とする文字を含む文字列の幅をどのように見つけることができますか?Itext 7複数のフォントを必要とする文字列の幅を調べる

たとえば、以下のコードでは、英語とロシア語の両方の文字があります。私はFontProviderによって各文字に割り当てられたフォントに基づいて、その文字列の幅を探したいと思います。

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

文字列は1つのフォントのみでレンダリングできる文字を持っていた場合、私はこれを行うことができます:

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

のgetWidth方法がFontProvider自体に存在しないことを考えると、私は必要があります文字列の部分を反復し、使用されるフォントに基づいてそれぞれの長さを加算します。これを行う方法の例を探しています。

答えて

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は他のすべてが等しい –

関連する問題