微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用OpenXML将幻灯片插入另一张PowerPoint幻灯片?

如何解决如何使用OpenXML将幻灯片插入另一张PowerPoint幻灯片?

我想拿一张PowerPoint幻灯片(“源”),并将其插入到已经包含一些内容的另一张PowerPoint幻灯片(“目标”)中,位于源PowerPoint幻灯片的特定位置。

我已经尝试了几种方法来研究执行此操作的代码,但是我不断获得将幻灯片合并到PowerPoint演示文稿中的结果,这不是我想要的。我想拍摄一张现有的幻灯片并将其插入到另一张幻灯片中,就像将一张图片插入到一张现有的幻灯片中一样。

我有另一位同事编写的代码,该代码从源幻灯片中克隆了所有元素,但是却很复杂,并且针对不同的元素类型使用了不同的代码变体。这是该代码的代表性示例:

foreach (OpenXmlElement element in sourceSlide.CommonSlideData.ShapeTree.ChildElements.ToList())
{
    string elementTypeName = element.GetType().ToString();

    if (elementTypeName.EndsWith(".Picture"))
    {
        // Deep clone the element.
        elementClone = element.CloneNode(true);

        // Adjust the offsets so it is positioned correctly.
        ((Picture)elementClone).ShapeProperties.Transform2D.Offset.X += (Int64)shapestruct.OffsetX;
        ((Picture)elementClone).ShapeProperties.Transform2D.Offset.Y += (Int64)shapestruct.OffsetY;

        // Get the shape tree that we're adding the clone to and append to it.
        ShapeTree shapeTree = slideCard.CommonSlideData.ShapeTree;
        shapeTree.Append(elementClone);

        string rId = ((Picture)element).BlipFill.Blip.Embed.Value;

        ImagePart imagePart = (ImagePart)slideInstProc.SlidePart.GetPartById(rId);
        string contentType = imagePart.ContentType;

        // Locate the same object we cloned over to the slide.
        var blip = ((Picture)elementClone).BlipFill.Blip;

        slidePart = slideCard.SlidePart;

        try
        {
            ImagePart imagePart1 = slidePart.AddImagePart(contentType,rId);
            imagePart1.FeedData(imagePart.GetStream());
        }
        catch (XmlException)
        {
            //Console.WriteLine(xe.ToString());
            Console.WriteLine("Duplicate rId (" + rId + ")");
        }
    }
    if (elementTypeName.EndsWith(".GroupShape"))
    {
        ... etc

代码以else-if梯形图继续,其中包含元素类型名称.GroupShape.GraphicFrame.Shape.ConnectionShape结尾的代码块其他都在底部

问题是此代码无法正确处理某些类型的对象。一方面,它根本不处理图形(也许是因为其中一些源自旧版本的PowerPoint),而当处理时,它会进行诸如更改图形颜色的操作。

我希望有一种更基本的方法(即,更简单的通用代码)将源PowerPoint幻灯片嵌入到另一个幻灯片中,将其视为单个对象,而无需特别查看源PowerPoint中的元素类型。 / p>

或者,以普通的“形状”处理不能将自己明确标识为图像的图形或图像的方法是什么?

解决方法

这是解决了我上面描述的特定问题的代码:

using A = DocumentFormat.OpenXml.Drawing;

foreach(A.BlipFill blipFill in shape.Descendants<A.BlipFill>())
{
    string rId = blipFill.Blip.Embed.Value;
    ImagePart imagePart = (ImagePart)slideInstProc.SlidePart.GetPartById(rId);
    string contentType = imagePart.ContentType;

    try
    {
        ImagePart imagePart1 = slidePart.AddImagePart(contentType,rId);
        imagePart1.FeedData(imagePart.GetStream());
    }
    catch (XmlException)
    {
        Console.WriteLine("Duplicate rId (" + rId + ")");
    }
}

将其应用于elementTypeName.EndsWith(".shape");时会产生我想要的结果。

要将完整的幻灯片组成一个演示文稿(不需要我们做某些生成机制),OpenXmlPowerTools是更好的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。