Spire.PDF is a professional PDF library applied to creating, writing, editing, handling and reading PDF files without any external dependencies. Get free and professional technical support for Spire.PDF for .NET, Java, Android, C++, Python.

Wed Aug 28, 2019 3:42 pm

Hi,


I'm facing with the error message "Value cannot be null. Parameter name: Destination" when my code try to run this instruction "vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);" on a bookmark that there is no action (see attachment), there is a way to setup the action as null?

Thank You.
Thank You

[email protected]
 
Posts: 57
Joined: Tue Mar 19, 2019 6:41 pm

Wed Aug 28, 2019 4:05 pm

Adding a test file.
Thank You

[email protected]
 
Posts: 57
Joined: Tue Mar 19, 2019 6:41 pm

Thu Aug 29, 2019 2:24 am

Hi,

Thanks for your inquiry.
I used following code, but didn't encounter any issue. Everything worked fine.
Code: Select all
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile(FilePath + @"file.pdf");
            PdfBookmarkCollection bookmarks = doc.Bookmarks;
            foreach (PdfBookmark bookmark in bookmarks)
            {
                if (bookmark.Title == "13T007TP01_TR 001.pdf")
                {
                    PdfDestination BookmarkDest = new PdfDestination(doc.Pages[3],new PointF(10,10));
                    bookmark.Action = new PdfGoToAction(BookmarkDest);   
                }
            }
            doc.SaveToFile("18737.pdf");

What is your full code?

Sincerely,
Betsy
E-iceblue support team
User avatar

Betsy.jiang
 
Posts: 3099
Joined: Tue Sep 06, 2016 8:30 am

Fri Aug 30, 2019 12:30 pm

Hi,

//get bookmarks from original pdf
var bms = document.Bookmarks;
Dictionary<PdfBookmark, PdfDestination> allBookmarks = new Dictionary<PdfBookmark, PdfDestination>();

for (int w = 0; w < bms.Count; w++)
{
//Add parent bookmark
PdfBookmark vendorBookmark = newPdf.Bookmarks.Add(bms[w].Title);
if (!bms[w].Destination.IsValid)
{
PdfDestination vendorBookmarkDest = null;
allBookmarks.Add(vendorBookmark, vendorBookmarkDest);
vendorBookmark.Color = bms[w].Color;
vendorBookmark.DisplayStyle = bms[w].DisplayStyle;
vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
//PdfBookmark vendorBookmark = newPdf.Bookmarks.Add(bms[w].Title);
}
else
{
PdfDestination vendorBookmarkDest = bms[w].Destination;
allBookmarks.Add(vendorBookmark, vendorBookmarkDest);
vendorBookmark.Color = bms[w].Color;
vendorBookmark.DisplayStyle = bms[w].DisplayStyle;
vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
}
for (int j = 0; j < bms[w].Count; j++)
{
//Add child bookmark
PdfDestination partBookmarkDest = bms[w][j].Destination;
PdfBookmark partBookmark = vendorBookmark.Add(bms[w][j].Title);
allBookmarks.Add(partBookmark, partBookmarkDest);
partBookmark.Color = bms[w][j].Color;
partBookmark.DisplayStyle = bms[w][j].DisplayStyle;
partBookmark.Action = new PdfGoToAction(partBookmarkDest);
}
}
This is the whole code

Thanks
Thank You

[email protected]
 
Posts: 57
Joined: Tue Mar 19, 2019 6:41 pm

Mon Sep 02, 2019 2:29 am

Hi,

Thanks for your information.
I noticed you set PdfDestination as null, then use "vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest)". I am afraid this is incorrect, it cannot be null. Please use correct code , for example:
Code: Select all
PdfDestination vendorBookmarkDest= new PdfDestination(doc.Pages[3],new PointF(10,10));


Sincerely,
Betsy
E-iceblue support team
User avatar

Betsy.jiang
 
Posts: 3099
Joined: Tue Sep 06, 2016 8:30 am

Tue Sep 03, 2019 12:13 pm

