Estoy fusionando dos documentos de Word con OpenXML SDK, pero obtenga un documento corrupto al copiar una imagen en un encabezado

StackOverflow https://stackoverflow.com//questions/9617372

  •  09-12-2019
  •  | 
  •  

Pregunta

Tengo código que funciona en todo tipo de situaciones diferentes, incluso cuando copie las imágenes en el cuerpo del documento.

El código funciona al copiar (agregar) encabezados y pies de página de un documento a otro, siempre que los encabezados / pies de página que se copien no contengan imágenes.

Cuando copia un encabezado que tiene una imagen en ella, entonces el archivo resultante está dañado, y cuando intento abrirlo con el SDK OpenXML, lanza una excepción que dice que "la parte comprimida tiene una longitud de datos inconsistente". Sé que la imagen tiene que ser creada en el encabezado (en contra de la maindocumentpart al copiar en el cuerpo).

El código que hace la fusión de la imagen se ve algo como:

    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));
      }  
  }

Los anteriores se denominan pasar los encabezados de origen y destino, y el XML del encabezado de origen que después de esto se copiará en el documento de destino. Después de llamar al procedimiento anterior, se llama DestinationHeaderPart.Header.Save ().

Como dije anteriormente, si no hay imágenes en el encabezado de origen, entonces el documento resultante está bien (es decir, cuando el foreach no encuentra ningún elemento de dibujo en la fuente XML).

Me pregunto, sin embargo, si este síntoma de las imágenes en el encabezado es quizás un arenque rojo y el problema real es en otro lugar.

¿Fue útil?

Solución

Como dije en el comentario sobre la pregunta, el código para incluir las imágenes en el encabezado y el pie de página estuvo bien, hizo el truco.

Cómo resolví el problema del archivo corrupto que mi código (en otro lugar) estaba creando fue un poco de prueba y error.Como otros contribuyentes han dicho, la documentación alrededor de OpenXML es, para ponerla suavemente, no muy buena.Por lo tanto, podría haber otra resolución a este problema, y tal vez mi "solución" solo funciona debido a algunos otros efectos secundarios.

De todos modos, tengo algún código que se parece a esto:

    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);
    }

Si llamo al método de reopendocument inmediatamente antes de escribir el _MemoryStream a un Filtream, entonces se evita la corrupción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top