2012-03-08 4 views
1

У меня есть код, который работает во всех видах различных ситуаций, в том числе при копировании изображений в тело документа.Я объединяю два документа 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).

Интересно, однако, является ли этот симптом изображений в заголовке, возможно, красной селедкой, а настоящая проблема - в другом месте.

+0

У меня есть немного ближе к решению - приведенный выше фрагмент кода, который я включил, на самом деле является именно тем, что необходимо. Кажется, что проблема заключается в получении правильного вызова SDK для синхронизации того, что я сделал в XML, и добавления ImageParts, чтобы они правильно записывались в выходной документ. Все еще работает ... – Peter

ответ

3

Как я уже сказал в комментарии к вопросу, код для включения изображений в верхний и нижний колонтитулы был в порядке - он сделал трюк.

Как я решил проблему с поврежденным файлом, который создавал мой код (в другом месте), был немного проб и ошибок. Как говорили другие участники, документация вокруг 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); 
    } 

Если я вызываю метод ReopenDocument непосредственно перед записью в _memoryStream к FileStream, то коррупция избегала.

+0

Привет. Этот ответ был полезен для меня. У меня была аналогичная проблема, однако, что я нашел, что работает, так это то, что вы должны правильно распоряжаться _wordDocument, прежде чем пытаться прочитать содержимое. – eburgos