DrawRotatedText.cs
 // // This code is part of Document Solutions for PDF demos. // Copyright (c) MESCIUS inc. All rights reserved. // using System; using System.IO; using System.Drawing; using GrapeCity.Documents.Pdf; using GrapeCity.Documents.Text; using GrapeCity.Documents.Drawing; using GCTEXT = GrapeCity.Documents.Text; using GCDRAW = GrapeCity.Documents.Drawing; namespace DsPdfWeb.Demos.Basics { // This demo illustrates the results of using the GcGraphics.DrawRotatedText() method // with different combinations of arguments. // The DrawRotatedText() method draws text rotated within a specified rectangle // similar to how rotated text is drawn in MS Excel cells without borders. // See also the DrawSlantedText demo. public class DrawRotatedText { public int CreatePDF(Stream stream) { var doc = new GcPdfDocument(); var page = doc.Pages.Add(); var g = page.Graphics; // Set up some values to manage layout: var gap = g.Resolution; var w = page.Size.Width / 3; var h = w; // Draw text at different negative angles: Draw(g, q0(), angle: -90, false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); Draw(g, q1(), angle: -60, false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); Draw(g, q2(), angle: -45, false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); Draw(g, q3(), angle: -30, false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); // Draw text at different positive angles: page = doc.Pages.Add(); g = page.Graphics; Draw(g, q0(), angle: -90, false, RotatedTextAlignment.TopRight, TextAlignment.Leading); Draw(g, q1(), angle: -60, false, RotatedTextAlignment.TopRight, TextAlignment.Leading); Draw(g, q2(), angle: -45, false, RotatedTextAlignment.TopRight, TextAlignment.Leading); Draw(g, q3(), angle: -30, false, RotatedTextAlignment.TopRight, TextAlignment.Leading); // Draw text using different vertical stacking: page = doc.Pages.Add(); g = page.Graphics; Draw(g, q0(), angle: -30, verticalStacking: true, RotatedTextAlignment.TopRight, TextAlignment.Trailing); Draw(g, q1(), angle: -30, verticalStacking: false, RotatedTextAlignment.TopRight, TextAlignment.Trailing); Draw(g, q2(), angle: -30, verticalStacking: false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); Draw(g, q3(), angle: -30, verticalStacking: true, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); // RotatedTextAlignment affects the location of text (red) within the target rectangle (green): page = doc.Pages.Add(); g = page.Graphics; Draw(g, q0(), angle: -30, verticalStacking: true, RotatedTextAlignment.TopRight, TextAlignment.Trailing); Draw(g, q1(), angle: 60, verticalStacking: false, RotatedTextAlignment.BottomRight, TextAlignment.Trailing); Draw(g, q2(), angle: 30, verticalStacking: true, RotatedTextAlignment.TopLeft, TextAlignment.Leading); Draw(g, q3(), angle: -60, verticalStacking: false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); // Draw vertically stacked text using different TextAlignment values: page = doc.Pages.Add(); g = page.Graphics; Draw(g, q0(), angle: 30, verticalStacking: true, RotatedTextAlignment.TopLeft, TextAlignment.Leading); Draw(g, q1(), angle: 30, verticalStacking: true, RotatedTextAlignment.TopLeft, TextAlignment.Trailing); Draw(g, q2(), angle: 30, verticalStacking: true, RotatedTextAlignment.TopLeft, TextAlignment.Center); Draw(g, q3(), angle: 30, verticalStacking: true, RotatedTextAlignment.TopLeft, TextAlignment.Distributed); // Draw horizontally stacked text using different TextAlignment values: page = doc.Pages.Add(); g = page.Graphics; Draw(g, q0(), angle: -70, verticalStacking: false, RotatedTextAlignment.BottomLeft, TextAlignment.Leading); Draw(g, q1(), angle: -70, verticalStacking: false, RotatedTextAlignment.BottomLeft, TextAlignment.Trailing); Draw(g, q2(), angle: -70, verticalStacking: false, RotatedTextAlignment.BottomLeft, TextAlignment.Center); Draw(g, q3(), angle: -70, verticalStacking: false, RotatedTextAlignment.BottomLeft, TextAlignment.Distributed); // Done: doc.Save(stream); return doc.Pages.Count; RectangleF q0() { return new RectangleF(gap, gap, w, h); } RectangleF q1() { return new RectangleF(gap + w + gap, gap, w, h); } RectangleF q2() { return new RectangleF(gap, gap + h + gap, w, h); } RectangleF q3() { return new RectangleF(gap + w + gap, gap + h + gap, w, h); } } static void Draw(GcGraphics g, RectangleF rect, int angle, bool verticalStacking, RotatedTextAlignment rotatedAlign, TextAlignment textAlign) { // Draw a legend stating the current DrawRotatedText arguments' values: var tlLegend = g.CreateTextLayout(); tlLegend.DefaultFormat.FontName = "Calibri"; tlLegend.DefaultFormat.FontSize = 9; tlLegend.AppendLine($"Rotation angle: {angle}°"); tlLegend.AppendLine($"Text alignment: {textAlign}"); tlLegend.AppendLine($"Rotated text alignment: {rotatedAlign}"); tlLegend.AppendLine($"Is vertical stacking: {verticalStacking}"); g.DrawTextLayout(tlLegend, rect.Location); // The target rectangle for the DrawRotatedText call: var d = tlLegend.ContentHeight + 12; rect.Y += d; rect.Height -= d; // Text layout to draw: var tl = g.CreateTextLayout(); tl.DefaultFormat.FontName = "Calibri"; tl.DefaultFormat.FontSize = 12; tl.Append("The quick brown fox jumps over the lazy dog. "); tl.Append("The quick brown fox jumps over the lazy dog."); tl.TextAlignment = textAlign; // Outline the target rectangle in green: g.DrawRectangle(rect, new GCDRAW::Pen(Color.PaleGreen, 3)); // Outline the actual text rectangle in red: var tlCopy = tl.Clone(true); var tlRect = g.MeasureRotatedText(tlCopy, angle, verticalStacking, rect, rotatedAlign); g.DrawRectangle(tlRect, new GCDRAW::Pen(Color.Red, 1)); // Draw rotated text: g.DrawRotatedText(tl, angle, verticalStacking, rect, rotatedAlign); } } }