簡體   English   中英

我將兩個Word文檔與OpenXML SDK合並,但是在將圖像復制到標題中時得到了損壞的文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM