Surrogates.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;

namespace DsPdfWeb.Demos.Basics
{
    // このサンプルは、サロゲートペアを含む様々な Unicode 文字を描画します。また、DsPdf に
    // 組み込まれた自動フォントフォールバック(フォント置換)機能も暗黙的に使用されます。
    // 注意:このサンプルは、システム提供のフォールバックフォントに依存するため、異なる
    // システムで異なる結果を生成する可能性があります。
    // このサンプルのプラットフォームおよびシステムに依存しないバージョンについては、
    // SurrogatesPort を参照してください。また、FontFallbacks も参照してください。
    public class Surrogates
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var g = doc.NewPage().Graphics;
            // このサンプルでデモされた「面白い」文字のほとんどは、
            // fallback フォント(FontFallbacks を参照)が自動的に使用されるので、
            // キャプションに標準フォントを使用するだけです。
            var font = Common.Util.getFont(); 

            var tf = new TextFormat() { Font = font, FontSize = 12 };
            var tf1 = new TextFormat(tf) { FontSize = 14 };

            g.DrawString("ユニークな Unicode 文字(システムのフォールバックに依存)",
                new TextFormat(tf) { Underline = true, FontSize = tf.FontSize + 2 },
                new RectangleF(0, 36, doc.PageSize.Width, float.MaxValue),
                TextAlignment.Center);

            // テキスト挿入位置とその前進用関数を設定します。
            var ip = new PointF(72, 54);
            Func<bool, PointF> nextIp = (caption_) => { ip.Y += caption_ ? 30 : 20; return ip; };

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

            g.DrawString("通貨記号:", tf, nextIp(true));
            g.DrawString("\u0024 \u20A0 \u20A1 \u20A2 \u20A3 \u20A4 \u20AC \u20B9 \x20BD", tf1, nextIp(false));

            g.DrawString("数学演算子:", tf, nextIp(true));
            g.DrawString("\u221A \u222B \u2211 \u2210 \u2264 \u2265 \u2202 \u2208", tf1, nextIp(false));

            g.DrawString("CJK 統合漢字A:", tf, nextIp(true));
            g.DrawString("\u3400 \u3401 \u3402 \u3403 \u3404 \u3405 \u3406 \u3407", tf1, nextIp(false));

            g.DrawString("和暦合字:", tf, nextIp(true));
            g.DrawString("\u337e \u337d \u337c \u337b \u32ff", tf1, nextIp(false));

            g.DrawString("文字様記号:", tf, nextIp(true));
            g.DrawString("\u2110 \u2111 \u2112 \u2113 \u2114 \u2115 \u211B \u211C", tf1, nextIp(false));

            g.DrawString("私用領域:", tf, nextIp(true));
            g.DrawString("\uE000 \uE001 \uE010 \uE011 \uE012 \uE013 \uE014 \uE015", tf1, nextIp(false));

            g.DrawString("矢印:", tf, nextIp(true));
            g.DrawString("\u2190 \u2191 \u2192 \u2193 \u21B0 \u21E6 \u21CB \u21A9", tf1, nextIp(false));

            g.DrawString("装飾記号:", tf, nextIp(true));
            g.DrawString("\u2714 \u2717 \u275B \u275C \u2706 \u2707 \u2708 \u2709", tf1, nextIp(false));

            g.DrawString("点字パターン:", tf, nextIp(true));
            g.DrawString("\u2830 \u2831 \u2832 \u2833 \u2834 \u2835 \u2836 \u2837", tf1, nextIp(false));

            g.DrawString("幾何学的形状:", tf, nextIp(true));
            g.DrawString("\u25D0 \u25D1 \u25D2 \u25D3 \u25A4 \u25F0 \u25BC \u25CE", tf1, nextIp(false));

            g.DrawString("ラテン語拡張A:", tf, nextIp(true));
            g.DrawString("\u0100 \u0101 \u0102 \u0103 \u0104 \u0105 \u0106 \u0107", tf1, nextIp(false));

            g.DrawString("絵文字、その他:", tf, nextIp(true));
            g.DrawString("\u2600 \u2601 \u2602 \u2603 \u2604 \u2605 \u2606 \u2607 \u2608 \u2609 \u2614 \u2615 \u26F0 \u26A1 \u26BE \u2705 \u2712 \u2764", tf1, nextIp(false));

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