private List <Letter> DrawLetters(string text, IWritingFont font, TransformationMatrix fontMatrix, decimal fontSize, TransformationMatrix textMatrix) { var horizontalScaling = 1; var rise = 0; var letters = new List <Letter>(); var renderingMatrix = TransformationMatrix.FromValues((double)fontSize * horizontalScaling, 0, 0, (double)fontSize, 0, rise); var width = 0.0; textSequence++; for (var i = 0; i < text.Length; i++) { var c = text[i]; if (!font.TryGetBoundingBox(c, out var rect)) { throw new InvalidOperationException($"The font does not contain a character: {c}."); } if (!font.TryGetAdvanceWidth(c, out var charWidth)) { throw new InvalidOperationException($"The font does not contain a character: {c}."); } var advanceRect = new PdfRectangle(0, 0, charWidth, 0); advanceRect = textMatrix.Transform(renderingMatrix.Transform(fontMatrix.Transform(advanceRect))); var documentSpace = textMatrix.Transform(renderingMatrix.Transform(fontMatrix.Transform(rect))); var letter = new Letter(c.ToString(), documentSpace, advanceRect.BottomLeft, advanceRect.BottomRight, width, (double)fontSize, FontDetails.GetDefault(font.Name), GrayColor.Black, (double)fontSize, textSequence); letters.Add(letter); var tx = advanceRect.Width * horizontalScaling; var ty = 0; var translate = TransformationMatrix.GetTranslationMatrix(tx, ty); width += tx; textMatrix = translate.Multiply(textMatrix); } return(letters); }
private Font CreateFont( Primitives.Text text ) { Font font; FontDetails fd = new FontDetails( text); if( _mapFontDetailsToFont.TryGetValue( fd, out font ) ) { return font; } FontStyle fontStyle = FontStyle.Regular; if( (text.FontStyle & Primitives.Text.FontStyleFlags.Bold) != 0 ) { fontStyle |= FontStyle.Bold; } if( (text.FontStyle & Primitives.Text.FontStyleFlags.Italic) != 0 ) { fontStyle |= FontStyle.Italic; } if( (text.FontStyle & Primitives.Text.FontStyleFlags.Underline) != 0 ) { fontStyle |= FontStyle.Underline; } font = new Font( text.FontFamily, (float) text.FontSizePoints, fontStyle ); _mapFontDetailsToFont.Add( fd, font ); return font; }
public PdfCidCompactFontFormatFont(CompactFontFormatFontCollection fontCollection) { this.fontCollection = fontCollection; Details = GetDetails(fontCollection?.FirstFont); }