2010-07-28 1 views
10

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

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

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

+0

Ну, я остановился на этой задаче, но снова открыл ее через 3,5 года. Я начал писать вопрос о SO, и это напомнило мне, что это уже существовало! –

+0

Возможно, это связано, возможно, это может помочь кому-то: http://social.msdn.microsoft.com/Forums/office/en-US/7a729264-8747-4fc3-a604-d2f4443f3e84/insert-rtf-file-in-word- process-document-using-office-open-xml? forum = oxmlsdk –

ответ

11

Вы можете вставлять содержимое 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, тогда вам нужно избежать символов Юникода. Для примера обратитесь к следующему stackoverflow answer.

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

+0

Я использовал 'AltChunk' перед тем, как вставлять HTML в файлы docx, и он работал как шарм. Определенно, как идти – flipchart

+0

Хм, похоже, все идет так хорошо, но я просто получаю «файл поврежден» при попытке открыть его в Word 2010 после сохранения изменений. Я практически сейчас использую этот пример. Что я должен проверять, где я должен искать? –

+0

@John: Не могли бы вы предоставить образец документа (который поврежден)? Поэтому я посмотрю на это. Я использую инструментарий для повышения производительности OpenXML для проверки таких документов. Документ RTF, который вы вставляете, заполнен (действителен)? Является ли текущее положение потока памяти нулевым?Обратите внимание, что метод FeedData не стремится к началу потока. – Hans

0

Этот парень, казалось, понял это его собственный вопрос и ответ на How can I embed any file type into Microsoft Word using OpenXml 2.0

+2

Его решение по-прежнему требует наличия Word, что является ужасной идеей для создания документов на стороне сервера и всей причиной, по которой мы создаем новый инструмент в первое место. Помимо всего прочего, на некоторых конфигурациях серверов вы не можете запускать Word через COM. –

+2

Ух, ты прав, прямо внизу. Кажется, бессмысленно предлагать все это в WordprocessingML, просто чтобы погубить его с помощью interop. –

 Смежные вопросы

  • Нет связанных вопросов^_^