2017-04-10 69 views
2

我已经使用OpenXML SDK进行了一些工作,并且制作了一个替换Word文档中标题中的图像的POC。但是,当我尝试使用要删除的图像调用DeletePart或DeleteParts时,它不会如预期那样。使用OpenXML SDK删除标题中的图像

当我之后打开单词文档时,以前有一个图像,现在有一个框架文本“此图像目前无法显示”和红色十字。

从Google检索它的出现犹如引用尚未完全消除,但我无法找到如何做到这一点任何帮助..

下面是我如何删除图像的例子。我只添加一些人到列表中,因为我需要一个特定的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); 
} 
//... 

回答

1

图像由两个部分组成的OpenXML的;您具有实际图像本身,并且您还具有图像在文档中显示的Picture容器的详细信息。

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

下面的代码会发现,包含您要删除的ImagePart对象的任何Drawing对象。这是通过将BlipEmbed属性与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); 
    } 
} 

当您在评论中指出的,你需要添加一个using语句:

Pic = DocumentFormat.OpenXml.Drawing.Pictures; 
+0

非常感谢您!这让我更好地了解手头的问题,并彻底解决了我的问题! 我确实有一个小问题,运行代码,但添加使用Pic = DocumentFormat.OpenXml.Drawing.Pictures;解决了:)再一次,非常感谢你! –

+0

好点@anl_extrico,我已经编辑了答案,以包括任何未来的读者。顺便提一下,我很高兴能够提供帮助。 – petelids