RotatedText2.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
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.FontName = "Yu Gothic";
            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);
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}