Search code examples
c#asp.nethyperlinkms-officeoffice-interop

How to read the hyper-link of an image in power Point using c#


I have inserted an image to powerpoint using c# and have inserted a hyperlink to the picture and its working perfectly.But now i need to read the hyperlink of that picture which i have inserted using c#.

Whereas am inserting a text with hyperlink into powerpoint using c# ,and am reading the hyperlink back from the powerpoint by the below method.

for (int i = 0; i < presentation.Slides.Count; i++)
        {
            foreach (var item in presentation.Slides[i + 1].Shapes)
            {
                var shape = (PPT.Shape)item;
                if (shape.HasTextFrame == MsoTriState.msoTrue)
                {
                    if (shape.TextFrame.HasText == MsoTriState.msoTrue)
                    {
                        var textRange = shape.TextFrame.TextRange;
                        var text = textRange.Text;

                        string address=textRange.ActionSettings[PPT.PpMouseActivation.ppMouseClick].Hyperlink.Address;
                    }
                }
            }

        }

where am getting the hyperlink address in the variable address, likewise i need to get the hyperlink from the image which i have inserted into PPT using c#.

Is it possible.??


Solution

  • One option would be to iterate through Shapes on a Slide and see, whether they contain hyperlink. Or you should give your picture an id when creating it and then find it by the given id.

        private void GetHyperlink()
        {
            Microsoft.Office.Interop.PowerPoint.Application objApp = new Microsoft.Office.Interop.PowerPoint.Application();
            objApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
            Presentations objPresSet = objApp.Presentations;
            Presentation p = objPresSet.Open("C:\test.ppt");
            Slide slide = p.Slides[1];
            // or Slide slide = objApp.ActiveWindow.View.Slide;
    
            for (int i = 1; i <= slide.Shapes.Count; i++)
            {
                //If the hyperlink address is filled then display it in MessageBox
                if (slide.Shapes[i].ActionSettings[PpMouseActivation.ppMouseClick].Hyperlink.Address != null)
                    MessageBox.Show(slide.Shapes[i].ActionSettings[PpMouseActivation.ppMouseClick].Hyperlink.Address);
            }
        }
    

    This code will display all hyperlinks on slide 1. Also it would be interesting to use Open XML SDK for this purpose instead of automation.

    Interesting link:

    http://www.aspose.com/docs/display/slidesnet/Finding+a+Shape+in+a+Slide

    EDIT:

    I suggest you first modify the code that creates the image with hyperlink like this:

            //Add a picture
            Shape pic = slide.Shapes.AddPicture(@"C:\Users\Public\Pictures\Sample Pictures\koala.jpg",
            Microsoft.Office.Core.MsoTriState.msoFalse,
            Microsoft.Office.Core.MsoTriState.msoTrue,
            shape.Left, shape.Top, shape.Width, shape.Height);
    
            //Here you have various options how to distinguish your shape
            pic.Name = "MyPic";
            pic.AlternativeText = "Koala";
            pic.Tags.Add("MyPic", "@http://www.google.com/");
    
            //adding hyperlink, etc...
            pic.ActionSettings[PpMouseActivation.ppMouseClick].Hyperlink.Address =@"http://www.google.com/"
    

    Then when you read the file you can use tags or name to distinguish shapes:

                //tags check
                if (slide.Shapes[i].Tags.Count > 0 && slide.Shapes[i].Tags["MyPic"]!=null && slide.Shapes[i].ActionSettings[PpMouseActivation.ppMouseClick].Hyperlink.Address != null)
                    MessageBox.Show(slide.Shapes[i].ActionSettings[PpMouseActivation.ppMouseClick].Hyperlink.Address);
                //or
                //name check
                if (slide.Shapes[i].Name.Equals("MyPic", StringComparison.InvariantCultureIgnoreCase) && slide.Shapes[i].ActionSettings[PpMouseActivation.ppMouseClick].Hyperlink.Address != null)
                    MessageBox.Show(slide.Shapes[i].ActionSettings[PpMouseActivation.ppMouseClick].Hyperlink.Address);