Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OpenXMLSDK删除标头中的图像_C#_Openxml_Openxml Sdk - Fatal编程技术网

C# 使用OpenXMLSDK删除标头中的图像

C# 使用OpenXMLSDK删除标头中的图像,c#,openxml,openxml-sdk,C#,Openxml,Openxml Sdk,我曾经使用过OpenXMLSDK,并制作了一个替换word文档标题中图像的POC。然而,当我试图调用DeletePart或DeleteParts来删除我想要删除的图像时,它并没有达到预期的效果 当我后来打开word文档时,之前有一个图像,现在有一个框架,上面有文本“此图像当前无法显示”和一个红十字 通过一点谷歌搜索,这些引用似乎还没有被完全删除,但我找不到任何关于如何删除的帮助 下面是我如何删除图像的示例。我只将其中一些添加到列表中,因为我需要删除除具有特定uri的以外的所有内容 //...

我曾经使用过OpenXMLSDK,并制作了一个替换word文档标题中图像的POC。然而,当我试图调用DeletePart或DeleteParts来删除我想要删除的图像时,它并没有达到预期的效果

当我后来打开word文档时,之前有一个图像,现在有一个框架,上面有文本“此图像当前无法显示”和一个红十字

通过一点谷歌搜索,这些引用似乎还没有被完全删除,但我找不到任何关于如何删除的帮助

下面是我如何删除图像的示例。我只将其中一些添加到列表中,因为我需要删除除具有特定uri的以外的所有内容

//...

foreach(HeaderPart headerPart in document.MainDocumentPart.HeaderParts) {

    List<ImagePart> list = new List<ImagePart>();
    List<ImagePart> imgParts = new List<ImagePart> (headerPart.ImageParts);

    foreach(ImagePart headerImagePart in imgParts) {

         string newUri = headerImagePart.Uri.ToString();
              if(newUri != uri) {
                   list.Add(headerImagePart);
              }
         }

    headerPart.DeleteParts(list);
}
//...
/。。。
foreach(HeaderPart HeaderPart in document.MainDocumentPart.HeaderParts){
列表=新列表();
List imgParts=新列表(headerPart.ImageParts);
foreach(ImagePart标题ImagePart在imgParts中){
字符串newUri=headerImagePart.Uri.ToString();
if(newUri!=uri){
列表。添加(标题图像部分);
}
}
标题部分删除零件(列表);
}
//...

图像在OpenXml中由两部分组成;您拥有实际图像本身,还拥有图像显示在文档中的
图片
容器的详细信息

如果您认为一个图像在同一文档中显示了多次,这是有意义的;图像的细节可以存储一次,图像的位置可以根据需要存储多次

以下代码将查找包含要删除的
ImagePart
对象的任何
图形
对象。这是通过将
Blip
Embed
属性与
ImagePart
的Id相匹配来实现的

using (WordprocessingDocument document = WordprocessingDocument.Open(filename, true))
{
    foreach (HeaderPart headerPart in document.MainDocumentPart.HeaderParts)
    {
        List<ImagePart> list = new List<ImagePart>();
        List<ImagePart> imgParts = new List<ImagePart>(headerPart.ImageParts);
        List<Drawing> drwdDeleteParts = new List<Drawing>();
        List<Drawing> drwParts = new List<Drawing>(headerPart.RootElement.Descendants<Drawing>());

        foreach (ImagePart headerImagePart in imgParts)
        {
            string newUri = headerImagePart.Uri.ToString();
            if (newUri != uri)
            {
                list.Add(headerImagePart);

                //you also need to find the Drawings the image was related to
                IEnumerable<Drawing> drawings = drwParts.Where(d => d.Descendants<Pic.Picture>().Any(p => p.BlipFill.Blip.Embed == headerPart.GetIdOfPart(headerImagePart)));

                foreach (var drawing in drawings)
                {
                    if (drawing != null && !drwdDeleteParts.Contains(drawing))
                        drwdDeleteParts.Add(drawing);
                }
            }
        }

        foreach (var d in drwdDeleteParts)
        {
            d.Remove();
        }

        headerPart.DeleteParts(list);
    }
}

非常感谢你!这让我对眼前的问题有了更好的理解,彻底解决了我的问题!我确实在运行代码时遇到了一些问题,但是使用Pic=DocumentFormat.OpenXml.Drawing.Pictures添加代码时遇到了一些问题;解决了:)再一次,非常感谢!!很好的观点@anl_extrico,我已经编辑了答案,为将来的读者提供了答案。顺便说一句,不客气,我很高兴能帮上忙。
Pic = DocumentFormat.OpenXml.Drawing.Pictures;