ArabicText.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // 此示例使用柱状布局呈现阿拉伯文本。
    // 另请参阅MultiLangJapaneseColumns。
    public class ArabicText
    {
        readonly string text = "العربية أكبر لغات المجموعة السامية من حيث عدد المتحدثين، وإحدى أكثر اللغات انتشارًا في العالم، يتحدثها أكثر من 422 مليون نسمة،1 ويتوزع متحدثوها في المنطقة المعروفة باسم الوطن العربي، بالإضافة إلى العديد من المناطق الأخرى المجاورة كالأحواز وتركيا وتشاد ومالي والسنغالوارتيرياوللغة العربية أهمية قصوى لدى أتباع الديانة الإسلامية، فهي لغة مصدري التشريع الأساسيين في الإسلام: القرآن، والأحاديث النبوية المروية عن النبي محمد، ولا تتم الصلاة في الإسلام (وعبادات أخرى) إلا بإتقان بعض من كلمات هذه اللغة. والعربية هي أيضًا لغة طقسية رئيسية لدى عدد من الكنائس المسيحية في العالم العربي، كما كتبت بها الكثير من أهم الأعمال الدينية والفكرية اليهودية في العصور الوسطى. وأثّر انتشار الإسلام، وتأسيسه دولًا، أرتفعت مكانة اللغة العربية، وأصبحت لغة السياسة والعلم والأدب لقرون طويلة في الأراضي التي حكمها المسلمون، وأثرت العربية، تأثيرًا مباشرًا أو غير مباشر على كثير من اللغات الأخرى في العالم الإسلامي، كالتركية والفارسية والأرديةوالالبانية واللغات الأفريقية الاخرى واللغات الأوروبية مثل الروسية والإنجليزية والفرنسية والأسبانية والايطالية والألمانية.كما انها تدرس بشكل رسمى او غير رسمى في الدول الاسلامية والدول الأفريقية المحادية للوطن العربى.";

        public int CreatePDF(Stream stream)
        {
            using (var reds = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "reds.jpg")))
            using (var firth = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "firth.jpg")))
            using (var purples = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "purples.jpg")))
            {
                var times = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf"));
                var ia = new ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, true, true, true, false, false);

                var doc = new GcPdfDocument();

                // 将保存并呈现文本的 TextLayout:
                var tl = new TextLayout(72);
                tl.FirstLineIndent = 18;
                tl.ParagraphSpacing = 6;
                tl.TextAlignment = TextAlignment.Justified;
                tl.RightToLeft = true;
                var tf = new TextFormat() { Font = times, FontSize = 12 };
                // 重复测试文本以填充几页:
                for (int i = 0; i < 12; ++i)
                {
                    tl.Append(text, tf);
                    tl.AppendLine();
                }

                // 将文本布局为 3 列:
                // (此示例中的逻辑/代码与JapaneseColumns相同
                const int NCOLS = 3;
                var margin = 36f;
                var gap = 18f;
                var page = doc.NewPage();
                page.Landscape = true;
                var colWid = (page.Size.Width - margin * 2 - gap * (NCOLS - 1)) / NCOLS;
                tl.MaxWidth = page.Size.Width;
                tl.MaxHeight = page.Size.Height;
                tl.MarginTop = tl.MarginBottom = margin;
                tl.MarginRight = margin;
                tl.MarginLeft = margin + (colWid + gap) * (NCOLS - 1);
                // 我们可以指定任意矩形,让文本围绕其流动。
                // 在本例中,我们添加 3 个区域来绘制一些图像:
                tl.ObjectRects = new List<ObjectRect>()
                {
                    new ObjectRect(page.Size.Width - margin - 240, margin, 240, 240),
                    new ObjectRect(margin + 100, margin + 60, 133, 100),
                    new ObjectRect(margin, page.Size.Height - margin - 300, 300, 300),
                };
                // 将对象矩形转换为图像区域,调整以提供美观的填充:
                var rReds = tl.ObjectRects[0].ToRectangleF();
                rReds.Inflate(-4, -3);
                var rFirth = tl.ObjectRects[1].ToRectangleF();
                rFirth.Inflate(-4, -3);
                var rPurples = tl.ObjectRects[2].ToRectangleF();
                rPurples.Inflate(-4, -3);
                page.Graphics.DrawImage(reds, rReds, null, ia);
                page.Graphics.DrawImage(firth, rFirth, null, ia);
                page.Graphics.DrawImage(purples, rPurples, null, ia);

                // 调用:它计算绘制文本所需的字形,并将其布局:
                tl.PerformLayout(true);

                bool done = false;
                // 当仍有文本要渲染时循环:
                while (!done)
                {
                    for (int col = 0; col < NCOLS; ++col)
                    {
                        int nextcol = (col < NCOLS - 1) ? col + 1 : 0;
                        // TextSplitOptions 告诉 TextLayout.Split() 如何布局剩余的文本。
                        // 在本例中,我们通过更新顶部和底部边距从一列前进到另一列:
                        var tso = new TextSplitOptions(tl)
                        {
                            RestMarginRight = margin + (colWid + gap) * nextcol,
                            RestMarginLeft = margin + (colWid + gap) * (NCOLS - 1 - nextcol)
                        };
                        var split = tl.Split(tso, out TextLayout rest);
                        page.Graphics.DrawTextLayout(tl, PointF.Empty);
                        if (split != SplitResult.Split)
                        {
                            done = true;
                            break;
                        }
                        tl = rest;
                    }
                    if (!done)
                    {
                        page = doc.NewPage();
                        page.Landscape = true;
                        // 我们只想在第一页上渲染图像,所以清除ObjectRects:
                        if (tl.ObjectRects != null)
                        {
                            tl.ObjectRects = null;
                            // 我们需要重做布局,但不需要重新计算字形:
                            tl.PerformLayout(false);
                        }
                    }
                }
                // 完毕:
                doc.Save(stream);
                return doc.Pages.Count;
            }
        }
    }
}