![](/img/trans.png)
[英]Convert XAML to FlowDocument to display in RichTextBox in WPF
[英]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)
JABFreeware已经触及了我使用过的方法; 获取FlowDocument内容并创建rtf,然后构建一个新的Word文档并保存。 但是,您可能不想触及Microsoft.Office.Interop.Word等库。
其他方法也有一些例子。 例如,您可能希望在此处查看以下开源FlowDocument编辑器。 它很旧,但仍然提供信息,并将FlowDocuments转换为docx。 这将调查来自微软网站的OpenXml SDK(没有足够的代表来获取更多链接,但谷歌会让你到那里)。
此外,您可能会发现这有用作为参考。 它是一个Word加载项,您可以获取源代码,以便将Word文档转换为FlowDocuments。 它是原始请求的倒退,但是可以逆转这个过程。
希望有些帮助。
编辑:
如果你真的想作弊并且你要创建的文档非常基础,那么你可以。 但是,我知道这只适用于docx。
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>
最令人头疼的是FlowDocuments可能是RGBA,但WordML在颜色属性中使用RBG。
所以,有一种方法可以用一个xslt来获取所有东西,但它也很头疼。 恕我直言,OpenXmlWriter应用程序的代码将是一个更清洁的解决方案。 或者两者兼而有之......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.