Добавление гиперссылки на существующее изображение с помощью Open XML SDK - PullRequest
0 голосов
/ 02 мая 2018

Я изо всех сил пытаюсь найти краткий способ сделать то, что, как мне кажется, было бы довольно простым ... У меня есть простая существующая презентация PowerPoint с одним слайдом и одним изображением.

Я хочу программно открыть его с помощью Open XML SDK (размещенного в веб-приложении .Net Core), добавить к нему гиперссылку и сохранить ее ... так, чтобы при ее открытии в PowerPoint можно было управлять + щелчком на картинке, чтобы перейти по ссылке.

        using (var ppt = PresentationDocument.Open("powerpoint.pptx", true))
        {
            var image = ppt.PresentationPart.SlideParts.First().ImageParts.First();

            // Code to add hyperlink to image here - a bit like:
            // image.HyperLink = "http://somewebpage"

            ppt.Save();
        }

1 Ответ

0 голосов
/ 04 мая 2018

Благодаря помощи комментария от @Cindy Mester, я смог сократить предложенный код миграции из Open XML SDK Productivity Tool до следующего:

        using (var ms = new MemoryStream())
        {
            var original = File.OpenRead("withoutlink.pptx");
            original.CopyTo(ms);

            using (var ppt = PresentationDocument.Open(ms, true))
            {
                var slidePart1 = ppt.PresentationPart.SlideParts.First();

                var slide1 = slidePart1.Slide;

                var commonSlideData1 = slide1.GetFirstChild<CommonSlideData>();

                var shapeTree1 = commonSlideData1.GetFirstChild<ShapeTree>();

                var picture1 = shapeTree1.GetFirstChild<Picture>();

                var nonVisualPictureProperties1 = picture1.GetFirstChild<NonVisualPictureProperties>();

                var nonVisualDrawingProperties1 =
                    nonVisualPictureProperties1.GetFirstChild<NonVisualDrawingProperties>();

                var nonVisualDrawingPropertiesExtensionList1 = nonVisualDrawingProperties1
                    .GetFirstChild<A.NonVisualDrawingPropertiesExtensionList>();

                var relationshipId = "rId" + nonVisualPictureProperties1.Count();

                var hyperlinkOnClick1 = new A.HyperlinkOnClick {Id = relationshipId};
                nonVisualDrawingProperties1.InsertBefore(hyperlinkOnClick1,
                    nonVisualDrawingPropertiesExtensionList1);

                slidePart1.AddHyperlinkRelationship(new Uri("http://www.google.com/", UriKind.Absolute), true,
                    relationshipId);

                ppt.SaveAs("withlink.pptx");
            }

Для того, чтобы я мог редактировать файл без изменения оригинала, я скопировал его в поток памяти и открыл его: в моем веб-приложении я могу передать этот поток памяти обратно клиенту.

...