使用OpenXML SDK将RTF文件的内容嵌入到DOCX文件中

时间:2010-07-28 15:12:31

标签: c# .net openxml openxml-sdk

在我们旧的基于MSWord-97的系统中,我们使用COM与.doc文件进行交互,并嵌入一个OLE对象,因此嵌入的文档在父文件中可见(而不是图标)。

我们正在使用OpenXML SDK替换它,因为它需要在我们的服务器上安装Word,这会生成.docx文件。但是我们仍然需要将RTF文件的内容嵌入到生成的DOCX中...具体来说,我们用文件内容替换书签。

我在网上找到了一些例子但它们都有所不同。当我在Word中创建一个简单的示例并查看XML时,有一个很多的东西来定位/显示嵌入对象的可视化表示,而嵌入本身似乎并不太可怕。最简单的方法是什么?

2 个答案:

答案 0 :(得分:12)

您可以将RTF文档的内容嵌入到OpenXML DOCX文件中 通过将AltChunk锚用于外部内容。 AltChunkw: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 answer

当您遇到错误“文件已损坏”时,请确保Dispose()Close() WordprocessingDocument。如果您没有关闭()文档,那么w:altchunk的关联不会存储在 Document.xml.rels 文件中。

答案 1 :(得分:0)

这个家伙似乎在How can I embed any file type into Microsoft Word using OpenXml 2.0

用自己的问答来解决这个问题