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

namespace DsPdfWeb.Demos.Basics
{
    // 此示例展示了如何插入任意对象(此示例中的图像)
    // 到文本块中,以便这些对象保持其相对位置
    // 到周围的文本,并且布局与其他文本运行完全相同,
    // 并可以参与文本流。
    public class InlineImages
    {
        public int CreatePDF(Stream stream)
        {
            // 获取用作内联对象的图像:
            using (var imgPuffins = GCDRAW.Image.FromFile("Resources/ImagesBis/puffins-small.jpg"))
            using (var imgFerns = GCDRAW.Image.FromFile("Resources/ImagesBis/ferns-small.jpg"))
            {
                // 要使用的图像对齐:
                var ia = new ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Bottom, true, true, true, false, false);
                // 创建并设置文档:
                var doc = new GcPdfDocument();
                var page = doc.NewPage();
                var g = page.Graphics;
                // 创建并设置一个 TextLayout 对象来打印文本:
                var tl = g.CreateTextLayout();
                tl.MaxWidth = page.Size.Width;
                tl.MaxHeight = page.Size.Height;
                tl.MarginLeft = tl.MarginRight = tl.MarginTop = tl.MarginBottom = 36;
                tl.DefaultFormat.Font = StandardFonts.Times;
                tl.DefaultFormat.FontSize = 12;
                tl.DefaultFormat.BackColor = Color.LightGoldenrodYellow;
                tl.TextAlignment = TextAlignment.Justified;
                // 使用图像和任意大小创建内联对象:
                var ioPuffins = new InlineObject(imgPuffins, 36, 24);
                var ioFerns = new InlineObject(imgFerns, 36, 24);
                // 构建文本:
                tl.Append("TextLayout 类的“内联对象”功能允许插入任意对象" +
                    "");
                tl.Append("这里有一些海雀:");
                tl.Append(ioPuffins);
                tl.Append("这里有一些蕨类植物:");
                tl.Append(ioFerns);
                tl.Append("结束。");
                //
                System.Diagnostics.Debug.Assert(tl.InlineObjects.Count == 0, "InlineObjects is filled by RecalculateGlyphs");
                // 此方法获取并测量渲染文本所需的字形,
                // 因为我们用不同的布局多次绘制相同的文本,
                // 我们在下面的循环之前调用一次:
                tl.RecalculateGlyphs();
                //
                System.Diagnostics.Debug.Assert(tl.InlineObjects.Count == 2, "InlineObjects is filled by RecalculateGlyphs");
                // 在循环中,在 3 个不同的位置绘制文本和内嵌图像
                // 和页面上的边界:
                for (int i = 0; i < 3; ++i)
                {
                    tl.MarginTop = tl.ContentRectangle.Bottom + 36;
                    tl.MarginLeft = 36 + 72 * i;
                    tl.MarginRight = 36 + 72 * i;
                    // 注意这里传递“false”,我们不需要重新计算字形,因为
                    // 文本没有改变:
                    tl.PerformLayout(false);
                    // 绘制文本和图像:
                    g.DrawTextLayout(tl, PointF.Empty);
                    foreach (var io in tl.InlineObjects)
                        g.DrawImage((GCDRAW.Image)io.Object, io.ObjectRect.ToRectangleF(), null, ia);
                }
                // 完毕:
                doc.Save(stream);
                return doc.Pages.Count;
            }
        }
    }
}