Hi,

I changed my as showing below, but now I'm getting the error "Object reference not set to an instance of an object", could you please help me to understand why this is happening?


Code: Select all
//get bookmarks from original pdf
                var bms = document.Bookmarks;
                Dictionary<PdfBookmark, PdfDestination> allBookmarks = new Dictionary<PdfBookmark, PdfDestination>();

                for (int w = 0; w < bms.Count; w++)
                {
                    //Add parent bookmark
                    PdfBookmark vendorBookmark = newPdf.Bookmarks.Add(bms[w].Title);
                   
                    if (!bms[w].Destination.IsValid)
                    {
                        PdfDestination vendorBookmarkDest = new PdfDestination(document.Pages[3],new PointF(10,10));
                        allBookmarks.Add(vendorBookmark, vendorBookmarkDest);
                        vendorBookmark.Color = bms[w].Color;
                        vendorBookmark.DisplayStyle = bms[w].DisplayStyle;
                        vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
                    }
                    else
                    {
                        PdfDestination vendorBookmarkDest = bms[w].Destination;
                        allBookmarks.Add(vendorBookmark, vendorBookmarkDest);
                        vendorBookmark.Color = bms[w].Color;
                        vendorBookmark.DisplayStyle = bms[w].DisplayStyle;
                        vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
                    }
                    for (int j = 0; j < bms[w].Count; j++)
                    {
                        //Add child bookmark
                        PdfDestination partBookmarkDest = bms[w][j].Destination;
                        PdfBookmark partBookmark = vendorBookmark.Add(bms[w][j].Title);
                        allBookmarks.Add(partBookmark, partBookmarkDest);
                        partBookmark.Color = bms[w][j].Color;
                        partBookmark.DisplayStyle = bms[w][j].DisplayStyle;
                        partBookmark.Action = new PdfGoToAction(partBookmarkDest);
                    }
                }


Thank You
Thank You

[email protected]
 
Posts: 57
Joined: Tue Mar 19, 2019 6:41 pm

Tue Sep 03, 2019 3:54 pm

Hi,

I have try many things with no success, what i find out is the bookmark that is giving error was adder into the PDF file by merging another PDF file. I cannot even add action to it.

Thank You.
Thank You

[email protected]
 
Posts: 57
Joined: Tue Mar 19, 2019 6:41 pm

Wed Sep 04, 2019 2:20 am

Hi,

After further investigation, I found if Destination is null, the method bms[w].Destination.IsValid will throw the error "Object reference not set to an instance of an object". To avoid this, you could change the code in If condition.
Code: Select all
if (bms[w].Destination == null || !bms[w].Destination.IsValid)

Besides, I noticed your code bms[4][2].Destination is null, please note it will throw error when using partBookmark.Action = new PdfGoToAction(partBookmarkDest) like your first issue. You need to add Destination when adding action.

As for merging issue, please provide your code and related files for further investigation.

Sincerely,
Betsy
E-iceblue support team
User avatar

Betsy.jiang
 
Posts: 3099
Joined: Tue Sep 06, 2016 8:30 am

Wed Sep 04, 2019 11:42 am

Hi,

Thanks for you reply, based on your last reply I changed my code a as showing below, now I'm getting the error "Object reference not set to an instance of an object" in the foreach:

