Есть ли открытый источник XSLT для преобразования WPF FlowDocument в WordML?
Я хочу использовать WPF RichTextBox, который позволяет пользователям редактировать и форматировать текст. Этот отформатированный текст в конечном итоге будет работать в документе Word вместе с некоторыми другими нашими пользовательскими XML-данными.
Я нашел несколько примеров, идущих из WordML в FlowDocument, но ничего не берут RichTextBox FlowDocument в WordML.
Вместо того, чтобы повторно изобретать колесо, есть ли файл XSLT с открытым исходным кодом, который я могу использовать для преобразования WPF FlowDocument в WordML?
Я не ищу 100% -ное решение (например, таблицы, рисунки, рисунки и т.д.). На данный момент я просто заинтересован в сохранении форматирования шрифтов, абзацев, списков маркеров и т.д.
Edit:
Мне нужно избегать Word Interop или дорогостоящих сторонних инструментов (например, Apose), если это возможно. Я ищу элегантный способ перевести некоторый базовый контент в формате XML FlowDocument в OpenXML, желательно через XSLT. Поскольку меня не интересуют такие элементы, как встроенные изображения, я считаю, что это возможно, учитывая тот факт, что я нашел примеры, идущие в другом направлении (то есть OpenXML/WordML в XAML Flowdocument)
Ответы
Ответ 1
В моем поиске есть несколько решений. Самый простой способ, вероятно, состоял бы в преобразовании в формат .rtf, который поддерживает все необходимые материалы XSLT. Это объясняется ОЧЕНЬ хорошо здесь.
Другое решение, которое я нашел в Интернете, - это то, что кто-то отправляется в PDF, но сначала конвертирует в .DOCX. Вы можете найти его решение здесь. Если вам просто нужна часть, которая преобразуется в .DOCX, вы хотите отредактировать свой код, чтобы .DOCX не был заменен .PDF.
В зависимости от того, как работает ваш проект, вы можете найти этот интересный.
Надеюсь, это поможет вам. В настоящее время нет прямых способов сделать это с помощью единого API. Вам нужно преобразовать в какой-то формат, например .XPS,.RTF и т.д., А затем из их использования другой API для преобразования в WordMl.
Счастливое кодирование!
Ответ 2
JABFreeware коснулся метода, который я использовал; взяв содержимое FlowDocument и создав rtf, затем создайте новый документ Word и сохраните его. Однако вы можете не хотеть касаться библиотек, таких как Microsoft.Office.Interop.Word.
Есть и другие примеры других методов. Например, вы можете посмотреть следующий редактор FlowDocument с открытым исходным кодом здесь. Он старый, но все же информативный и конвертирует FlowDocuments в docx. Это заставляет заглядывать в OpenXML SDK с сайта Microsoft (недостаточно рекламы для других ссылок, но Google доставит вас туда).
Кроме того, вы можете найти this полезным в качестве ссылки. Это надстройка Word, в которой вы можете получить исходный код, который позволит вам конвертировать документы Word в FlowDocuments. Он обратный от исходного запроса, но возможность реверсирования процесса - это возможность.
Надеюсь, что это поможет.
EDIT:
Если вы действительно хотите обмануть, и документы, которые вы будете создавать, действительно базовые, вы можете. Однако я знаю, что это работает только с docx.
- Сначала создайте простой документ с некоторым форматированием (как docx).
- Извлеките содержимое и сохраните все, кроме файла /word/document.xml.
- Откройте файл /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>
- Использовать и XmlDocument и XamlWriter для создания xml для преобразования.
- Сохраните результат преобразования как новый "document.xml" и поместите его в каталог /word и упакуйте все как архив с расширением .docx.
Самая большая головная боль заключается в том, что FlowDocuments, вероятно, будет RGBA, но WordML работает с RBG в атрибуте цвета.
Итак, есть способ получить все с помощью одного xslt, но это также головная боль. IMHO, код из приложения OpenXmlWriter был бы намного более чистым решением. Или, возможно, сочетание обоих...