StampImage.cs
// 完毕:
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
    // 它被分配给注释的正常默认外观流。
    // 然后在 FormXObject 上绘制半透明 PNG 图像
    // 使用常规 GcGraphics 功能(Transform 和 DrawImage)的图形。
    public class StampImage
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            // 加载现有的 PDF,我们将在其中添加图章注释
            // (有关加载文档的详细信息,请参见LoadPDF):
            var jsFile = Path.Combine("Resources", "PDFs", "The-Rich-History-of-JavaScript.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", "draft-copy-450x72.png"));
            var center = new Vector2(fxo.Bounds.Width / 2, fxo.Bounds.Height / 2);
            fxo.Graphics.Transform =
                Matrix3x2.CreateRotation((float)(-55 * Math.PI) / 180f, center) *
                Matrix3x2.CreateScale(6, 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 = "杰米·史密斯"
                };
                // 在所有页面上重复使用相同的 FormXObject:
                stamp.AppearanceStreams.Normal.Default = fxo;
            }
            // 完毕:
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}