使用Open XML SDK添加到现有图像的超链接

时间:2018-05-02 17:38:23

标签: c# openxml openxml-sdk

我正在努力想出一个简洁的方法去做我想象的很简单的事情......我有一个简单的现有PowerPoint演示文稿,其中有一张幻灯片,其中有一张图片。

我想用Open XML SDK(托管在.Net Core Web应用程序中)以编程方式打开它,并为此添加一个超链接,并将其保存...这样当它在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 :(得分:0)

感谢@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");
            }

为了能够编辑文件而不修改我复制到内存流的原始文件并打开它 - 在我的Web应用程序中,我可以将此内存流传输回客户端。