C# 我正在将两个Word文档与OpenXMLSDK合并,但在将图像复制到头中时会得到一个损坏的文档
我有在各种不同情况下都能工作的代码,包括将图像复制到文档主体时 在将页眉和页脚从一个文档复制到另一个文档时,只要复制的页眉/页脚不包含图像,该代码就可以工作 当我复制一个包含图像的头文件时,结果文件已损坏,当我尝试使用OpenXMLSDK打开它时,它会抛出一个异常,表示压缩部分的数据长度不一致。 我确实知道,在复制到主体中时,图像必须在主体部分中创建,而不是在主文档部分中创建 合并图像的代码如下所示:C# 我正在将两个Word文档与OpenXMLSDK合并,但在将图像复制到头中时会得到一个损坏的文档,c#,openxml,wordprocessingml,C#,Openxml,Wordprocessingml,我有在各种不同情况下都能工作的代码,包括将图像复制到文档主体时 在将页眉和页脚从一个文档复制到另一个文档时,只要复制的页眉/页脚不包含图像,该代码就可以工作 当我复制一个包含图像的头文件时,结果文件已损坏,当我尝试使用OpenXMLSDK打开它时,它会抛出一个异常,表示压缩部分的数据长度不一致。 我确实知道,在复制到主体中时,图像必须在主体部分中创建,而不是在主文档部分中创建 合并图像的代码如下所示: private void AddSourceImagesToDestination(X
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,以便将它们正确写入输出文档。还在工作…嗨。这个答案对我很有帮助。我有一个类似的问题,但是,我发现有效的是,在阅读内容之前,你必须正确地处理这个文档。非常感谢!浪费了这么多时间!这很有魅力!你好这个答案对我很有帮助。我有一个类似的问题,但是,我发现有效的是,在阅读内容之前,你必须正确地处理这个文档。非常感谢!浪费了这么多时间!这很有魅力!