如何使用Open XML SDK删除Word和PowerPoint中的所有嵌入式对象?

坎南·苏雷什(Kannan Suresh)

我正在尝试使用openxml SDK从Word和PowerPoint文件中删除所有嵌入的对象。我是Open XML的新手,不确定我是否正确执行此操作。下面是我的代码。我的意图是删除所有嵌入的对象并删除嵌入的图像。这两个代码在执行时都出错。

我试图删除文档中所有嵌入项目的代码。

using (var wdDoc = WordprocessingDocument.Open(wordFilePath, true))
{
    var docPart = wdDoc.MainDocumentPart;
    var document = docPart.Document;
    var embeddedObjectsCount = docPart.EmbeddedObjectParts.Count();
    while (embeddedObjectsCount > 0)
    {
        docPart.DeletePart(docPart.EmbeddedObjectParts.FirstOrDefault());
        embeddedObjectsCount = docPart.EmbeddedObjectParts.Count();
    }
}

我试图删除文档中所有图像的代码。(如果我在文档中没有嵌入任何对象,则这部分起作用。)

using (var wdDoc = WordprocessingDocument.Open(wordFilePath, true))
{
    var docPart = wdDoc.MainDocumentPart;
    var document = docPart.Document;
    var imageObjectsCount = docPart.ImageParts.Count();
    while (imageObjectsCount > 0)
    {
        docPart.DeletePart(docPart.ImageParts.FirstOrDefault());
        imageObjectsCount = docPart.ImageParts.Count();
    }
}

当我运行上述代码时,我使用的文件已损坏。我想知道如何在不损坏文件的情况下从Word中删除所有嵌入的对象。

我还没有在PowerPoint上做任何事情,但是希望它与Word文档类似。

坎南·苏雷什(Kannan Suresh)

我设法找到解决问题的方法。我必须深入研究Open XML SDK的概念才能做到这一点。但是,我不确定这是否是最佳解决方案。

目标

  1. 删除PowerPoint和Word中的所有嵌入式对象。

  2. 删除PowerPoint和Word中的所有图像。

对于Word

//using Ovml = DocumentFormat.OpenXml.Vml.Office;
//Determine whether there are any Embedded Objects in the document
using (var wdDoc = WordprocessingDocument.Open(wordFilePath, true))
{
    var docPart = wdDoc.MainDocumentPart;
    var docHasEmbeddedOleObjects = document.Body.Descendants<Ovml.OleObject>().Any();
    if (docHasEmbeddedOleObjects)
    {
        foreach (var oleObj in document.Body.Descendants<Ovml.OleObject>())
        {
            oleObj.Remove(); //Remove each ole object in the document. This will remove the object from view in word.
        }
        //Delete the embedded objects. This will remove the actual attached files from the document.
        docPart.DeleteParts(docPart.EmbeddedObjectParts);
        //Delete all picture in the document
        docPart.DeleteParts(docPart.ImageParts);
    }
}

对于PowerPoint

using (var ppt = PresentationDocument.Open(powerPointFilePath, true))
{
    foreach (var slide in slides)
    {
        //Remove Ole Objects
        var oleObjectCount = slide.Slide.Descendants<OleObject>().Count();
        while (oleObjectCount > 0)
        {
            var oleObj = slide.Slide.Descendants<OleObject>().FirstOrDefault();
            var oleObjGraphicFrame = oleObj?.Ancestors<GraphicFrame>().FirstOrDefault();
            if (oleObjGraphicFrame != null)
            {
                oleObjGraphicFrame.RemoveAllChildren();
                oleObjGraphicFrame.Remove();
            }
            oleObjectCount = slide.Slide.Descendants<OleObject>().Count();
        }
        //Delete embedded objects
        slide.DeleteParts(slide.EmbeddedObjectParts);
        //Delete all pictures
        slide.DeleteParts(slide.ImageParts);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用 Open XML SDK 在 PPTx 中插入视频?

如何使用Open XML SDK在Word表的空白单元格中设置字体大小?

如何打开(并保存)Word文档中的所有嵌入式文档?

如何使用xsl从xml文件读取嵌入式图像

如何在MongoDB的数组字段中查询和删除嵌入式对象?

如何从Mongoose模式的嵌入式对象中删除_id?

如何使用注释代替XML在嵌入式Tomcat中创建自定义组件标签

如何从具有一些嵌入式数据的XML文档中填充C#类?

使用Open XML SDK从演示文稿中删除除2张幻灯片以外的所有幻灯片

如何在 C# 中使用 Open XML SDK 锁定 word 文档上的所有字段(CTRL-A、CTRL-F11)

如何在C#中使用Open XML从Word文档中查找确切的单词?

带有嵌入式HTML和验证的XML模式

Open XML SDK:如何为WordprocessingDocument.Open获取有效的Word文档

如何使XML文件成为vNext(ASP.NET 5)类库中的嵌入式资源?

使用web.xml配置嵌入式码头吗?

如何使用Open XML SDK将文本插入内容控件

如何使用typeorm排除Postgres嵌入式数组中的所有匹配项?

如何在ASP.net中使用Open XML创建多级有序列表?

如何使用 C# 中的 Open xml 从 docx 文件中获取图像名称或 ID?

如何使用 Linq 打开 Open XML

如何使用打开的XML SDK获取Word文档的所有合并字段

如何防止嵌入式对象图片出现在Word 2013的目录中?

如何在PowerPoint中使用VBA打开嵌入式OLE对象

使用Open XML和C#读取Word书签

使用Underscore删除使用嵌入式数组的对象

如何从Xcode中的“框架,库和嵌入式内容”中删除空白行

如何使用 lxml 删除所有 XML 标记并去除空格?

如何在嵌入式ElasticSearch中记录所有查询?

如何在NotePad ++中删除折叠的XML节点(和所有子节点)