Как опустить объявление xml в WordML document.xml при работе с байтами и MemoryStream?

У меня есть 2 фрагмента кода, которые работают по-разному

using (WordprocessingDocument wordDocument =
           WordprocessingDocument.Create(@"D:\Tests\WordML\ML_Example.docx", WordprocessingDocumentType.Document))
        {
            // Add a main document part. 
            MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();
            TextReader tr = new StreamReader("SimpleTextExample.xml");
            mainPart.Document = new Document(tr.ReadToEnd());
        }

Здесь он отлично работает и хорошо генерирует .docx.

Теперь второй способ сделать это с помощью байтов и MemoryStream-uri.

 MemoryStream modeleRootStream = new MemoryStream();

XmlWriterSettings writerSettings = новый XmlWriterSettings {OmitXmlDeclaration = true}; XmlWriter xmlWriter = XmlWriter.Create (modeleRootStream, writerSettings);

        initialXml.WriteTo(xmlWriter);

        xmlWriter.Flush();

        modeleRootStream.Position = 0;
       MemoryStream streamWithWord = new MemoryStream();

        using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(streamWithWord,
            WordprocessingDocumentType.Document))
        {
            // Add a main document part. 
            MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();

            string streamContent = string.Empty;

            using (StreamReader reader = new StreamReader(modeleRootStream))
            {
               streamContent = reader.ReadToEnd();
            }

            mainPart.Document = new Document(streamContent);
        }

        byte[] wordDocBytes = streamWithWord.GetBuffer();

        streamWithWord.Close();

        File.WriteAllBytes(@"D:\Tests\WordML\ML_Example1.docx", wordDocBytes);

Когда вы делаете это вторым способом, сгенерированный документ не подходит. В этом документе document.xml вы увидите объявление xml. InitialXml представляет собой элемент XElement исходного XML WordML.

<?xml version="1.0" encoding="utf-8"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">

....

И когда вы пытаетесь открыть его в Word, он выдает сообщение, что файл усечен.

Как я могу использовать байты и MemoryStreams и не иметь этой проблемы.


person Monomachus    schedule 12.05.2010    source источник


Ответы (1)


Это не правильно:

byte[] wordDocBytes = streamWithWord.GetBuffer();

Которые должны быть:

byte[] wordDocBytes = streamWithWord.ToArray();

GetBuffer возвращает лишнюю часть буфера, а не только действительные данные.

Обычно вы можете опускать заголовки xml с помощью XmlWriterSettings.

Почти наверняка нужно писать более прямо, но у меня скоро закончится сигнал (в поезде ...).

person Marc Gravell    schedule 12.05.2010