Destinations.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 GrapeCity.Documents.Pdf.Annotations;
using GrapeCity.Documents.Pdf.Actions;
using DsPdfWeb.Demos.Common;

namespace DsPdfWeb.Demos.Basics
{
    // 移動先を作成し、文書本体のアウトラインノードまたは
    // リンクに関連付ける方法を示します。
    public class Destinations
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();

            var page0 = doc.NewPage();
            var page1 = doc.NewPage();
            var page2 = doc.NewPage();

            var mainNote = Util.AddNote(
                "これは1ページ目です。\n\n\n" +
                "さまざまな移動先指定の例です。\n\n" +
                "ドキュメントのアウトラインにある移動先:\n" +
                "  - 1 ページ:このページに移動し、ページ全体に合わせて表示\n" +
                "  - 2 ページ:2ページ目に移動し、ページ全体に合わせて表示\n" +
                "    -- ズーム率 200%: 2ページ目のメモに移動し、200%の拡大率で表示\n" +
                "    -- ズーム率 100%: 2ページ目を100%で表示\n" +
                "    -- 1 ページ目に移動: このページに移動\n" +
                "  - 3 ページ: 3ページ目に移動し、ページ全体に合わせて表示\n" +
                "    -- 3ページ目のメモにズーム: 3ページ目を表示しメモを拡大\n" +
                "    -- 2 ページ目に移動: 2 ページ目に移動\n" +
                "    -- 1 ページ目に移動: このページに移動\n" +
                "  - 名前付き移動先: NamedDestinations辞書の名前でキー入力\n" +
                "    -- ページ1\n" +
                "    -- ページ2\n" +
                "    -- ページ3\n\n" +
                "ドキュメント本体の領域に関連付けした移動先:",
                page0);
            Util.AddNote(
                "これは2ページ目です。",
                page1);
            var noteOnPage2 = Util.AddNote(
                "2ページ目のメモ",
                page1, new RectangleF(300, 400, 200, 300));
            Util.AddNote(
                "これは3ページ目です。",
                page2);
            var noteOnPage3 = Util.AddNote(
                "これは長めの文を設定したメモです。\n(確認用として改行を挿入)\n3ページ目に配置しています。",
                page2, new RectangleF(150, 440, 300, 300));

            // アウトラインツリーの移動先。

            // DestinationFit: ページ全体に合わせます。
            var on1 = new OutlineNode("1 ページ", new DestinationFit(page0));
            doc.Outlines.Add(on1);

            var on2 = new OutlineNode("2 ページ", new DestinationFit(page1));
            doc.Outlines.Add(on2);
            // DestinationXYZ:上/左座標とズームレベル(1 は 100%)を指定できます。
            on2.Children.Add(new OutlineNode("ズーム率 200%", new DestinationXYZ(page1, noteOnPage2.X, noteOnPage2.Y, 2)));
            on2.Children.Add(new OutlineNode("ズーム率 100%", new DestinationXYZ(page1, null, null, 1)));
            // 1ページ目に戻るリンクを追加します。
            on2.Children.Add(new OutlineNode("1 ページ目に移動", new DestinationFit(page0)));

            var on3 = new OutlineNode("3 ページ", new DestinationFit(page2));
            doc.Outlines.Add(on3);
            // DestinationFitR :ページ上に矩形を合わせます。
            on3.Children.Add(new OutlineNode("3 ページ目のメモにズーム", new DestinationFitR(2, noteOnPage3)));
            // 1ページ目と2ページ目に戻るリンクを追加します。
            on3.Children.Add(new OutlineNode("2 ページ目に移動", new DestinationFit(page1)));
            on3.Children.Add(new OutlineNode("1 ページ目に移動", new DestinationFit(page0)));

            // ドキュメントの本文内の移動先(アウトラインからの移動先を再利用)。
            // 2ページ目に移動します。
            var rc = Util.AddNote("2 ページ目に移動", page0, new RectangleF(72, mainNote.Bottom + 18, 200, 72));
            page0.Annotations.Add(new LinkAnnotation(rc, on2.Dest));
            // 3ページ目に移動します。
            rc = Util.AddNote("3 ページ目に移動", page0, new RectangleF(72, rc.Bottom + 18, 200, 72));
            page0.Annotations.Add(new LinkAnnotation(rc, on3.Dest));

            // 移動先に名前を付けて、ドキュメントの NamedDestinations 辞書に追加することもできます。
            doc.NamedDestinations.Add("ページ1", new DestinationFit(page0));
            doc.NamedDestinations.Add("ページ2", new DestinationFit(page1));
            doc.NamedDestinations.Add("ページ3", new DestinationFit(page2));
            // 次に、DestinationRefクラスを使用して参照できます。ここで、これらをアウトラインに追加します。
            var onNamed = new OutlineNode("名前付き移動先", (DestinationBase)null);
            doc.Outlines.Add(onNamed);
            onNamed.Children.Add(new OutlineNode("名前:ページ1", new DestinationRef("ページ1")));
            onNamed.Children.Add(new OutlineNode("名前:ページ2", new DestinationRef("ページ2")));
            onNamed.Children.Add(new OutlineNode("名前:ページ3", new DestinationRef("ページ3")));

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