ImageAlignment.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;
using GrapeCity.Documents.Drawing;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos
{
    // DsPdfの画像整列オプションの使用例を示すサンプルです。
    // このサンプルは、以前「Raw画像」という題名で公開されていた、
    // RawImageクラスを使用し、JPEG画像をドキュメントに追加するデモの代替です。
    // RawImageクラスは現在も使用可能ですが、将来的に廃止される予定のため、
    // ImageAlignクラスでの画像整列オプションを使用することをお勧めします。

    //注意:DsPdfで同じ画像を複数回レンダリングする場合
    //(例:全ページのヘッダーとして同じ画像を描画する場合など)、
    //同じ画像オブジェクトを使うと、その画像は自動的にDsPdf内部の
    //ディクショナリに登録され、ドキュメント全体で再利用されます。
    //そのため、毎回ファイル(またはストリーム)から同じ画像を読み込むのではなく、
    //一度画像を読み込んで、画像オブジェクトとしてキャッシュすることが推奨されます。
    //(この仕組みはDsPdfで扱うすべての画像タイプに適用されます。)
    public class ImageAlignment
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();

            // キャプション描画用のテキストフォーマットを設定します:
            var tf = new TextFormat() { FontName = "IPAGothic", FontSize = 12 };

            void drawImage(GCDRAW.Image image_, Page page_, ImageAlign ia_, bool clip_)
            {
                var rect = new RectangleF(72, 72, 72 * 4, 72 * 4);
                var clipped = clip_ ? "4×4インチの矩形に切り取り" : "切り取りなし";
                var align = ia_ == ImageAlign.Default ? "規定の配置" :
                    ia_ == ImageAlign.CenterImage ? "中央寄せ" :
                    ia_ == ImageAlign.StretchImage ? "矩形にあわせる" : "カスタム";
                // イメージキャプションを描画します:
                page_.Graphics.DrawString($"{doc.Pages.IndexOf(page_) + 1}ページ: 画像の場所 (1\",1\"), {clipped}, 配置 {align}:", tf, new PointF(72, 36));
                var clip = clip_ ? new Nullable<RectangleF>(rect) : new Nullable<RectangleF>();
                // イメージを描画します:
                page_.Graphics.DrawImage(image_, rect, clip, ia_, out RectangleF[] imageRects);
                // 画像のアウトラインを表示します:
                page_.Graphics.DrawRectangle(imageRects[0], Color.Red, 1, null);
                // 画像、クリップ領域を表示する:
                page_.Graphics.DrawRectangle(rect, Color.Blue, 1, null);
            }

            // JPEGからイメージを作成する
            //(ここで Image クラスのインスタンスを一度作成して、それを使い回して PDF に画像を描画することで、
            //画像データが再利用できます。PDFに同じ画像が重複して埋め込まれることはありません):
            using var image = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "puffins.jpg"));
            using var imageSmall = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "puffins-small.jpg"));

            // ImageAlignクラスは、さまざまな画像整列オプションを提供します。
            // よく使われるオプションは、静的インスタンスで定義されています。
            // 以下の例を参照してください。

            // ページ 1: 既定の配置(Default)に、画像を切り抜かず描画する:
            drawImage(image, doc.NewPage(), ImageAlign.Default, false);

            // ページ 2: 既定の配置(Default)に、画像を切り抜いて描画する:
            drawImage(image, doc.NewPage(), ImageAlign.Default, true);

            // ページ 3: 中央(CenterImage)に、画像を切り抜いてで描画:
            drawImage(image, doc.NewPage(), ImageAlign.CenterImage, true);

            // ページ 4: 枠いっぱいに引き伸ばして(StretchImage)、画像を切り抜かずに描画:
            drawImage(image, doc.NewPage(), ImageAlign.StretchImage, false);

            //以下のようにインスタンスを作成することで、細かいカスタム設定も可能です。

            // ページ 5: クリッピング無し、画像を枠内に収め、縦横比を保って描画:
            var ia = new ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, true, true, true, false, false);
            drawImage(image, doc.NewPage(), ia, false);

            // ページ 6: 小さい画像を、クリッピング無し、画像を枠内に収め、縦横比を保って、タイル状に並べて描画:
            ia = new ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, false, false, true, true, true);
            drawImage(imageSmall, doc.NewPage(), ia, false);

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