Sto unendo due documenti di parole con SDK OpenXML ma ottieni un documento corrotto quando si copia un'immagine in un'intestazione

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

  •  09-12-2019
  •  | 
  •  

Domanda

Ho il codice che funziona in tutti i tipi di diverse situazioni, anche quando copia le immagini nel corpo del documento.

Il codice funziona quando si copiano (aggiungendo) intestazioni e piè di pagina da un documento all'altro, purché le intestazioni / piè di pagina che vengono copiate non contengano immagini.

Quando copio un'intestazione che ha un'impresa in esso, il file risultante è corrotto e quando provo ad aprirlo con l'SDK OpenXML getta un'eccezione che dice "La parte compressa ha una lunghezza dei dati incoerente". So che l'immagine deve essere creata in headterpart (come contro il MaindocumentPart quando si copia nel corpo).

Il codice che la fusione dell'immagine sembra qualcosa di simile:

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

Quanto sopra si chiama passando gli headterparts di origine e destinazione e l'XML dell'intestazione sorgente che sarà dopo essere copiato nel documento di destinazione. Dopo aver chiamato la procedura sopra riportata, DestinationHeaderPart.Header.Save () è chiamato.

Come ho detto sopra, se non ci sono immagini nell'intestazione sorgente, il documento risultante va bene (cioè quando il Foreach non trova elementi di disegno nella sorgente XML).

Mi chiedo, però, se questo sintomo delle immagini nell'intestazione è forse un'erratura rossa e il vero problema è da qualche altra parte.

È stato utile?

Soluzione

Come ho detto nel commento sulla domanda, il codice per includere le immagini nell'intestazione e il piè di pagina andava bene - ha fatto il trucco.

Come ho risolto il problema del file corrotto che il mio codice (altrove) stava creando era un po 'di prova ed errore.Come hanno detto altri contributori, la documentazione attorno a OpenXML è, per metterla moderatamente, non molto buona.Quindi potrebbe esserci un'altra risoluzione a questo problema, e forse la mia "soluzione" funziona solo a causa di altri effetti collaterali.

Comunque, ho qualche codice che assomiglia a questo:

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

Se chiamo immediatamente il metodo di reopendocument prima di scrivere il _MemoryStream a un filestream, quindi viene evitata la corruzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top