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(); }