2017-05-05 87 views
1

我想使用openxml SDK從Word和PowerPoint文件中刪除所有嵌入的對象。我是Open XML的新手,不確定我是否正確地做到了這一點。以下是我的代碼。我的意圖是刪除嵌入的任何對象並刪除嵌入的圖像。這兩個代碼在執行時都會給出錯誤。如何使用Open XML SDK刪除Word和PowerPoint中的所有嵌入對象?

我嘗試刪除文檔中所有嵌入項目的代碼。

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文檔。

+0

我的代碼部分一樣,你執行後關閉文檔? – EasyE

+0

我還沒有完全理解Open XML的概念。 MSDN上提供的參考代碼不顯示關閉部分。你能解釋一下嗎?我認爲'使用'將關閉文件。 – Ian

+0

我假設你打開現有的單詞文檔,因爲你試圖刪除已經嵌入的對象是否正確? – EasyE

回答

0

我設法爲我的問題找到解決方案。我不得不深入到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); 
    } 
} 
0

根據我的經驗,「損壞」OpenXML文檔的最快方法是使用不良關係指針。處理這些隱含錯誤消息背後的最快方法是直接轉到原始OpenXML標記。

爲了獲得正在發生的事情的想法:

  1. 運行代碼之前,請務必文件的副本,請撥打本A.docx
  2. 運行你的代碼,使你的結果的複印件,稱這種B.docx
  3. 重命名A.docxB.docxA.zipB.zip

調查源文件

首先,在A.zip的內部,打開名爲[Content_Types].xml的文件。記下你想刪除的部分。可以將此文件視爲向文件處理器聲明它將在子目錄中遇到的文件類型。

諸如文檔內容(word/document.xml)或腳註部分(word/footnotes.xml)之類的部分具有其自己的關係部分,其名稱爲[part path here].rels

例如,document.xml.rels將在document.xml中保存諸如圖表,超鏈接和圖像之類的關係信息;同樣,footnotes.xml.relsfootnotes.xml中保存超鏈接等信息。

調查結果文件

現在打開B.zip和比較[Content_Types].xml文件。你有沒有看到你想要刪除的部分?是否有一部分遺漏,您不打算刪除?

裏面B.zipword子目錄中,你看到[Content_Types].xml文件中列出的任何嵌入文件?

如果您查看原始標記,並且錯誤不會跳出來,請隨時對有關您的文件結構的更多詳細信息發表評論,並且可以從那裏進行疑難解答。

相關問題