Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有开源XSLT将WPF FlowDocument转换为WordML?_C#_Wpf_Xslt_Openxml_Wordml - Fatal编程技术网

C# 是否有开源XSLT将WPF FlowDocument转换为WordML?

C# 是否有开源XSLT将WPF FlowDocument转换为WordML?,c#,wpf,xslt,openxml,wordml,C#,Wpf,Xslt,Openxml,Wordml,我想使用WPF RichTextBox,它允许用户编辑和格式化文本。这种格式化的文本最终将与其他一些自定义XML数据一起工作到Word文档中 我发现了几个从WordML到FlowDocument的示例,但没有任何示例将RichTextBox FlowDocument转换为WordML 有没有开源XSLT文件可以用来将WPF FlowDocument转换为WordML,而不是重新发明轮子 我不是在寻找100%的解决方案(例如表格、图表、图纸等)。现在,我只对保留字体格式、段落、项目符号列表等感兴趣

我想使用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


快乐编码

免费软件触及了我使用过的一种方法;获取FlowDocument内容并创建rtf,然后构建一个新的Word文档并保存。但是,您可能不想接触像Microsoft.Office.Interop.Word这样的库

还有一些其他方法的例子。例如,您可能希望查看以下开源FlowDocument编辑器。它很旧,但仍然提供信息,并将FlowDocuments转换为docx。这就需要从微软的网站上查看OpenXMLSDK(没有足够的代表提供更多的链接,但谷歌会帮你做到这一点)

此外,您可能会发现作为参考很有用。它是一个Word附加组件,您可以从中获取源代码,从而将Word文档转换为FlowDocuments。这与最初的请求相反,但有可能逆转该过程

希望这能有所帮助

编辑:

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

  • 首先创建一个带有一些格式的简单word文档(作为docx)
  • 提取内容并保留除/word/document.xml文件以外的所有内容
  • 打开/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>
    
    
    测试
    测试2
    
    XSLT(仅部分用于演示目的)

    
    
  • 使用和XmlDocument和XamlWriter创建要转换的xml
  • 将转换结果保存为新的“document.xml”,并将其放入/word目录中,然后将所有内容打包为一个带有.docx扩展名的归档文件
  • 最令人头痛的是,FlowDocuments可能是RGBA,但WordML在颜色属性中使用RBG


    因此,有一种方法可以用一个xslt获取所有内容,但这也是令人头痛的。依我看,来自OpenXmlWriter应用程序的代码将是一个更干净的解决方案。或者可能是两者的结合…

    一位同事发现了这一点,尽管这是一种更为野蛮的力量。我希望有一些更优雅的东西:我在最初的问题中没有明确说明,但我试图避免使用Interop这个词。我引用了OpenXml.biz链接作为对原始问题的评论。不幸的是,这种方法比我所期望的更为残忍。我已经找到了很多Word到XAML的例子,但没有找到XAML到Word的例子。。。这就是问题所在。你引用的文章最后一行说得很好。。。“今天,据我所知,如果不编写自己的XSL转换,就无法提取基于开放式XML标记的XHTML或WPF标记片段。强迫客户为基于6000页规范的XML格式编写自己的XSL转换是残酷和不同寻常的公司惩罚。”这就是我寻找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>