private List <bookmarksLayout> getKids(Dictionary <string, object> bookmarks, int currentLevel)
        {
            List <bookmarksLayout> bookList = new List <bookmarksLayout>();

            if (bookmarks.ContainsKey("Kids"))
            {
                IList <Dictionary <string, object> > kids = (IList <Dictionary <string, object> >)bookmarks["Kids"];
                for (int y = 0; y < kids.Count; y++)
                {
                    bookmarksLayout book       = new bookmarksLayout();
                    string          titleInput = (string)kids[y]["Title"];
                    book.Text  = new string(titleInput.Where(c => !char.IsControl(c)).ToArray());
                    book.Page  = Convert.ToInt16(System.Text.RegularExpressions.Regex.Match((string)kids[y]["Page"], @"\d+").Value);
                    book.Level = currentLevel;
                    bookList.Add(book);

                    bookList.AddRange(getKids(kids[y], currentLevel + 1));
                }
            }
            return(bookList);
        }
        private List <bookmarksLayout> importPDFDocumentBookmarks(string inputDocumentLocation)
        {
            //initialise reader to get bookmarks using itextsharp
            iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(inputDocumentLocation);
            //Get level 0 bookmarks
            IList <Dictionary <string, object> > bookmarks = iTextSharp.text.pdf.SimpleBookmark.GetBookmark(pdfReader);
            List <bookmarksLayout> allBookmarks            = new List <bookmarksLayout>();

            //Loop to get all children bookmarks
            for (int x = 0; x < bookmarks.Count; x++)
            {
                bookmarksLayout book       = new bookmarksLayout();
                string          titleInput = (string)bookmarks[x]["Title"];
                book.Text  = new string(titleInput.Where(c => !char.IsControl(c)).ToArray());
                book.Page  = Convert.ToInt16(System.Text.RegularExpressions.Regex.Match((string)bookmarks[x]["Page"], @"\d+").Value);
                book.Level = 0;
                allBookmarks.Add(book);

                allBookmarks.AddRange(getKids(bookmarks[x], 1));
            }
            return(allBookmarks);
        }
        private void createPDFTerminals(List <airfieldPlateData> inputAirfields, int[] areas)
        {
            //Setup
            PdfDocument pdfDoc = new PdfDocument();

            PdfOutline.PdfOutlineCollection outlines = pdfDoc.Outlines;
            int         intPageNo     = 0;
            int         intPagesAdded = 0;
            PdfDocument inputDocument;
            //Cover page
            PdfPage p = new PdfPage();

            p.Size = PdfSharp.PageSize.A5;
            pdfDoc.AddPage(p);
            createCoverPage(p, areas);
            outlines.Add("Cover", pdfDoc.Pages[intPageNo]);
            intPagesAdded++;
            intPageNo = intPagesAdded;
            //Special Notices
            bool mainBookmark = false;

            for (int m = 0; m < areas.Length; m++)
            {
                inputDocument = CompatiblePdfReader.Open(strDiscLoc + areaDiscLocations[areas[m]][0]);
                for (int k = 0; k < inputDocument.PageCount; k++)
                {
                    pdfDoc.AddPage(inputDocument.Pages[k]);
                    intPagesAdded++;
                }
                //Bookmark
                outlines = pdfDoc.Outlines;
                if (!mainBookmark)
                {
                    outlines.Add("Special Notices", pdfDoc.Pages[intPageNo]); mainBookmark = true;
                }
                outlines = outlines[outlines.Count - 1].Outlines;
                outlines.Add(areaDiscLocations[areas[m]][4], pdfDoc.Pages[intPageNo]);
                //add to page count
                intPageNo = intPagesAdded;
            }
            //Legends
            inputDocument = CompatiblePdfReader.Open(strDiscLoc + strTerminalsLegend);
            List <bookmarksLayout> inputBookmarks = importPDFDocumentBookmarks(strDiscLoc + strTerminalsLegend);

            mainBookmark = false;
            bool includePage = false;

            for (int k = 0; k < inputDocument.PageCount; k++)
            {
                bookmarksLayout inputLevelOneBook = inputBookmarks.FindAll(x => x.Level == 1).Find(y => y.Page == k + 1);
                if (inputLevelOneBook != null)
                {
                    includePage = false;
                    for (int m = 0; m < areas.Length; m++)
                    {
                        if (inputLevelOneBook.Text.Contains(areaDiscLocations[areas[m]][3]))
                        {
                            includePage = true;
                        }
                    }
                }
                if (includePage)
                {
                    pdfDoc.AddPage(inputDocument.Pages[k]);
                    //bookmarks
                    outlines = pdfDoc.Outlines;
                    //-main
                    if (!mainBookmark)
                    {
                        outlines.Add("Legend", pdfDoc.Pages[intPageNo]); mainBookmark = true;
                    }
                    //-area
                    outlines = outlines[outlines.Count - 1].Outlines;
                    if (inputLevelOneBook != null)
                    {
                        outlines.Add(inputLevelOneBook.Text, pdfDoc.Pages[intPageNo]);
                    }
                    //-page
                    bookmarksLayout pageBookmark = inputBookmarks.FindAll(x => x.Level == 2).Find(y => y.Page == k + 1);
                    outlines = outlines[outlines.Count - 1].Outlines;
                    if (pageBookmark != null)
                    {
                        outlines.Add(pageBookmark.Text, pdfDoc.Pages[intPageNo]);
                    }
                    //add to page count
                    intPagesAdded++;
                    intPageNo = intPagesAdded;
                }
            }

            //Add approach plates
            for (int i = 0; i < inputAirfields.Count(); i++)
            {
                for (int j = 0; j < inputAirfields[i].Plates.Count; j++)
                {
                    inputDocument = CompatiblePdfReader.Open(inputAirfields[i].Plates[j][1]);
                    for (int k = 0; k < inputDocument.PageCount; k++)
                    {
                        pdfDoc.AddPage(inputDocument.Pages[k]);
                        intPagesAdded++;
                    }
                    //add bookmarks
                    outlines = pdfDoc.Outlines;
                    if (j == 0)
                    {
                        //if start of doc or previous country not the same add a new country bookmark
                        //absolute allows same statemant for first and all values of i, caught by i == 0 check
                        if (i == 0 || inputAirfields[Math.Abs(i - 1)].Country != inputAirfields[i].Country)
                        {
                            outlines.Add(inputAirfields[i].Country, pdfDoc.Pages[intPageNo]);
                        }
                        outlines = outlines[outlines.Count - 1].Outlines;
                        outlines.Add(inputAirfields[i].Name, pdfDoc.Pages[intPageNo]);
                    }
                    else
                    {
                        outlines = outlines[outlines.Count - 1].Outlines;
                    }
                    outlines = outlines[outlines.Count - 1].Outlines;
                    outlines.Add(inputAirfields[i].Plates[j][0], pdfDoc.Pages[intPageNo]);
                    intPageNo = intPagesAdded;
                }
            }
            //Save and close
            string areaFileName = "";

            for (int m = 0; m < areas.Length; m++)
            {
                areaFileName += areaDiscLocations[areas[m]][4] + " ";
            }
            pdfDoc.Save(strOutputLoc + @"\" + areaFileName + "Terminals " + docVersion + ".pdf");
            pdfDoc.Close();
        }