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

11
在我们旧的基于MSWord-97的系统中,我们使用COM与.doc文件交互,并嵌入OLE对象,以便将嵌入的文档显示在父文档中(而不是作为图标)。
我们正在将其替换为使用OpenXML SDK的系统,因为需要在我们的服务器上安装Word,以生成.docx文件。然而,我们仍然需要将RTF文件的内容嵌入到生成的DOCX文件中...具体地说,我们用文件的内容替换书签。
我在网上找到了一些示例,但它们都不同。当我在Word中创建一个简单的示例并查看XML时,有很多东西可以定位/显示嵌入对象的可视表示,而嵌入本身似乎并不太可怕。最简单的方法是什么?

我曾经暂停了这个任务,但在3.5年后重新打开它。我开始在SO上写一个问题,这让我想起这个已经存在的问题! - Mr. Boy
可能相关,也许可以帮助到某些人:http://social.msdn.microsoft.com/Forums/office/en-US/7a729264-8747-4fc3-a604-d2f4443f3e84/insert-rtf-file-in-word-processing-document-using-office-open-xml?forum=oxmlsdk - Mr. Boy
2个回答

13

您可以使用AltChunk锚定外部内容,将RTF文档的内容嵌入到OpenXML DOCX文件中。元素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的答案

当你遇到错误 "the file is corrupt" 时,请确保您Dispose()Close() WordprocessingDocument。如果您不关闭文档,则w:altchunk的关系不会存储在Document.xml.rels文件中。


这似乎一切顺利,但在保存更改后尝试在Word 2010中打开时,我只收到“文件损坏”的消息。我现在几乎完全使用此示例。我应该检查什么,应该看哪里? - Mr. Boy
@Hans,通过解压.docx文件并进行比较,我发现输出目录中有一个(有效的)RTF文件,并且在最后一段之后,document.xml文件有一个新元素<w:altChunk r:id="AltChunkId5" />,但是没有其他新内容。似乎缺少了什么? - Mr. Boy
@John:你能提供一个包含w:altChunk的示例文档或者你正在使用的确切代码吗?请注意,w:altChunk元素的r:id必须是唯一的。 - Hans
@Hans 我会看看是否能找到一个地方来托管它 - 但这些更改是对文档进行的确切差异...一个空的 w:altchunk 和一个新的 .rtf 文件。该 ID 是唯一的,因为没有其他块 - 但似乎没有映射在 rtf 文件和 altchunk ID 之间。你知道应该在哪里,你期望看到什么不同吗? - Mr. Boy
@John:你应该在document.xml.rels文件中找到一个与你的w:altchunk ID相关的关系。 - Hans
显示剩余6条评论

0

2
他的解决方案仍然需要您安装Word,这对于服务器端文档生成来说是一个可怕的想法,也是我们首次创建新工具的全部原因。除此之外,在某些服务器配置上,您无法通过COM运行Word。 - Mr. Boy
2
哎呀,你说得对,在底部。提供所有WordprocessingML的功能,然后再用互操作性破坏它似乎有点毫无意义。 - Todd Main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接