AnnotationDrawFilter.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.Pdf.Annotations;
using GrapeCity.Documents.Pdf.Graphics;
using GrapeCity.Documents.Svg;
using GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos
{
    // PDFを画像として保存するときにどの注釈を含めるかをプログラムで制御するサンプルです。
    // このサンプルでは、​​複数の注釈を含む1ページのPDFを読み込み、
    // DrawAnnotationFilter を使用して、特定の条件を満たす注釈のみを保存します。
    // SVG形式で保存した画像は、出力されるPDFの最初のページに挿入されます。
    // 2ページ目には注釈をフィルターする前のPDFを表示しています。
    // このサンプルで使用されているPDFは AnnotationTypes で作成されたものです。
    public class AnnotationDrawFilter
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            // 複数の注釈を含むPDFの読み込み
            using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "AnnotationTypes.pdf"));
            doc.Load(fs);
            using var svgStream = new MemoryStream();
            // PDFの最初のページをSVG形式で保存します
            doc.Pages[0].SaveAsSvg(svgStream,
                new SaveAsImageOptions()
                {
                    BackColor = Color.Transparent,
                    DrawAnnotationFilter = (GcPdfDocument d, Page p, AnnotationBase a, ref bool draw) =>
                    {
                        // ページ内に収まるフリーテキスト注釈のみを描画します
                        draw = a is FreeTextAnnotation fta && fta.Rect.Left > 0 && fta.Rect.Right < p.Size.Width;
                    }
                });
            svgStream.Position = 0;
            // 保存されたSVG画像からGcSvgDocumentを作成し、PDFに描画できるようにします
            using var svgDoc = GcSvgDocument.FromStream(svgStream);
            // PDFの先頭にページを追加し、SVG画像を描画します
            var page = doc.Pages.Insert(0);
            var g = page.Graphics;
            var rc = new RectangleF(36, 36, page.Size.Width - 72, page.Size.Height - 72);
            g.DrawRectangle(rc, Color.DarkGoldenrod);
            g.FillRectangle(rc, Color.PaleGoldenrod);
            g.DrawSvg(svgDoc, rc);

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