foreach (KeyValuePair<PdfBookmark, PdfDestination> kv in allBookmarks)
{
if (kv.Value.Page == page)
kv.Value.Page = newPage;
}[

Code: Select all
var bms = document.Bookmarks;
                Dictionary<PdfBookmark, PdfDestination> allBookmarks = new Dictionary<PdfBookmark, PdfDestination>();

                for (int w = 0; w < bms.Count; w++)
                {
                    //Add parent bookmark
                    PdfBookmark vendorBookmark = newPdf.Bookmarks.Add(bms[w].Title);
                    //MessageBox.Show("Before IsValid Test : " + " Detination: " + bms[w].Destination.PageNumber + " Title: " + bms[w].Title);

                    try
                    {
                        PdfDestination vendorBookmarkDest = bms[w].Destination;
                        allBookmarks.Add(vendorBookmark, vendorBookmarkDest);
                        vendorBookmark.Color = bms[w].Color;
                        vendorBookmark.DisplayStyle = bms[w].DisplayStyle;
                        vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
                        for (int j = 0; j < bms[w].Count; j++)
                        {
                            //Add child bookmark
                            PdfDestination partBookmarkDest = bms[w][j].Destination;
                            PdfBookmark partBookmark = vendorBookmark.Add(bms[w][j].Title);
                            allBookmarks.Add(partBookmark, partBookmarkDest);
                            partBookmark.Color = bms[w][j].Color;
                            partBookmark.DisplayStyle = bms[w][j].DisplayStyle;
                            partBookmark.Action = new PdfGoToAction(partBookmarkDest);
                        }
                    }
                    catch
                    {
                        PdfDestination vendorBookmarkDest = new PdfDestination(document.Pages[3], new PointF(10, 10));
                        //allBookmarks.Add(vendorBookmark, vendorBookmarkDest);
                        //vendorBookmark.Color = bms[w].Color;
                        //vendorBookmark.DisplayStyle = bms[w].DisplayStyle;
                        vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
                        for (int j = 0; j < bms[w].Count; j++)
                        {
                            //Add child bookmark
                            PdfDestination partBookmarkDest = new PdfDestination(document.Pages[3], new PointF(10, 10));
                            //PdfDestination partBookmarkDest = bms[w][j].Destination;
                            PdfBookmark partBookmark = vendorBookmark.Add(bms[w][j].Title);
                            allBookmarks.Add(partBookmark, partBookmarkDest);
                            partBookmark.Color = bms[w][j].Color;
                            partBookmark.DisplayStyle = bms[w][j].DisplayStyle;
                            partBookmark.Action = new PdfGoToAction(partBookmarkDest);
                        }
                    }

                    /*
                    PdfDestination vendorBookmarkDest = bms[w].Destination;
                    allBookmarks.Add(vendorBookmark, vendorBookmarkDest);
                    vendorBookmark.Color = bms[w].Color;
                    vendorBookmark.DisplayStyle = bms[w].DisplayStyle;
                    vendorBookmark.Action = new PdfGoToAction(vendorBookmarkDest);
                    */
                }
               
                //verify the orientation of the page in order to add the stamp alway in the bottom of the page.
                foreach (PdfPageBase page in document.Pages)
                {
                    PdfPageBase newPage;
                    if (page.Rotation == PdfPageRotateAngle.RotateAngle90)
                        newPage = newPdf.Pages.Add(new SizeF(page.Size.Height, page.Size.Width), new PdfMargins(0));
                    else if (page.Rotation == PdfPageRotateAngle.RotateAngle270)
                        newPage = newPdf.Pages.Add(new SizeF(page.Size.Height, page.Size.Width), new PdfMargins(0));
                    else
                        newPage = newPdf.Pages.Add(page.Size, new PdfMargins(0));
                    page.CreateTemplate().Draw(newPage, new PointF(0, 0));

                  foreach (KeyValuePair<PdfBookmark, PdfDestination> kv in allBookmarks)
                    {
                        if (kv.Value.Page == page)
                            kv.Value.Page = newPage;
                    }


Thank you
Thank You

[email protected]
 
Posts: 57
Joined: Tue Mar 19, 2019 6:41 pm

Thu Sep 05, 2019 7:17 am

Hi,

Thanks for your information.
After checking your code, I found the kv.Value was null when the exception was thrown. If kv.Value is null, the kv.Value.page also don't have values. Please use following code to avoid the error.
Code: Select all
 if ( kv.Value != null && kv.Value.Page == page)

Any question, welcome to get it back to us.

Sincerely,
Betsy
E-iceblue support team
User avatar

Betsy.jiang
 
Posts: 3099
Joined: Tue Sep 06, 2016 8:30 am

Return to Spire.PDF

cron