SurrogatesPort.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace DsPdfWeb.Demos.Basics
{
// 此示例呈现各种有趣的 Unicode 字符
// 包括代理对,类似于Surrogates示例。
// 但与该示例不同的是,它不依赖于任何系统提供的
// 后备措施。相反,在此示例中,我们有目的地限制后备
// 字体查找到程序自己的字体集合,并提供
// 我们自己的一套后备字体。
// 这使得代码平台和系统独立,因此它产生
// 在 Windows、Linux 或 Mac 上的结果完全相同。
public class SurrogatesPort
{
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
// 在Surrogates示例中,我们指定了标准字体
// (它缺少我们将渲染的许多字形),
// 并将依赖 FontCollection 提供的字体后备支持:
var font = StandardFonts.Helvetica;
// 设置标题、“有趣的字符”和间距的文本格式:
var tf = new TextFormat() { Font = font, FontSize = 12 };
var tf1 = new TextFormat(tf) { FontSize = 14 };
var tfs = new TextFormat(tf) { FontSize = 6 };
// 创建要使用的字体集合:
var fc = new FontCollection();
// 添加我们自己的后备字体以使用(请注意,此处的顺序很重要,
// 先到先得):
fc.AppendFallbackFonts(
GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "arialuni.ttf")),
GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "l_10646.ttf")),
GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "seguiemj.ttf")),
GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "seguisym.ttf")),
GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "simsun.ttc")),
GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf")),
GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "YuGothR.ttc"))
);
// 限制默认字体查找是在 TextLayout 中完成的,因此与
// {Surrogates}示例,这里我们不能使用DrawString,但必须使用
// 直接TextLayout和DrawTextLayout:
// - 指定要使用的字体集合;
// - 将默认字体/后备查找仅限于指定集合;
// - 设置其他道具来渲染文本。
var 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("Some Interesting Unicode Characters (system-independent)",
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("Surrogate Pairs:\n", tf);
tl.Append("\uD867\uDEDB \uD840\uDC0B \uD834\uDD1E \uD834\uDD61 \uD83D\uDC04\n", tf1);
tl.Append("\n", tfs);
tl.Append("Currency Symbols:\n", tf);
tl.Append("\u0024 \u20A0 \u20A1 \u20A2 \u20A3 \u20A4 \u20AC \u20B9 \x20BD\n", tf1);
tl.Append("\n", tfs);
tl.Append("Mathematical Operators:\n", tf);
tl.Append("\u221A \u222B \u2211 \u2210 \u2264 \u2265 \u2202 \u2208\n", tf1);
tl.Append("\n", tfs);
tl.Append("CJK Ideographs Extension A:\n", tf);
tl.Append("\u3400 \u3401 \u3402 \u3403 \u3404 \u3405 \u3406 \u3407\n", tf1);
tl.Append("\n", tfs);
tl.Append("Letterlike Symbols:\n", tf);
tl.Append("\u2110 \u2111 \u2112 \u2113 \u2114 \u2115 \u211B \u211C\n", tf1);
tl.Append("\n", tfs);
tl.Append("Private Use Area:\n", tf);
tl.Append("\uE000 \uE001 \uE010 \uE011 \uE012 \uE013 \uE014 \uE015\n", tf1);
tl.Append("\n", tfs);
tl.Append("Arrows:\n", tf);
tl.Append("\u2190 \u2191 \u2192 \u2193 \u21B0 \u21E6 \u21CB \u21A9\n", tf1);
tl.Append("\n", tfs);
tl.Append("Dingbats:\n", tf);
tl.Append("\u2714 \u2717 \u275B \u275C \u2706 \u2707 \u2708 \u2709\n", tf1);
tl.Append("\n", tfs);
tl.Append("Braille Patterns:\n", tf);
tl.Append("\u2830 \u2831 \u2832 \u2833 \u2834 \u2835 \u2836 \u2837\n", tf1);
tl.Append("\n", tfs);
tl.Append("Geometric Shapes:\n", tf);
tl.Append("\u25D0 \u25D1 \u25D2 \u25D3 \u25A4 \u25F0 \u25BC \u25CE\n", tf1);
tl.Append("\n", tfs);
tl.Append("Latin Extended A:\n", tf);
tl.Append("\u0100 \u0101 \u0102 \u0103 \u0104 \u0105 \u0106 \u0107\n", tf1);
tl.Append("\n", tfs);
tl.Append("Miscellaneous Symbols:\n", tf);
tl.Append("\u2600 \u2601 \u2602 \u2603 \u2604 \u2605 \u2606 \u2607 \u2608 \u2609 \u2614 \u2615 \u26F0\n", tf1);
tl.Append("\n", tfs);
tl.PerformLayout(true);
g.DrawTextLayout(tl, PointF.Empty);
// 完毕:
doc.Save(stream);
return doc.Pages.Count;
}
}
}