【问题标题】:Is There An Open Source XSLT To Convert a WPF FlowDocument to WordML?是否有用于将 WPF FlowDocument 转换为 WordML 的开源 XSLT?
【发布时间】:2013-02-02 04:05:10
【问题描述】:

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

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

与其重新发明轮子,有没有我可以用来将 WPF FlowDocument 转换为 WordML 的开源 XSLT 文件?

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

编辑:

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

【问题讨论】:

标签: c# wpf xslt openxml wordml


【解决方案1】:

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

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

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

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

编码愉快!

【讨论】:

  • 你引用的文章的最后一行说得很好......“今天,据我所知,如果不编写自己的 XSL 转换,就无法基于 Open XML 标记提取 XHTML 或 WPF 标记的片段. 强迫客户为基于 6000 页规范的 XML 格式编写自己的 XSL 转换是残酷和不寻常的企业惩罚。”这就是我正在寻找至少能够完成一些最小功能的 XSLT 的原因之一。感谢您的链接;这是一些有趣的阅读。
【解决方案2】:

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

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

此外,您可能会发现this 可用作参考。它是一个 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 应用程序的代码将是一个更清洁的解决方案。或者可能是两者的结合......

【讨论】:

  • 我没有在原始问题中明确说明,但我试图避免 Word Interop。我引用了 OpenXml.biz 链接作为对原始问题的评论。不幸的是,这种方法比我想要的更暴力。我发现了很多 Word 到 XAML 的示例,但不是 XAML 到 Word 的示例......因此是这个问题。
猜你喜欢
  • 2011-04-06
  • 2013-03-14
  • 2016-12-30
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
相关资源
最近更新 更多