2012-03-08 21 views
1

我有代碼,在各種不同的情況下,將圖像複製到文檔中的身體的時候,包括工作時收到損壞的文件。我與合併OpenXML的SDK兩個Word文檔,但複製的圖像放入頭

複製代碼時(添加)的頁眉和頁腳從一個文檔到另一個,只要頁眉/複製頁腳不包含圖像的工作原理。

當我複製其中包含圖像的標題時,結果文件已損壞,當我嘗試用OpenXML SDK打開它時,它會引發異常,說「壓縮的部分數據長度不一致」。 我知道必須在HeaderPart中創建圖像(在複製到主體時與MainDocumentPart相對)。

它執行圖像的合併看起來像的代碼:

private void AddSourceImagesToDestination(XElement sourceXml, OpenXmlPart sourcePart, OpenXmlPart destPart) { 
     foreach(XElement drawingElement in sourceXml.Descendants(_mswDrawingElementName)) { 

     XAttribute aBlipEmbedAttribute = drawingElement.Descendants(_ablipElementName).First().Attribute(_embedAttributeName); 
     string relationshipId = aBlipEmbedAttribute.Value; 
     ImagePart sourceImagePart = (ImagePart)sourcePart.GetPartById(relationshipId); 
     ImagePart destinationImagePart = ((HeaderPart)destPart).AddImagePart(sourceImagePart.ContentType); 
     string newRelationshipId = destPart.GetIdOfPart(destinationImagePart); 
     aBlipEmbedAttribute.SetValue(newRelationshipId); 

     destinationImagePart.FeedData(sourceImagePart.GetStream(FileMode.Open, FileAccess.Read)); 
     } 
    } 

上面被稱爲傳遞源和目的地HeaderParts,並且將在此之後被複制到所述源標題的XML目的地文件。調用上述過程之後,將調用destinationHeaderPart.Header.Save()。

正如我前面所說,如果有在源頭中沒有圖像,則所得到的文檔是細(即,當在foreach沒有找到源XML任何繪圖元素)。

我不知道,不過,在頭圖像的這種症狀是否可能是一個紅色的鯡魚和真正的問題是其他地方。

+0

我有一點接近解決方案 - 我包含的上述代碼片段實際上正是需要的。問題似乎在於獲得正確的SDK調用以同步我在XML中所做的操作以及添加ImageParts,以便它們可以正確寫入輸出文檔。仍在工作... – Peter 2012-03-27 11:02:01

回答

3

正如我在關於這個問題的評論稱,該代碼包括圖像進入頁眉和頁腳是好的 - 它的伎倆。

我怎麼解決,我的代碼(其他地方)的創建損壞的文件的問題是一個有點試驗和錯誤的。正如其他貢獻者所說的,圍繞OpenXML的文檔並不太好。所以這個問題可能會有另一個解決方案,也許我的「解決方案」只是因爲其他副作用而起作用。

無論如何,我有一些代碼,看起來像這樣:

private MemoryStream _memoryStream; 
    private WordprocessingDocument _wordDocument; 
     ... 
    _wordDocument = WordprocessingDocument.Open(_memoryStream, true); 
     ... 

    private void ReopenDocument() { 
     _wordDocument.Package.Flush(); 
     _wordDocument.Close(); 
     MemoryStream newStream = new MemoryStream(); 
     _memoryStream.WriteTo(newStream); 
     _memoryStream.Close(); 
     _memoryStream = newStream; 
     _memoryStream.Position = 0L; 
     _wordDocument = WordprocessingDocument.Open(_memoryStream, true); 
    } 

如果我稱之爲ReopenDocument方法之前立即寫_memoryStream到一個FileStream,那麼腐敗是可以避免的。

+0

嗨。這個答案對我很有幫助。我有類似的問題,但是,我發現的作品是,您必須在嘗試讀取內容之前正確處理_wordDocument。 – eburgos 2013-09-16 15:22:09

相關問題