DrawRotatedText.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © 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
{
    // このデモでは、GcGraphics.DrawRotatedText() メソッドを使用した結果を示します。
    // 引数をさまざまに組み合わせて使用​​します。
    // DrawRotatedText() メソッドは、指定された四角形内で回転されたテキストを描画します。
    // これは、回転されたテキストが境界線なしで MS Excel セルに描画される方法と似ています。
    // DrawSlantedText も参照してください。
    public class DrawRotatedText
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.Pages.Add();
            var g = page.Graphics;
            // レイアウトを管理するためにいくつかの値を設定
            var gap = g.Resolution;
            var w = page.Size.Width / 3;
            var h = w;

            // さまざまな負の角度でテキストを描画
            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);
            // さまざまな正の角度でテキストを描画
            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);
            // さまざまな垂直スタックを使用してテキストを描画
            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 は、ターゲット四角形(緑) 内のテキスト(赤) の位置に影響します
            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);
            // 異なる TextAlignment 値を使用して垂直に積み上げられたテキストを描画します
            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);
            // 異なる TextAlignment 値を使用して水平方向に積み上げられたテキストを描画します
            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);

            // PDF ドキュメントを保存します。
            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)
        {
            // 現在の DrawRotatedText 引数の値を示す凡例を描画します
            var tlLegend = g.CreateTextLayout();
            tlLegend.DefaultFormat.FontName = "Yu gothic";
            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);

            // DrawRotatedText 呼び出しのターゲット四角形
            var d = tlLegend.ContentHeight + 12;
            rect.Y += d;
            rect.Height -= d;

            // 描画するテキストのレイアウト
            var tl = g.CreateTextLayout();
            tl.DefaultFormat.SidewaysInVerticalText = true;
            tl.DefaultFormat.FontName = "Yu gothic";
            tl.DefaultFormat.FontSize = 12;
            tl.Append("DioDocs(ディオドック)は、Excelや PDFなどの文書を、コードからAPIを利用 することで操作できます。\n");
            tl.TextAlignment = textAlign;

            // ターゲットの四角形の輪郭を緑色で囲みます
            g.DrawRectangle(rect, new GCDRAW::Pen(Color.PaleGreen, 3));
            // 実際のテキスト四角形の輪郭を赤で囲みます
            var tlCopy = tl.Clone(true);
            var tlRect = g.MeasureRotatedText(tlCopy, angle, verticalStacking, rect, rotatedAlign);
            g.DrawRectangle(tlRect, new GCDRAW::Pen(Color.Red, 1));

            // 回転したテキストを描画
            g.DrawRotatedText(tl, angle, verticalStacking, rect, rotatedAlign);
        }
    }
}