RotatedText2.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using System.Numerics;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;

namespace DsPdfWeb.Demos.Basics
{
    // 演示如何使用 GcPdfGraphics.Transform 旋转文本字符串
    // (使用矩阵乘法的替代方法)。
    // 另请参阅RotatedText。
    public class RotatedText2
    {
        public int CreatePDF(Stream stream)
        {
            // 旋转角度,顺时针度数:
            float angle = -45;
            //
            var doc = new GcPdfDocument();
            var g = doc.NewPage().Graphics;
            // 创建文本布局,选择字体和字体大小:
            TextLayout tl = g.CreateTextLayout();
            tl.DefaultFormat.Font = StandardFonts.Times;
            tl.DefaultFormat.FontSize = 24;
            // 添加文本,并进行布局:
            tl.Append("旋转的文本。");
            tl.PerformLayout(true);
            // 文本插入点位于 (1",1"):
            var ip = new PointF(72, 72);
            // 现在我们有了文本大小,创建文本矩形,左上角位于插入点:
            var rect = new RectangleF(ip.X, ip.Y, tl.ContentWidth, tl.ContentHeight);
            // 旋转中心点在文本边界矩形的中间:
            var center = new PointF(ip.X + tl.ContentWidth / 2, ip.Y + tl.ContentHeight / 2);
            // 可以通过矩阵相乘来组合变换。
            // 请注意,矩阵乘法不可交换 -
            // 操作数的顺序很重要,从最后到第一个应用
            // 矩阵相乘:
            // 3) 将原点平移回(0,0):
            // 2)绕新原点旋转指定角度:
            // 1) 将原点从默认 (0,0) 平移到旋转中心:
            g.Transform =
                Matrix3x2.CreateTranslation(-center.X, -center.Y) *
                Matrix3x2.CreateRotation((float)(angle * Math.PI) / 180f) *
                Matrix3x2.CreateTranslation(center.X, center.Y);
            // 绘制旋转文本和边框:
            g.DrawTextLayout(tl, ip);
            g.DrawRectangle(rect, Color.Black, 1);
            // 删除变换并在非旋转文本所在的位置绘制边界矩形:
            g.Transform = Matrix3x2.Identity;
            g.DrawRectangle(rect, Color.ForestGreen, 1);
            // 完毕:
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}