【问题标题】:Embed contents of a RTF file into a DOCX file using OpenXML SDK使用 OpenXML SDK 将 RTF 文件的内容嵌入到 DOCX 文件中
【发布时间】:2010-07-28 15:12:30
【问题描述】:

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

我们用一个使用 OpenXML SDK 的系统来替换它,因为它需要在我们的服务器上安装 Word,它会生成 .docx 文件。但是我们仍然需要将 RTF 文件的内容嵌入到生成的 DOCX 中……特别是我们将书签替换为文件的内容。

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

【问题讨论】:

  • 好吧,我暂停了这项任务,但在 3.5 年后重新打开了它。我开始写一个关于 SO 的问题,它提醒我这个已经存在了!
  • 可能相关,也许它可以帮助某人:social.msdn.microsoft.com/Forums/office/en-US/…

标签: c# .net openxml openxml-sdk


【解决方案1】:

您可以将 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 answer

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

【讨论】:

  • 我之前使用AltChunk 将 HTML 插入到 docx 文件中,效果很好。绝对是要走的路
  • 嗯,这似乎进展顺利,但我只是在保存更改后尝试在 Word 2010 中打开它时得到“文件已损坏”。我现在实际上正在使用这个例子。我应该检查什么,我应该在哪里寻找?
  • @John:您能否提供一个示例文档(已损坏)?所以我会看看它。我使用 OpenXML 生产力工具包来检查这些文档。您插入的 RTF 文档是否完整(有效)?内存流的当前位置是否为零?请注意,FeedData 方法不会寻找到流的开头。
  • @Hans 通过在文件之前/之后解压缩 .docx 并进行比较,我看到输出目录有一个(有效的)RTF 文件,并且 document.xml 在之后有一个新元素 &lt;w:altChunk r:id="AltChunkId5" /&gt;最后一段,但没有别的新内容。好像少了什么?
  • @John:您能否提供一个示例文档或您用于包含 w:altChunk 的确切代码?请注意 w:altChunk 元素的 r:id 必须是唯一的。
【解决方案2】:

【讨论】:

  • 他的解决方案仍然需要您安装 Word,这对于服务器端文档生成来说是一个糟糕的想法,也是我们首先创建新工具的全部原因。除此之外,在某些服务器配置上,您无法通过 COM 运行 Word。
  • 呃,你是对的,就在底部。在 WordprocessingML 中提供所有这些似乎毫无意义,只是用互操作破坏它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
相关资源
最近更新 更多