2017-04-10 9 views
2

OpenXML SDKで少し作業し、ワード文書のヘッダーにある画像を置き換えるPOCを作成しました。ただし、削除したい画像でDeletePartまたはDeletePartsを呼び出そうとすると、期待どおりに行かない。OpenXML SDKでヘッダー内の画像を削除する

「doc」という単語を後で開いたとき、以前に画像があった場所に、「この画像は現在表示できません」というテキストと赤い十字が表示されます。参照が完全に除去されていないかのようにそれをグーグルでのビットから

が表示されますが、私はそれを行う方法上の任意のヘルプを見つけることができません。..

以下は、私が画像を削除する方法の一例です。私は特定の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での2部で構成されています。あなたは実際の画像そのものを持っていて、文書に画像が表示されている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

関連する問題