Вставить содержимое RTF файла в файл DOCX с помощью OpenXML SDK

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

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

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

Ответ 1

Вы можете вставлять содержимое документа RTF в файл OpenXML DOCX используя якорь AltChunk для внешнего содержимого. Элемент AltChunk (w:altChunk) указывает место в вашем документе OpenPlayer 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. Для примера обратитесь к следующему fooobar.com/questions/204752/....

Когда вы сталкиваетесь с ошибкой "файл поврежден", убедитесь, что вы Dispose() или Close() WordprocessingDocument. Если вы не закрываете() документ, то освобождение для w:altChunk не сохраняется в файле Document.xml.rels.