VerticalText.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Collections.Generic;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // LTR および RTL モードにおける縦書きテキストの描画を示します。
    // また、矩形オブジェクトの周りにテキストをフローする方法も示します。
    // JapaneseColumns も参照してください。
    public class VerticalText
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            // 横向きを使用します。
            page.Landscape = true;
            var g = page.Graphics;
            // 日本語、英語、アラビア語のサンプルテキストです。
            string text1 = "日本語のサンプル文字列";
            string text2 = " テキストの方向 ";
            string text3 = "النص العربي 12 + 34 = 46 مع الأرقام ";
            // フォントキャッシュを初期化し、必要なフォントを取得します。
            var fc = new FontCollection();
            fc.RegisterDirectory(Path.Combine("Resources", "Fonts"));
            var fYuMin = fc.FindFamilyName("Yu Mincho");
            var fTimes = fc.FindFamilyName("Times New Roman");
            var fArial = fc.FindFamilyName("Arial");
            // テキストの書式を作成します。
            var tf1 = new TextFormat() { Font = fYuMin };
            var tf2 = new TextFormat() { Font = fTimes };
            var tf3 = new TextFormat() { Font = fArial };
            // TextLayout を作成し、いくつかのオプションを設定します。
            var tl = g.CreateTextLayout();
            tl.FirstLineIndent = 36;
            tl.TextAlignment = TextAlignment.Justified;
            // この設定は最後の行も両端揃えにします。
            tl.LastLineIsEndOfParagraph = false;
            // すべてのマージンを 1 インチに設定します。
            tl.MarginAll = tl.Resolution;
            tl.MaxWidth = page.Size.Width;
            tl.MaxHeight = page.Size.Height;
            // RTL レイアウト。
            tl.RightToLeft = false;
            // テキストをフローさせるオブジェクトのリストを作成します。
            tl.ObjectRects = new List<ObjectRect>()
            {
                new ObjectRect(540, 100, 120, 160),
                new ObjectRect(100, 290, 170, 100),
                new ObjectRect(500, 350, 170, 100)
            };
            // ページ上の対応する矩形を塗りつぶして表示させます。
            foreach (var or in tl.ObjectRects)
                g.FillRectangle(or.ToRectangleF(), Color.PaleVioletRed);

            // レイアウトにテキストを追加します。
            for (int i = 0; i < 3; i++)
            {
                tl.Append(text1, tf1);
                tl.Append("Horizontal Top To Bottom" + text2, tf2);
                tl.AppendLine(text3, tf3);
            }
            // 1番目のレイアウトを実行して描画します。
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, PointF.Empty);
            g.FillRectangle(tl.ContentRectangle, Color.FromArgb(20, Color.Red));

            // 2番目のレイアウトを作成します(縦方向に反時計回りに回転)。
            var t = tl.ContentHeight;
            tl.Clear();
            tl.RotateSidewaysCounterclockwise = true;
            tl.FlowDirection = FlowDirection.VerticalLeftToRight;
            tl.MarginTop += t;
            // レイアウトにテキストを追加します。
            for (int i = 0; i < 3; i++)
            {
                tl.Append(text1, tf1);
                tl.Append("Vertical Left To Right" + text2, tf2);
                tl.AppendLine(text3, tf3);
            }
            // 2番目のレイアウトを実行して描画します。
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, PointF.Empty);
            g.FillRectangle(tl.ContentRectangle, Color.FromArgb(20, Color.Green));

            // 3番目のレイアウトを作成します(縦書き)。
            tl.Clear();
            tl.FlowDirection = FlowDirection.VerticalRightToLeft;
            tl.RotateSidewaysCounterclockwise = false;
            // レイアウトにテキストを追加します。
            for (int i = 0; i < 3; i++)
            {
                tl.Append(text1, tf1);
                tl.Append("Vertical Right To Left" + text2, tf2);
                tl.AppendLine(text3, tf3);
            }
            // 3番目のレイアウトを実行して描画します。
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, PointF.Empty);
            g.FillRectangle(tl.ContentRectangle, Color.FromArgb(20, Color.Blue));
            // PDF ドキュメントを保存します。
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}