【问题标题】:Failed to clone new PowerPoint slide with images无法克隆带有图像的新 PowerPoint 幻灯片
【发布时间】:2017-10-03 11:03:11
【问题描述】:

我想克隆 PowerPoint 文档的一张幻灯片,并使用 OpenXML 插入到同一个文档中。为此,我使用了以下功能:

public static void AddNewSlide(PresentationPart parent, Slide _slideTemplate, string newId)
{
    var newSlidePart = parent.AddNewPart<SlidePart>(newId);
    newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open));
    newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart));
    newSlidePart.Slide.Save();
    
    DocumentFormat.OpenXml.Presentation.SlideIdList slideIdList = parent.Presentation.SlideIdList;
    uint maxSlideId = 1;

    foreach (DocumentFormat.OpenXml.Presentation.SlideId slideId in slideIdList.ChildElements)
    {
        if (slideId.Id > maxSlideId) maxSlideId = slideId.Id;
    }
    
    DocumentFormat.OpenXml.Presentation.SlideId newSlideId = new DocumentFormat.OpenXml.Presentation.SlideId { Id = ++maxSlideId, RelationshipId = parent.GetIdOfPart(newSlidePart) };
    slideIdList.Append(newSlideId);
}

如果原始幻灯片仅包含文本,它可以正常工作,但是当原始幻灯片也包含图像时,结果 PowerPoint 文档将损坏。新幻灯片上的图片将不会显示,只会显示一条消息:“当前无法显示此图片。”

【问题讨论】:

    标签: c# powerpoint openxml-sdk


    【解决方案1】:

    此代码正在生成损坏的幻灯片,因为它只复制数据和布局,而不是幻灯片中的图像。

    newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open));
    newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart));
    

    例如:上面的 2 行表示新幻灯片引用了一张图片,但新幻灯片中缺少该图片本身。因此,要解决这个问题,您还需要编写将图像从旧幻灯片复制到新幻灯片的代码。

    //add all the image part from the source slide to the new one
    
    List<ImagePart> imageParts = new List<ImagePart>();
    sourceSlidePart.GetPartsOfType<ImagePart>(imageParts);
    
    foreach (ImagePart img in imageParts)
    {
        string relID = sourceSlidePart.GetIdOfPart(img); // get relationship ID
    
        ImagePart newImagePart = newSlidePart.AddImagePart(img.ContentType, relID);
    
        newImagePart.FeedData(img.GetStream(FileMode.Open));
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多