繁体   English   中英

是否有一个开源XSLT将WPF FlowDocument转换为WordML?

[英]Is There An Open Source XSLT To Convert a WPF FlowDocument to WordML?

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

我发现了几个从WordML到FlowDocument的例子,但没有将RichTextBox FlowDocument转换为WordML的例子。

而不是重新发明轮子,是否有一个开源XSLT文件,我可以用来将WPF FlowDocument转换为WordML?

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

编辑:

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

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

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

根据项目工作原理的细节,您可能会发现很有趣。

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

快乐的编码!

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

其他方法也有一些例子。 例如,您可能希望在此处查看以下开源FlowDocument编辑器。 它很旧,但仍然提供信息,并将FlowDocuments转换为docx。 这将调查来自微软网站的OpenXml SDK(没有足够的代表来获取更多链接,但谷歌会让你到那里)。

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

希望有些帮助。

编辑:

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

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

FlowDocument 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应用程序的代码将是一个更清洁的解决方案。 或者两者兼而有之......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM