Я объединяю два документа Word с OpenXML SDK, но получаю поврежденный документ при копировании изображения в заголовок - PullRequest
2 голосов
/ 08 марта 2012

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

Код работает при копировании (добавлении) верхних и нижних колонтитулов из одного документа в другой,до тех пор, пока копируемые верхние / нижние колонтитулы не содержат изображений.

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

Вышеуказанное называется передачей заголовка источника и получателя, а также XML заголовка источника, который после этого будет скопирован в целевой документ.После вызова описанной выше процедуры вызывается destinationHeaderPart.Header.Save ().

Как я уже говорил выше, если в исходном заголовке нет изображений, то с результирующим документом все в порядке (т. Е. Когда foreach не 'я не могу найти какие-либо элементы рисования в исходном XML).

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

1 Ответ

4 голосов
/ 02 апреля 2012

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

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

...