/// <summary> /// Calcula a altura que o texto vai ocupar. /// </summary> /// <param name="font">Fonte do texto</param> /// <param name="fontSize">Tamanho da fonte</param> /// <param name="width">Largura máxima do texto</param> /// <param name="text">Texto</param> /// <returns>Altura que o texto vai ocupar.</returns> internal static double GetTextHeight(org.pdfclown.documents.contents.fonts.Font font, double fontSize, double width, string text) { int lines = CountTextLines(font, fontSize, width, text); double height = font.GetLineHeight(fontSize) * lines; return(height); }
/// <summary> /// Calcula o melhor tamanho da fonte para o texto caber na largura. /// </summary> /// <param name="text"></param> /// <param name="fonte"></param> /// <param name="width"></param> /// <param name="max"></param> /// <param name="min"></param> /// <returns></returns> public static double AjustarFonte(String text, org.pdfclown.documents.contents.fonts.Font fonte, double width, double max, double min = 6) { Double size = max; double w = fonte.GetWidth(text, max); if (w > width) { size = (max * width) / w - 0.005F; size = Math.Max(min, size); } return(size); }
/// <summary> /// Imprime o campo no composer. /// </summary> /// <param name="comp"></param> public void Print(PrimitiveComposer comp, org.pdfclown.documents.contents.fonts.Font fonte, org.pdfclown.documents.contents.fonts.Font fonteBold) { BlockComposer bComp = new BlockComposer(comp); RectangleF pRect = Retangulo.GetPaddedRectangle(PaddingHorizontal, PaddingHorizontal, PaddingSuperior, PaddingInferior); comp.SetFont(fonteBold, TamanhoFonteCabecalho); ValidadeRectangle(pRect, comp); bComp.SafeBegin(pRect, XAlignmentEnum.Left, YAlignmentEnum.Top); bComp.ShowText(Cabecalho.ToUpper()); bComp.End(); bComp.LineSpace = new Length(LineSpace, Length.UnitModeEnum.Absolute); if (!String.IsNullOrWhiteSpace(Corpo)) { org.pdfclown.documents.contents.fonts.Font fonteCorpo = IsCorpoNegrito ? fonteBold : fonte; double largura = fonteCorpo.GetWidth(Corpo, CorpoTamanhoFonte); double novoTamanho = CorpoTamanhoFonte; if (!MultiLinha && largura > pRect.Width) { novoTamanho = (CorpoTamanhoFonte * pRect.Width) / largura - Utils.Mm2Pu(0.005F); comp.SetFont(fonteCorpo, novoTamanho); } comp.SetFont(fonteCorpo, novoTamanho); if (CorpoAlinhamentoY == YAlignmentEnum.Top) { float yOffSet = (float)fonteBold.GetLineHeight(TamanhoFonteCabecalho) + LineSpace; pRect.Y += yOffSet; pRect.Height -= yOffSet; } ValidadeRectangle(pRect, comp); bComp.SafeBegin(pRect, CorpoAlinhamentoX, CorpoAlinhamentoY); bComp.ShowText(Corpo); bComp.End(); } comp.SafeDrawRectangle(Retangulo); }
/// <summary> /// Conta o número de linhas que o texto vai ocupar. /// </summary> /// <param name="font">Fonte do texto</param> /// <param name="fontSize">Tamanho da fonte</param> /// <param name="width">Largura máxima do texto</param> /// <param name="text">Texto</param> /// <returns>Número de linhas</returns> internal static int CountTextLines(org.pdfclown.documents.contents.fonts.Font font, double fontSize, double width, string text) { if (string.IsNullOrWhiteSpace(text)) { return(0); } if (font == null) { throw new ArgumentNullException("font"); } if (fontSize <= 0) { throw new ArgumentOutOfRangeException("fontSize"); } if (width <= 0) { throw new ArgumentOutOfRangeException("width"); } int lines = 0; int index = 0, end; org.pdfclown.documents.contents.composition.TextFitter tf = new org.pdfclown.documents.contents.composition.TextFitter(text, width, font, fontSize, false, '-'); while (index < text.Length) { tf.Fit(index, width, true); end = tf.EndIndex; // Isso evita um loop infinito, impedindo que o index permaneça o mesmo. index = index == end ? end + 1 : end; lines++; } return(lines); }