Destinations.cs
// // This code is part of Document Solutions for PDF demos. // Copyright (c) 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 { // Demonstrates how to create destinations and associate them with // outline nodes or links in the document body. 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( "This is page 1.\n\n\n" + "Demo of various destination types.\n\n" + "Destinations attached to nodes in the document's outline tree:\n" + " - Page 1: goes to this page, fits whole page\n" + " - Page 2: goes to page 2, fits whole page\n" + " -- Note 2, zoom 200%: goes to note 2 on page 2, zooms to 200%\n" + " -- Zoom 100%: zooms to whole page 2\n" + " -- Back to page 1: goes back to this page\n" + " - Page 3: goes to page 3, fits whole page\n" + " -- Zoom to note on page 3: zooms to whole note on page 3\n" + " -- Back to page 1: goes back to this page\n" + " - Named destinations: keyed by names in NamedDestinations dictionary:\n" + " -- page1\n" + " -- page2\n" + " -- page3\n\n" + "Destinations associated with areas in the document body:", page0); Util.AddNote( "This is page 2.", page1); var noteOnPage2 = Util.AddNote( "Note 2 on page 2.", page1, new RectangleF(300, 400, 200, 300)); Util.AddNote( "This is page 3", page2); var noteOnPage3 = Util.AddNote( "This is a somewhat longer\n(even though not really long)\nnote on page 3.", page2, new RectangleF(200, 440, 200, 300)); // Destinations in the outline tree: // DestinationFit: fits whole page: var on1 = new OutlineNode("Page 1", new DestinationFit(page0)); doc.Outlines.Add(on1); var on2 = new OutlineNode("Page 2", new DestinationFit(page1)); doc.Outlines.Add(on2); // DestinationXYZ: allows specifying top/left coordinates and the zoom level (1 is 100%): on2.Children.Add(new OutlineNode("Note 2, zoom 200%", new DestinationXYZ(page1, noteOnPage2.X, noteOnPage2.Y, 2))); on2.Children.Add(new OutlineNode("Zoom 100%", new DestinationXYZ(page1, null, null, 1))); // Add a link back to page 1: on2.Children.Add(new OutlineNode("Back to page 1", new DestinationFit(page0))); var on3 = new OutlineNode("Page 3", new DestinationFit(page2)); doc.Outlines.Add(on3); // DestinationFitR: fits a rectangle on page: on3.Children.Add(new OutlineNode("Zoom to note on page 3", new DestinationFitR(2, noteOnPage3))); // Add links back to page 1 & 2: on3.Children.Add(new OutlineNode("Go to page 2", new DestinationFit(page1))); on3.Children.Add(new OutlineNode("Go to page 1", new DestinationFit(page0))); // Destinations in the document body (reusing destinations from the outlines): // Go to page 2: var rc = Util.AddNote("Go to page 2", page0, new RectangleF(72, mainNote.Bottom + 18, 200, 72)); page0.Annotations.Add(new LinkAnnotation(rc, on2.Dest)); // Go to page 3: rc = Util.AddNote("Go to page 3", page0, new RectangleF(72, rc.Bottom + 18, 200, 72)); page0.Annotations.Add(new LinkAnnotation(rc, on3.Dest)); // Destinations can also be named and added to the document's NamedDestinations dictionary. doc.NamedDestinations.Add("page1", new DestinationFit(page0)); doc.NamedDestinations.Add("page2", new DestinationFit(page1)); doc.NamedDestinations.Add("page3", new DestinationFit(page2)); // Then they can be referenced using DestinationRef class, here we add them to the outline: var onNamed = new OutlineNode("Named destinations", (DestinationBase)null); doc.Outlines.Add(onNamed); onNamed.Children.Add(new OutlineNode("Named: page1", new DestinationRef("page1"))); onNamed.Children.Add(new OutlineNode("Named: page2", new DestinationRef("page2"))); onNamed.Children.Add(new OutlineNode("Named: page3", new DestinationRef("page3"))); // Done: doc.Save(stream); return doc.Pages.Count; } } }