InkAnnotPaths.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// Copyright (c) GrapeCity 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;

namespace GcPdfWeb.Samples.Basics
{
    // PDF ドキュメントにインク注釈を追加する方法、および InkAnnotation.Paths
    // プロパティを使用してそのコンテンツをレンダリングする方法を示します。
    public class InkAnnotPaths
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            // 注釈の作成者のユーザー名:
            var user1 = "グレープシティ DioDocs";

            var rc = Common.Util.AddNote(
                "このサンプルでは、インク注釈を作成し、InkAnnotation.Paths プロパティを使用して注釈のコンテンツを" +
                "レンダリングする方法を示します。 コンテンツは、PDF ビューアーがレンダリングするときに接続される個別の" +
                "ポイントによって指定されます。" +
                "ビューアーの実装に応じて、ポイントを直線または曲線で接続できます。",
                page);

            var inkAnnot = new InkAnnotation()
            {
                UserName = user1,
                Rect = new RectangleF(rc.Left, rc.Bottom + 20, 72 * 5, 72 * 2),
                LineWidth = 2,
                Color = Color.DarkBlue,
                Contents = "これは、InkAnnotation.Paths を介して描画されるインク注釈です。"
            };
            float x0 = 80, x = 80, y = rc.Bottom + 24, h = 18, dx = 2, dy = 4, dx2 = 4, w = 10, xoff = 15;

            // 筆記による 'ink annotation' テキスト:
            
            // i
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2, y), new PointF(x + w/2, y + h), new PointF(x + w, y + h*.7f) });
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2 - dx, y - h/3 + dy), new PointF(x + w/2 + dx, y - h/3) });
            // n
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x, y), new PointF(x, y + h), new PointF(x, y + h - dy), new PointF(x + w*0.7f, y),
                new PointF(x + w - dx/2, y + h*.6f), new PointF(x + w, y + h), new PointF(x + w + dx2, y + h*.7f) });
            // k
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x, y - h/3), new PointF(x, y + h) });
            inkAnnot.Paths.Add(new[] { new PointF(x + w, y), new PointF(x + dx, y + h/2 - dy), new PointF(x, y + h/2),
                new PointF(x + dx2, y + h/2 + dy), new PointF(x + w, y + h), new PointF(x + w + dx2, y + h*.7f) });

            // a
            x += xoff * 2;
            inkAnnot.Paths.Add(new[] { new PointF(x + w, y + dy), new PointF(x + w/2, y), new PointF(x, y + h/2), new PointF(x + w/2, y + h),
                new PointF(x + w, y + dy), new PointF(x + w, y), new PointF(x + w, y + h), new PointF(x + w + dx2, y + h*.7f) });
            // n
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x, y), new PointF(x, y + h), new PointF(x, y + h - dy), new PointF(x + w*0.7f, y),
                new PointF(x + w - dx/2, y + h*.6f), new PointF(x + w, y + h), new PointF(x + w + dx2, y + h*.7f) });
            // n
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x, y), new PointF(x, y + h), new PointF(x, y + h - dy), new PointF(x + w*0.7f, y),
                new PointF(x + w - dx/2, y + h*.6f), new PointF(x + w, y + h), new PointF(x + w + dx2, y + h*.7f) });
            // o
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2, y), new PointF(x + w/2 - dx, y), new PointF(x, y + h/2), new PointF(x + w/2, y + h),
                new PointF(x + w, y + h/2), new PointF(x + w/2 + dx, y), new PointF(x + w/2, y) });
            // t
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2, y - h/3), new PointF(x + w/2, y + h), new PointF(x + w, y + h*.7f) });
            inkAnnot.Paths.Add(new[] { new PointF(x, y), new PointF(x + w, y) });
            // a
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x + w, y + dy), new PointF(x + w/2, y), new PointF(x, y + h/2), new PointF(x + w/2, y + h),
                new PointF(x + w, y + dy), new PointF(x + w, y), new PointF(x + w, y + h), new PointF(x + w + dx2, y + h*.7f) });
            // t
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2, y - h/3), new PointF(x + w/2, y + h), new PointF(x + w, y + h*.7f) });
            inkAnnot.Paths.Add(new[] { new PointF(x, y), new PointF(x + w, y) });
            // i
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2, y), new PointF(x + w/2, y + h), new PointF(x + w, y + h*.7f) });
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2 - dx, y - h/3 + dy), new PointF(x + w/2 + dx, y - h/3) });
            // o
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x + w/2, y), new PointF(x + w/2 - dx, y), new PointF(x, y + h/2),
                new PointF(x + w/2, y + h), new PointF(x + w, y + h/2), new PointF(x + w/2 + dx, y), new PointF(x + w/2, y) });
            // n
            x += xoff;
            inkAnnot.Paths.Add(new[] { new PointF(x, y), new PointF(x, y + h), new PointF(x, y + h - dy), new PointF(x + w*0.7f, y),
                new PointF(x + w - dx/2, y + h*.6f), new PointF(x + w, y + h), new PointF(x + w + dx2, y + h*.7f),
                new PointF(x + w*3, y + h*.4f), new PointF(x + w + dx2, y + h + dy*2), new PointF(x0, y + h + dy)} );

            page.Annotations.Add(inkAnnot);

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