Document corrompu après avoir appelé AddAlternativeFormatImportPart à l’aide d’OpenXml

J’essaie de créer un AddAlternativeFormatImportPart dans un fichier .docx afin de le référencer dans le document via AltChunk. Le problème est que le code ci-dessous provoque la lecture du fichier docx comme corrompu et ne peut pas être ouvert.

ssortingng html = "some html code." ssortingng altChunkId = "html234"; var document = WordprocessingDocument.Open(inMemoryPackage, true); var mainPart = document.MainDocumentPart.Document; var mainDocumentPart = document.MainDocumentPart; AlternativeFormatImportPart chunk = mainDocumentPart.AddAlternativeFormatImportPart (AlternativeFormatImportPartType.Xhtml, altChunkId); Stream contentStream = chunk.GetStream(FileMode.Open,FileAccess.ReadWrite); StreamWriter contentWriter = new StreamWriter(contentStream); contentWriter.Write(html); contentWriter.Flush(); { ... } mainPart.Save(); 

Je pense que cela pourrait être la façon dont vous manipulez le stream depuis AlternativeFormatImportPart. Essayez plutôt d’utiliser FeedData, comme dans mon exemple ci-dessous.

  SsortingngBuilder xhtmlBuilder = new SsortingngBuilder(); xhtmlBuilder.Append(""); xhtmlBuilder.Append(""); xhtmlBuilder.Append("Hello world!"); xhtmlBuilder.Append(""); xhtmlBuilder.Append(""); using (WordprocessingDocument doc = WordprocessingDocument.Open(inputFilePath, true)) { ssortingng altChunkId = "chunk1"; AlternativeFormatImportPart chunk = doc.MainDocumentPart.AddAlternativeFormatImportPart (AlternativeFormatImportPartType.Xhtml, altChunkId); using (MemoryStream xhtmlStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xhtmlBuilder.ToSsortingng()))) { chunk.FeedData(xhtmlStream); AltChunk altChunk = new AltChunk(); altChunk.Id = altChunkId; doc.MainDocumentPart.Document.Body.Append(altChunk); } doc.MainDocumentPart.Document.Save(); } 

Je pense que c’est parce que vous ne pouvez pas importer un AltChunk dans un document ouvert à partir d’un stream de mémoire. J’ai eu le même problème. J’ouvrais le modèle à partir d’un stream de mémoire comme ceci:

 Private Sub UpdateDoc(templatePath As Ssortingng) Using fs As FileStream = File.OpenRead(templatePath) Using ms As New MemoryStream CopyStream(fs, ms) Using doc As WordprocessingDocument = WordprocessingDocument.Open(ms, True) 'update the document doc.MainDocumentPart.Document.Save() End Using End Using End Using End Sub Private Sub CopyStream(source As Stream, target As Stream) Dim buffer() As Byte Dim bytesRead As Integer = 1 ReDim buffer(32768) While bytesRead > 0 bytesRead = 0 bytesRead = source.Read(buffer, 0, buffer.Length) target.Write(buffer, 0, bytesRead) End While End Sub 

Cela fonctionne pour les mises à jour normales des contrôles de contenu, etc., et le document est correct lorsqu’il est retransmis au client ou enregistré en tant que docx. Mais cela corrompt la documentation lors de l’insertion d’un AltChunk .

L’ouverture d’un document à partir d’un chemin de fichier physique fonctionne lors de l’insertion de AltChunk comme AltChunk :

  Using doc As WordprocessingDocument = WordprocessingDocument.Open(strTempFile, True) Dim altChunkId As Ssortingng = "AltChunkId1" Dim mainDocPart As MainDocumentPart = doc.MainDocumentPart Dim chunk As AlternativeFormatImportPart = mainDocPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.Xhtml, altChunkId) Dim strHTML As Ssortingng = "

Html Heading

This is an html document in a ssortingng literal.

" Using chunkStream As Stream = chunk.GetStream(FileMode.Create, FileAccess.Write) Using sr As StreamWriter = New StreamWriter(chunkStream) sr.Write(strHTML) End Using End Using Dim altChunk As New AltChunk altChunk.Id = altChunkId mainDocPart.Document.Body.InsertAfter(altChunk, mainDocPart.Document.Body.Elements(Of Paragraph)().Last()) mainDocPart.Document.Save() End Using

Il semble que vous ne pouvez pas importer un AltChunk dans un stream de mémoire, vous ne pouvez le faire que lorsque vous ouvrez le fichier physique en écriture. Quelqu’un peut-il nous éclairer à ce sujet?

Je sais que c’est un ancien post, mais j’ai le même problème. Lorsque vous utilisez AltChunk dans un fichier, cela fonctionne, mais pas dans MemoryStream. Ce serait formidable si quelqu’un sait quelque chose à ce sujet. Voici comment je lance le WordprocessingDocument

 var byteArrayWithFileFrom360 = ProcessFileHandler.GetFileContent(204735); var wordDocMemoryStream = new MemoryStream(); wordDocMemoryStream.Write(byteArrayWithFileFrom360, 0, byteArrayWithFileFrom360.Length); var myDoc = WordprocessingDocument.Open(wordDocMemoryStream, true);