예제 #1
0
        public int AddBookmark(string title, int page, int add_at_level)
        {
            if (add_at_level == this.level)
            {
                // add to this object
                this.bookmarkObjects.Add(new PdfBookmark(this.level + 1));
                PdfBookmark mark = this.bookmarkObjects[this.bookmarkObjects.Count - 1] as PdfBookmark;
                mark.pageIndex = page - 1;
                mark.title     = title.Replace(">", string.Empty);
                mark.title     = mark.title.Replace("(", string.Empty);
                mark.title     = mark.title.Replace(")", string.Empty);
                mark.parent    = this;
                if (this.bookmarkObjects.Count > 1)
                {
                    mark.prev = this.bookmarkObjects[this.bookmarkObjects.Count - 2] as PdfBookmark;
                }

                if (mark.prev != null)
                {
                    mark.prev.next = mark;
                }
            }
            else
            {
                // add to a sub object
                if (this.bookmarkObjects.Count == 0)
                {
                    throw new Exception("Bookmark hierarchy is invalid");
                }

                PdfBookmark mark = this.bookmarkObjects[this.bookmarkObjects.Count - 1] as PdfBookmark;
                mark.AddBookmark(title, page, add_at_level);
            }

            return(this.GetCount());
        }
예제 #2
0
        public int AddSubBookmarksFromFile(ref PdfBookmark bm, int page, int level, PdfDictionary outline)
        {
            int bmCount = 0;

            PdfDictionary mark = outline;

            // get titles and pages of all bookmarks at this level
            while (mark != null)
            {
                int level_offset = 0;

                // get the title
                string title = mark.Elements.GetString("/Title");
                if (title == null)
                {
                    return(bmCount);
                }

                // direct
                PdfObject dest = mark.Elements.GetObject("/Dest");

                // indirect
                if (dest == null)
                {
                    PdfDictionary @ref = (PdfDictionary)mark.Elements.GetObject("/A");
                    if (@ref != null)
                    {
                        // if null this is a blind bookmark
                        dest = (PdfArray)@ref.Elements.GetObject("/D");
                    }
                }

                // indirectly named (per 1.6 sample from acrobat website)
                // used for multiple bookmarks on same page
                if (dest == null)
                {
                    dest = this.GetNamedDestination(mark);
                }

                // add the bookmark. if it isn't a blind bookmark
                if (dest != null)
                {
                    PdfReference pref = null;
                    if (dest is PdfArray)
                    {
                        PdfArray pDest = (PdfArray)dest;
                        if (pDest.Elements[0] is PdfReference)
                        {
                            pref = (PdfReference)pDest.Elements[0];
                        }
                    }

                    if (pref != null)
                    {
                        // convert page to offset
                        int page_offset = -1;
                        for (int x = 0; x < this.inputDocument.Pages.Count; ++x)
                        {
                            PdfReference pageRef = (PdfReference)this.inputDocument.Pages.PagesArray.Elements[x];
                            if (pageRef == pref)
                            {
                                page_offset = x;
                                break;
                            }
                        }

                        // check if this page is being added or not
                        bool included = false;
                        if (this.lastPageList == null)
                        {
                            // null means all pages
                            included = true;
                        }
                        else
                        {
                            // check if page needs to be included
                            for (int x = 0; x < this.lastPageList.Length; ++x)
                            {
                                if (this.lastPageList[x] == page_offset)
                                {
                                    included    = true;
                                    page_offset = x;
                                    break;
                                }
                            }
                        }

                        // to do - show a warning for bad bookmark?
                        // if (page_offset == -1)
                        //    throw new Exception(string.Format(
                        //        "Warning: Bookmark '{0}' refers to page object {1} which does not exist, bookmark will be ignored", title, pref.ObjectNumber));
                        if (page_offset != -1 && included == true)
                        {
                            bm.AddBookmark(title, page_offset + page, level);
                            ++bmCount;
                            level_offset = 1;
                        }
                    }
                }

                // if this bookmark has children, add them recursively
                PdfDictionary child = (PdfDictionary)mark.Elements.GetObject("/First");
                if (child != null)
                {
                    bmCount += this.AddSubBookmarksFromFile(ref bm, page, level + level_offset, child);
                }

                // get the next mark
                mark = (PdfDictionary)mark.Elements.GetObject("/Next");
            }

            return(bmCount);
        }