[英]I am merging two Word documents with OpenXML SDK but get a corrupt document when copying an image into a header
我有適用於各種不同情況的代碼,包括將圖像復制到文檔正文中時的代碼。
該代碼在將一個文檔的頁眉和頁腳復制(添加)到另一個文檔時起作用,只要要復制的頁眉/頁腳不包含圖像即可。
當我復制其中包含圖像的標頭時,結果文件已損壞,並且當我嘗試使用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和目標頭HeaderParts,以及源頭XML,將其復制到目標文檔之后。 調用上述過程后,將調用destinationHeaderPart.Header.Save()。
就像我上面說的,如果源頭中沒有圖像,那么生成的文檔就很好了(即,當foreach在源XML中找不到任何繪圖元素時)。
但是,我不知道標題中圖像的這種症狀是否可能是紅色鯡魚,而真正的問題在其他地方。
正如我在對問題的評論中所說的那樣,將圖像包含在頁眉和頁腳中的代碼很好-它可以解決問題。
我如何解決我的代碼(在其他地方)創建的文件損壞的問題,這是經過反復試驗的。 正如其他貢獻者所說的那樣,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);
}
如果在將_memoryStream寫入FileStream之前立即調用ReopenDocument方法,則可以避免損壞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.