12

我想使用允许用户编辑和格式化文本的 WPF RichTextBox。此格式化文本最终将与我们的一些其他自定义 XML 数据一起进入 Word 文档。

我发现了几个从 WordML 到 FlowDocument 的示例,但没有将 RichTextBox FlowDocument 到 WordML。

与其重新发明轮子,我是否可以使用开源 XSLT 文件将 WPF FlowDocument 转换为 WordML?

我不是在寻找 100% 的解决方案(例如表格、数字、图纸等)。在这一点上,我只对保留字体格式、段落、项目符号列表等感兴趣。

编辑:

如果可能,我需要避免使用 Word Interop 或昂贵的第 3 方工具(例如 Apose)。我正在寻找一种优雅的方式来将一些基本的 FlowDocument XML 格式的内容转换为 OpenXML,最好是通过 XSLT。由于我对嵌入图片等项目不感兴趣,我相信这可能是可行的,因为我发现了另一个方向的示例(即 OpenXML/WordML 到 XAML Flowdocument)

4

2 回答 2

2

我在搜索中找到了几个解决方案。最简单的方法可能是转换为支持所有必需 XSLT 内容的 .rtf 格式。这在这里解释得很好。

我在网上找到的另一个解决方案是有人转到 PDF,但首先转换为 .DOCX。你可以在这里找到他的解决方案。如果您只想要转换为 .DOCX 的部分,则需要编辑他的代码,以便 .DOCX 不会被 .PDF 替换。

根据您的项目如何运作的细节,您可能会觉得很有趣。

我希望这可以帮助你。目前没有直接的方法可以使用单个 API 执行此操作。您需要转换为某种格式,如 .XPS、.RTF 等,然后从它们使用另一个 API 转换为 WordMl。

快乐编码!

于 2013-01-27T00:59:56.227 回答
2

JABFreeware 谈到了我使用过的一种方法。获取 FlowDocument 内容并创建一个 rtf,然后构建一个新的 Word 文档并保存。但是,您可能不想接触 Microsoft.Office.Interop.Word 之类的库。

还有一些其他方法的例子。例如,您可能想在此处查看以下开源 FlowDocument 编辑器。它很旧,但仍然提供信息并将 FlowDocuments 转换为 docx。这导致从 Microsoft 的站点查看 OpenXml SDK(没有足够的代表获取更多链接,但 Google 会带您到那里)。

此外,您可能会发现作为参考很有用。它是一个 Word 插件,您可以获取源代码,以便将 Word 文档转换为 FlowDocuments。它从原始请求倒退,但有可能逆转该过程。

希望有些帮助。

编辑:

如果您真的想作弊并且您将创建的文档非常基础,那么您可以。但是,我知道这仅适用于 docx。

  1. 首先创建一个带有一些格式的简单 Word 文档(作为 docx)。
  2. 提取内容并保留除 /word/document.xml 文件之外的所有内容。
  3. 打开 /word/document.xml 文件并将其用作 XSLT 的模板。我在这里做了一个简单的:

流文档 XML

<?xml version="1.0" encoding="utf-8"?>
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Paragraph>
    <Run FontWeight="Bold" Foreground="#FF0000">Testing</Run>
  </Paragraph>
  <Paragraph>
    <Run FontWeight="Bold" Foreground="#0000FF">Testing2</Run>
  </Paragraph>
</FlowDocument>

XSLT(仅部分用于演示目的)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<xsl:template match="/x:FlowDocument">
    <?mso-application progid="Word.Document"?>
    <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
       <w:body>
          <w:sect>
        <w:p>
                <xsl:for-each select="x:Paragraph">
            <w:pPr>
                <w:jc w:val="center" />
                <w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="Segoe UI" w:hAnsi="Segoe UI" w:cs="Segoe UI" />
                    <w:sz w:val="18" />
                    <w:b w:val="on" />
                    <w:i w:val="off" />
                    <w:color>
                        <xsl:attribute name="w:val"><xsl:value-of select="x:Run/@Foreground"/></xsl:attribute>
                    </w:color>
                </w:rPr>
                <w:t><xsl:value-of select="x:Run" /></w:t>
            </w:r>
    </xsl:for-each>
        </w:p>
      </w:sect>
    </w:body>
  </w:document>
</xsl:template>
</xsl:stylesheet>
  1. 使用 XmlDocument 和 XamlWriter 创建要转换的 xml。
  2. 将转换结果另存为新的“document.xml”并将其放在 /word 目录中,并将所有内容打包为带有 .docx 扩展名的存档。

最令人头疼的是 FlowDocuments 可能是 RGBA,但 WordML 在颜色属性中使用 RBG。

所以,有一种方法可以用一个 xslt 搞定一切,但也很头疼。恕我直言,来自 OpenXmlWriter 应用程序的代码将是一个更清洁的解决方案。或者可能是两者的结合......

于 2013-01-28T15:46:10.913 回答