Подтвердить что ты не робот

Есть ли открытый источник 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)

4b9b3361

Ответ 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 был бы намного более чистым решением. Или, возможно, сочетание обоих...