iText - ColumnText texte d'un ajustement de la taille dans le Rectangle

Je veux ajouter du texte dans un rectangle(x,y,w,h). Le texte doit être équipé de la taille du rectangle (dire qu'il a une taille maximale, mais il contient toujours dans le rectangle).

J'ai essayé de mesurer la taille du texte de base sur BaseFont.getWidthPoint() Le problème, c'est la finale la taille du texte peut pas s'adapter à la rect. Il ressemble à ceci:

iText - ColumnText texte d'un ajustement de la taille dans le Rectangle

Voici mon essai:

  PdfContentByte cb = writer.getDirectContent();
    cb.saveState();
    ColumnText ct = new ColumnText(writer.getDirectContent());
    Font font = new Font(BaseFont.createFont());
    int rectWidth = 80;
    float maxFontSize = getMaxFontSize(BaseFont.createFont(), "text", rectWidth );
    font.setSize(maxFontSize);
    ct.setText(new Phrase("test", font));
    ct.setSimpleColumn(10, 10, rectWidth , 70);
    ct.go();        

    //draw the rect
    cb.setColorStroke(BaseColor.BLUE);
    cb.rectangle(10, 10, rectWidth , 70);
    cb.stroke();
    cb.restoreState();

   //get max font size base on rect width
  private static float getMaxFontSize(BaseFont bf, String text, int width){
    float measureWidth = 1;
    float fontSize = 0.1f;
    float oldSize = 0.1f;
    while(measureWidth < width){
        measureWidth = bf.getWidthPoint(text, fontSize);     
        oldSize = fontSize;
        fontSize += 0.1f;
    }

    return oldSize;
}

Pourriez-vous me dire où je me trompe?

Un autre problème, je veux mesurer à la fois la largeur et la hauteur, le texte complètement contient en rectangle et a la taille maximale. Est-il possible de faire cela?

Mise à jour: voici le code source complet qui a fonctionné pour moi:

   private static float getMaxFontSize(BaseFont bf, String text, int width, int height){
   //avoid infinite loop when text is empty
    if(TextUtils.isEmpty(text)){
        return 0.0f;
    }


    float fontSize = 0.1f;
    while(bf.getWidthPoint(text, fontSize) < width){
        fontSize += 0.1f;
    }

    float maxHeight = measureHeight(bf, text, fontSize);
    while(maxHeight > height){
        fontSize -= 0.1f;
        maxHeight = measureHeight(bf, text, fontSize);
    };

    return fontSize;
}

public static  float measureHeight(BaseFont baseFont, String text, float fontSize) 
{ 
    float ascend = baseFont.getAscentPoint(text, fontSize); 
    float descend = baseFont.getDescentPoint(text, fontSize); 
    return ascend - descend; 
}
je veux mesurer à la fois la largeur et la hauteur, le texte complètement contient en rectangle et a le maximum de la taille de la police. - voulez-vous dire qu'en une seule ligne (qui est l'endroit où votre code actuel est dirigé) ou voulez-vous aussi pour permettre des sauts de ligne pour mieux remplir le rectangle?
J'ai juste besoin d'une ligne de texte
Dans ce cas, d'appliquer les correctifs je l'ai mentionné dans ma réponse et, en plus, ne pas permettre plus de tailles de police que le rectangle de sommets.

OriginalL'auteur R4j | 2013-12-25