У меня есть код, который работает во всех видах различных ситуаций, в том числе при копировании изображений в тело документа.Я объединяю два документа Word с OpenXML SDK, но получаю поврежденный документ при копировании изображения в заголовок
Код работает при копировании (добавлении) верхних и нижних колонтитулов с одного документа на другой, при условии, что скопированные колонтитулы не содержат изображений.
Когда я копирую заголовок с изображением в нем, то полученный файл поврежден, и когда я пытаюсь открыть его с помощью 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).
Интересно, однако, является ли этот симптом изображений в заголовке, возможно, красной селедкой, а настоящая проблема - в другом месте.
У меня есть немного ближе к решению - приведенный выше фрагмент кода, который я включил, на самом деле является именно тем, что необходимо. Кажется, что проблема заключается в получении правильного вызова SDK для синхронизации того, что я сделал в XML, и добавления ImageParts, чтобы они правильно записывались в выходной документ. Все еще работает ... – Peter