StampImage.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf.Annotations;
using GrapeCity.Documents.Pdf.Graphics;
using System.Numerics;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos.Basics
{
    // このサンプルは、FormXObject を使用して注釈にカスタム外観ストリームを
    // 追加する方法を示します。
    // 既存の PDF が読み込まれ、ドキュメントのページがループされます。
    // 各ページで、StampAnnotation と FormXObject を作成し、
    // 注釈の通常のデフォルト外観ストリームに割り当てます。
    // 次に、Transform メソッドと DrawImage メソッドを使用して、
    // スタンプを表す半透明の PNG 画像を FormXObject の Graphics に描画します。
    public class StampImage
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            // スタンプ注釈を追加する既存の PDF を読み込みます。
            // (ドキュメントの読み込みの詳細については、LoadPDF を参照してください)
            var jsFile = Path.Combine("Resources", "PDFs", "diodocs_flyer.pdf");
            using var fs = File.OpenRead(jsFile);
                doc.Load(fs);
                var rect = new RectangleF(PointF.Empty, doc.Pages[0].Size);
                // スタンプの外観として使用される FormXObject を作成します。
                var fxo = new FormXObject(doc, rect);
                // リソースからイメージを取得し、FormXObject のグラフィックスに描画します。
                // (GcGraphics.Transform の使用方法の詳細については、Transformations を参照してください)
            using var image = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "circular-450x144.png"));
                    var center = new Vector2(fxo.Bounds.Width / 2, fxo.Bounds.Height / 2);
                    fxo.Graphics.Transform =
                        Matrix3x2.CreateRotation((float)(-35 * Math.PI) / 180f, center) *
                        Matrix3x2.CreateScale(3, center);
                    fxo.Graphics.DrawImage(image, fxo.Bounds, null, ImageAlign.CenterImage);
                    // ページをループし、各ページにスタンプを追加します。
                    foreach (var page in doc.Pages)
                    {
                        // ページ全体に StampAnnotation を作成します。
                        var stamp = new StampAnnotation()
                        {
                            Icon = StampAnnotationIcon.Draft.ToString(),
                            Name = "回覧用",
                            Page = page,
                            Rect = rect,
                            UserName = "ユーザーA"
                        };
                        // すべてのページで同じ FormXObject を再利用します。
                        stamp.AppearanceStreams.Normal.Default = fxo;
                    }
                    // PDF ドキュメントを保存します。
                    doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}