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

namespace GcPdfWeb.Samples.Basics
{
    // このサンプルは、任意のオブジェクト(このサンプルの画像)をテキスト
    // ブロックに挿入して、そのオブジェクトが周囲のテキストに対して相対的な
    // 位置を保持し、他のテキストの実行とまったく同じように配置され、
    // テキストフローに参加できるようにする方法を示します 。
    public class InlineImages
    {
        public int CreatePDF(Stream stream)
        {
            // インラインオブジェクトとして使用する画像を取得します。
            using (var imgPuffins = Image.FromFile("Resources/ImagesBis/puffins-small.jpg"))
            using (var imgFerns = 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;
                const string fontname = "Yu Gothic";
                // テキストを出力するための 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.FontName = fontname;
                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クラスの「Inline objects(インラインオブジェクト)」機能は、任意のオブジェクトをテキストブロックに挿入することを可能にします。" +
                    "これらのオブジェクトは、他のテキストの実行とまったく同じように扱われ、" +
                    "周囲のテキストに相対的な位置を保持します。" +
                    "このサンプルでは、画像をインラインオブジェクトとしてテキストに挿入し、" +
                    "TextLayout クラスを使用して画像をテキストと共に配置し、" +
                    "GcGraphics.DrawImage メソッドを使用して描画します。"
                    );
                tl.Append("海鳥の画像があります:");
                tl.Append(ioPuffins);
                tl.Append("こちらはシダ植物です:");
                tl.Append(ioFerns);
                tl.Append(" - おわり -");
                //
                System.Diagnostics.Debug.Assert(tl.InlineObjects.Count == 0, "インラインオブジェクトを再計算されたグリフで描画");
                // このメソッドは、テキストのレンダリングに必要なグリフを取り出して測定します。
                // 同じテキストを異なるレイアウトで数回描くので、これをループの前に一度呼びます。
                tl.RecalculateGlyphs();
                //
                System.Diagnostics.Debug.Assert(tl.InlineObjects.Count == 2, "インラインオブジェクトを再計算されたグリフで描画");
                // ループ内で、ページ上の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((Image)io.Object, io.ObjectRect.ToRectangleF(), null, ia);
                }
                // PDF ドキュメントを保存します。
                doc.Save(stream);
                return doc.Pages.Count;
            }
        }
    }
}