C# 我正在将两个Word文档与OpenXMLSDK合并,但在将图像复制到头中时会得到一个损坏的文档

C# 我正在将两个Word文档与OpenXMLSDK合并,但在将图像复制到头中时会得到一个损坏的文档,c#,openxml,wordprocessingml,C#,Openxml,Wordprocessingml,我有在各种不同情况下都能工作的代码,包括将图像复制到文档主体时 在将页眉和页脚从一个文档复制到另一个文档时,只要复制的页眉/页脚不包含图像,该代码就可以工作 当我复制一个包含图像的头文件时,结果文件已损坏,当我尝试使用OpenXMLSDK打开它时,它会抛出一个异常,表示压缩部分的数据长度不一致。 我确实知道,在复制到主体中时,图像必须在主体部分中创建,而不是在主文档部分中创建 合并图像的代码如下所示: private void AddSourceImagesToDestination(X

我有在各种不同情况下都能工作的代码,包括将图像复制到文档主体时

在将页眉和页脚从一个文档复制到另一个文档时,只要复制的页眉/页脚不包含图像,该代码就可以工作

当我复制一个包含图像的头文件时,结果文件已损坏,当我尝试使用OpenXMLSDK打开它时,它会抛出一个异常,表示压缩部分的数据长度不一致。 我确实知道,在复制到主体中时,图像必须在主体部分中创建,而不是在主文档部分中创建

合并图像的代码如下所示:

    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));
      }  
  }
上述操作称为传递源和目标标题部分,以及源标题的XML,该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写入文件流之前立即调用restorocument方法,则可以避免损坏。

正如我在对问题的评论中所说,将图像包含到页眉和页脚中的代码很好-它成功了

我是如何解决我的代码在别处创建的损坏文件的问题的,只是经过了一些尝试和错误。正如其他贡献者所说,关于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写入文件流之前立即调用restorocument方法,那么就可以避免损坏。

我更接近于一个解决方案—我所包含的上述代码片段实际上正是所需的。问题似乎在于获得正确的SDK调用以同步我在XML中所做的工作,以及添加ImageParts,以便将它们正确写入输出文档。仍然在工作…我离一个解决方案有点近了-我包含的上面的代码片段实际上正是所需要的。问题似乎在于获得正确的SDK调用以同步我在XML中所做的工作,以及添加ImageParts,以便将它们正确写入输出文档。还在工作…嗨。这个答案对我很有帮助。我有一个类似的问题,但是,我发现有效的是,在阅读内容之前,你必须正确地处理这个文档。非常感谢!浪费了这么多时间!这很有魅力!你好这个答案对我很有帮助。我有一个类似的问题,但是,我发现有效的是,在阅读内容之前,你必须正确地处理这个文档。非常感谢!浪费了这么多时间!这很有魅力!