2017-04-12 4 views
1

En utilisant iText 7 (7.0.2), comment trouver la largeur d'une chaîne qui contient des caractères nécessitant des polices différentes?Dans Itext 7 trouver la largeur d'une chaîne nécessitant plusieurs polices

Par exemple, dans le code ci-dessous, il y a des caractères anglais et russe. Je voudrais trouver la largeur de cette chaîne basée sur les polices assignées à chaque caractère par un FontProvider.

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

Si la chaîne n'avait des caractères qui peuvent être affichés avec une police, je pouvais le faire:

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

Étant donné qu'il n'y a pas une méthode getWidth sur le FontProvider lui-même, je vais avoir besoin Itérer à travers les morceaux de la chaîne et additionner la longueur de chacun en fonction de la police utilisée. Vous cherchez un exemple de comment faire cela.

Répondre

2

À un niveau très bas, vous devez en effet parcourir les morceaux de la corde d'origine décomposée en fonction de la police utilisée pour chaque pièce.

Le code ressemblerait à ceci:

// 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

Merci! Plus simple que je pensais. Appréciez l'explication de la largeur basée sur 1000 et de la taille de police également. –

+0

Comment connaît-on la police préférée? –

+0

@JoeEltgroth, si vous ne connaissez pas la police préférée, vous pouvez passer n'importe quelle chaîne, même vide. La police préférée est quelque chose comme la spécification de font-family en HTML. Une autre police sera utilisée dans le cas où la police "préférée" ne peut pas rendre les glyphes désirés de toute façon. Mais si, disons, vous avez "Arial" et "Times New Roman" dans votre fournisseur de polices et que vous définissez "Arial" comme police préférée, Arial aura une priorité plus élevée, toutes choses égales par ailleurs –