using SelectPdf;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SelectPdf.Samples
{
    public partial class table_of_contents : System.Web.UI.Page
    {
        // number of items in the table of contents (TOC)
        private int TOC_Items = 13;
        
        // CSS class for TOC items (titles and targets)
        private string TOC_Class = "toc";

        // font size for page numbers in the table of contents
        private int TOC_Page_Font_Size = 12;

        // CSS class for PDF bookmarks
        private string Bookmarks_Class = "bookmark";

        // Each TOC item is represented by a title with ID TOC_Title{0}
        // and a target (internal link) with ID TOC_Target{0}
        // Both TOC titles and targets must have the same CSS Class ("toc" in our sample)

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string url = Page.ResolveUrl("~/files/document2.html");
                TxtUrl.Text = (new Uri(Request.Url, url)).AbsoluteUri;
                LnkTest.NavigateUrl = url;
            }
        }

        protected void BtnCreatePdf_Click(object sender, EventArgs e)
        {
            RenderingEngine renderingEngine =
                (RenderingEngine)Enum.Parse(typeof(RenderingEngine), DdlRenderingEngine.SelectedValue, true);

            // instantiate a html to pdf converter object
            HtmlToPdf converter = new HtmlToPdf();

            converter.Options.RenderingEngine = renderingEngine;
            converter.Options.CefEnginePath = Server.MapPath(ConfigurationManager.AppSettings["CefEnginePath"]);

            converter.Options.MarginTop = 20;
            converter.Options.MarginRight = 20;
            converter.Options.MarginBottom = 20;
            converter.Options.MarginLeft = 20;

            // set the css selectors for the automatic bookmarks 
            // (elements with CSS class "bookmark")
            converter.Options.PdfBookmarkOptions.CssSelectors =
                new string[] { "*." + Bookmarks_Class };

            // set the css selectors for the TOC related elements
            // (elements with CSS class "toc")
            // (alternatively, full list of IDs can be specified)
            converter.Options.WebElementsMappingOptions.CssSelectors =
                new string[] { "*." + TOC_Class };

            // display the bookmarks when the document is opened in a viewer
            converter.Options.ViewerPreferences.PageMode = PdfViewerPageMode.UseOutlines;

            // footer settings
            converter.Options.DisplayFooter = true;
            converter.Footer.Height = 30;

            // page numbers can be added using a PdfTextSection object
            PdfTextSection text = new PdfTextSection(0, 10,
                "Page: {page_number} of {total_pages}  ",
                new System.Drawing.Font("Verdana", 10));
            text.HorizontalAlign = PdfTextHorizontalAlign.Right;
            converter.Footer.Add(text);


            // create a new pdf document converting an url
            PdfDocument doc = converter.ConvertUrl(TxtUrl.Text);

            // create font for page numbers
            PdfFont pageNumberFont = doc.Fonts.Add(
                new Font("Arial", TOC_Page_Font_Size, 
                    FontStyle.Regular, GraphicsUnit.Point), 
                true);

            // get the right coordinate of the table of contents 
            // to position the page numbers
            float tocRight = doc.Pages[0].ClientRectangle.Width - 50;

            // add page numbers for the table of contents items
            for (int tocItem = 1; tocItem <= TOC_Items; tocItem++)
            {
                string tocTitleID = String.Format("TOC_Title{0}", tocItem);
                string tocTargetID = String.Format("TOC_Target{0}", tocItem);

                WebElement tocTitle = converter.Options.WebElementsMappingOptions
                    .Result.GetElementByHtmlId(tocTitleID);
                WebElement tocTarget = converter.Options.WebElementsMappingOptions
                    .Result.GetElementByHtmlId(tocTargetID);

                if (tocTitle == null || tocTarget == null)
                {
                    // TOC items not found
                    continue;
                }

                // get the TOC title page and rendering rectangle
                PdfPage tocPage = doc.Pages[tocTitle.PdfRectangles[0].PageIndex];
                RectangleF tocTitleRectangle = tocTitle.PdfRectangles[0].Rectangle;

                // get the page number of target where the TOC entry points
                int tocTargetPageNumber = tocTarget.PdfRectangles[0].PageIndex + 1;

                // add dashed line from TOC title to the page number
                PdfLineElement dashedLine = new PdfLineElement(
                    tocTitleRectangle.Right + 5, 
                    tocTitleRectangle.Y + tocTitleRectangle.Height - 4,
                    tocRight, tocTitleRectangle.Y + tocTitleRectangle.Height - 4);
                dashedLine.LineStyle.LineWidth = 1;
                dashedLine.LineStyle.LineDashStyle = PdfLineDashStyle.Dash;
                dashedLine.ForeColor = Color.Black;
                tocPage.Add(dashedLine);

                // create the page number text element to the right of the TOC title
                PdfTextElement pageNumberTextElement = new PdfTextElement(tocRight + 5, 
                        tocTitleRectangle.Y, -1, tocTitleRectangle.Height,
                        tocTargetPageNumber.ToString(), pageNumberFont);
                pageNumberTextElement.HorizontalAlign = PdfTextHorizontalAlign.Left;
                pageNumberTextElement.VerticalAlign = PdfTextVerticalAlign.Middle;
                pageNumberTextElement.ForeColor = Color.Black;

                // add the page number to the right of the TOC entry
                tocPage.Add(pageNumberTextElement);
            }

            // save pdf document
            doc.Save(Response, false, "Sample.pdf");

            // close pdf document
            doc.Close();
        }
    }
}