2017-04-10 44 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