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

namespace GcPdfWeb.Samples.Basics
{
    // このサンプルは、Surrogates サンプルと同様に、サロゲート・ペアを含む
    // さまざまな Unicode 文字を描画します。
    // しかし、そのサンプルとは異なり、システム提供のフォールバックには依存しません。
    // 代わりに、このサンプルでは、フォールバックフォントの参照をプログラム自身の
    // フォントコレクションに意図的に制限し、独自のフォールバックフォントセットを
    // 提供しています。
    // これにより、コードのプラットフォームとシステムは独立しているため、Windows、
    // Linux、または Mac でまったく同じ結果が得られます。
    public class SurrogatesPort
    {
        public void CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;
            // Surrogates サンプルのように、標準フォント(描画するグリフが
            // ほとんどない)を指定し、FontCollection が提供するフォントフォール
            // バックサポートに依存します。
            const string fontname = "Yu Gothic"; 

            // キャプションなどの書式を設定します。
            TextFormat tf = new TextFormat() { FontName = fontname, FontSize = 12 };
            TextFormat tf1 = new TextFormat(tf) { FontSize = 14 };
            TextFormat tfs = new TextFormat(tf) { FontSize = 6 };

            // 使用するフォントコレクションを作成します。
            FontCollection fc = new FontCollection();
            // 使用するフォールバックフォントを追加します。
            // 順序は注意が必要です。最初に該当したものから適用されます。
            fc.AppendFallbackFonts(
                Font.FromFile(Path.Combine("Resources", "Fonts", "arialuni.ttf")),
                Font.FromFile(Path.Combine("Resources", "Fonts", "l_10646.ttf")),
                Font.FromFile(Path.Combine("Resources", "Fonts", "seguiemj.ttf")),
                Font.FromFile(Path.Combine("Resources", "Fonts", "seguisym.ttf")),
                Font.FromFile(Path.Combine("Resources", "Fonts", "simsun.ttc")),
                Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf")),
                Font.FromFile(Path.Combine("Resources", "Fonts", "YuGothR.ttc"))
                );
            // デフォルトのフォント検索を制限するのは TextLayout で行われるため、
            // Surrogates サンプルとは異なり、ここでは DrawString を使用できません。
            // TextLayout と DrawTextLayout を直接使用する必要があります。
            // - 使用するフォントコレクションを指定します。
            // - 既定のフォント/フォールバックの検索を指定されたコレクションのみに制限します。
            // - テキストを描画するためのほかのプロパティを設定します。
            TextLayout tl = new TextLayout(72)
            {
                // 使用するフォントコレクションを指定
                FontCollection = fc,
                // 既定のフォント/フォールバックの参照を指定されたコレクションのみに制限する
                RestrictedFontLookup = true,
                FontFallbackScope = FontFallbackScope.FontCollectionOnly,
                // テキストを描画するための各種設定
                MaxWidth = page.Size.Width,
                MaxHeight = page.Size.Height,
                MarginLeft = 72,
                MarginRight = 72,
                MarginTop = 36,
                MarginBottom = 36,
                TextAlignment = TextAlignment.Center,
            };

            tl.Append("ユニークな Unicode 文字(システムに依存しない)",
                new TextFormat(tf) { Underline = true, FontSize = tf.FontSize + 2 });
            tl.PerformLayout(true);
            g.DrawTextLayout(tl, PointF.Empty);

            tl.MarginTop = tl.ContentRectangle.Bottom + 20;
            tl.Clear();
            tl.TextAlignment = TextAlignment.Leading;

            // 文字列を描画します。
            tl.Append("サロゲートペア文字:\n", tf);
            tl.Append("\uD867\uDE3D \uD867\uDEDB \uD840\uDC0B \uD834\uDD1E \uD834\uDD61 \uD83D\uDC04\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("通貨記号:\n", tf);
            tl.Append("\u0024 \u20A0 \u20A1 \u20A2 \u20A3 \u20A4 \u20AC \u20B9 \x20BD\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("数学演算子:\n", tf);
            tl.Append("\u221A \u222B \u2211 \u2210 \u2264 \u2265 \u2202 \u2208\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("CJK 統合漢字A:\n", tf);
            tl.Append("\u3400 \u3401 \u3402 \u3403 \u3404 \u3405 \u3406 \u3407\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("和暦合字:\n", tf);
            tl.Append("\u337e \u337d \u337c \u337b \u32ff", tf1);
            tl.Append("\n", tfs);

            tl.Append("文字様記号:\n", tf);
            tl.Append("\u2110 \u2111 \u2112 \u2113 \u2114 \u2115 \u211B \u211C\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("私用領域:\n", tf);
            tl.Append("\uE000 \uE001 \uE010 \uE011 \uE012 \uE013 \uE014 \uE015\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("矢印:\n", tf);
            tl.Append("\u2190 \u2191 \u2192 \u2193 \u21B0 \u21E6 \u21CB \u21A9\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("装飾記号:\n", tf);
            tl.Append("\u2714 \u2717 \u275B \u275C \u2706 \u2707 \u2708 \u2709\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("点字パターン:\n", tf);
            tl.Append("\u2830 \u2831 \u2832 \u2833 \u2834 \u2835 \u2836 \u2837\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("幾何学的形状:\n", tf);
            tl.Append("\u25D0 \u25D1 \u25D2 \u25D3 \u25A4 \u25F0 \u25BC \u25CE\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("ラテン語拡張A:\n", tf);
            tl.Append("\u0100 \u0101 \u0102 \u0103 \u0104 \u0105 \u0106 \u0107\n", tf1);
            tl.Append("\n", tfs);

            tl.Append("絵文字、その他:\n", tf);
            tl.Append("\u2600 \u2601 \u2602 \u2603 \u2604 \u2605 \u2606 \u2607 \u2608 \u2609 \u2614 \u2615 \u26F0 \u26A1 \u26BE \u2705 \u2712 \u2764\n", tf1);
            tl.Append("\n", tfs);

            tl.PerformLayout(true);
            g.DrawTextLayout(tl, PointF.Empty);

            // PDF ドキュメントを保存します。
            doc.Save(stream);
        }
    }
}