Вставить содержимое файла RTF в файл DOCX с помощью OpenXML SDK - PullRequest
11 голосов
/ 28 июля 2010

В нашей старой системе на основе MSWord-97 мы используем COM для взаимодействия с файлом .doc и внедряем объект OLE, чтобы внедренный документ был виден в родительском (а не в виде значка).

Мы заменяем это системой, использующей OpenXML SDK, поскольку для этого требуется наличие Word на нашем сервере, который генерирует файлы .docx.однако нам все еще нужно встраивать содержимое RTF-файлов в сгенерированный DOCX ... в частности, мы заменяем закладку содержимым файла.

Я нашел несколько примеров в Интернете, но все они различаются.Когда я создаю простой пример в Word и просматриваю XML, есть много материала для позиционирования / отображения визуального представления внедренного объекта, в то время как само вложение не кажется слишком ужасным.Какой самый простой способ сделать это?

Ответы [ 2 ]

12 голосов
/ 01 декабря 2013

Вы можете встроить содержимое документа RTF в файл OpenXML DOCX, используя якорь AltChunk для внешнего содержимого.Элемент AltChunk (w:altChunk) указывает местоположение в документе OpenXML WordprocessingML для вставки внешнего содержимого, такого как документ RTF.Приведенный ниже код использует класс AltChunk в сочетании с классом AlternativeFormatImportPart для встраивания содержимого документа RTF в файл DOCX после последнего абзаца:

using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(@"your_docx_file.docx", true))
{
  string altChunkId = "AltChunkId5";

  MainDocumentPart mainDocPart = wordDocument.MainDocumentPart;
  AlternativeFormatImportPart chunk = mainDocPart.AddAlternativeFormatImportPart(
        AlternativeFormatImportPartType.Rtf, altChunkId);      

  // Read RTF document content.
  string rtfDocumentContent = File.ReadAllText("your_rtf_document.rtf", Encoding.ASCII);

  using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(rtfDocumentContent)))
  {
    chunk.FeedData(ms);
  }

  AltChunk altChunk = new AltChunk();
  altChunk.Id = altChunkId;

  // Embed AltChunk after the last paragraph.
  mainDocPart.Document.Body.InsertAfter(
    altChunk, mainDocPart.Document.Body.Elements<Paragraph>().Last());

  mainDocPart.Document.Save();
}

Если вы хотитечтобы встроить строку Unicode RTF в файл DOCX, вам необходимо экранировать символы Unicode.В качестве примера, пожалуйста, обратитесь к следующему ответу stackoverflow .

При возникновении ошибки «файл поврежден », убедитесь, что вы Dispose() или Close() 1024 *.Если вы не закроете () документ, то выпуск для w:altchunk не будет сохранен в файле Document.xml.rels .

0 голосов
/ 30 июля 2010

Этот парень, похоже, понял это с помощью своего собственного вопроса и ответа на Как я могу встроить любой тип файла в Microsoft Word, используя OpenXml 2.0

...