12

ユーザーがテキストを編集および書式設定できるようにする WPF RichTextBox を使用したいと考えています。この書式設定されたテキストは、最終的に、他のカスタム XML データと共に Word 文書に取り込まれます。

WordML から FlowDocument に移行する例をいくつか見つけましたが、RichTextBox FlowDocument を WordML に移行する例はありません。

車輪を再発明するのではなく、WPF FlowDocument を WordML に変換するために使用できるオープン ソースの XSLT ファイルはありますか?

100% の解決策 (表、図、図など) を探しているわけではありません。現時点では、フォントの書式設定、段落、箇条書きなどを保持することに関心があります。

編集:

可能であれば、Word Interop や高価なサードパーティ ツール (Apose など) を避ける必要があります。できれば XSLT を使用して、いくつかの基本的な FlowDocument XML 形式のコンテンツを OpenXML に変換するエレガントな方法を探しています。埋め込み画像などのアイテムには興味がないので、別の方向 (つまり、OpenXML/WordML から XAML Flowdocument) への例を見つけたという事実を考えると、おそらく実行可能だと思います。

4

2 に答える 2

2

JABFreewareは、私が使用した方法に触れました。FlowDocumentコンテンツを取得してrtfを作成し、新しいWordドキュメントを作成して保存します。ただし、Microsoft.Office.Interop.Wordなどのライブラリには触れたくない場合があります。

他の方法の例もいくつかあります。たとえば、次のオープンソースのFlowDocumentエディターをここで確認できます。それは古いですが、それでも有益であり、FlowDocumentsをdocxに変換します。これにより、MicrosoftのサイトからOpenXml SDKを調べることができます(リンクを増やすには十分な担当者ではありませんが、Googleがアクセスします)。

また、これは参考として役立つかもしれません。これは、WordドキュメントをFlowDocumentsに変換できるソースコードを取得できるWordアドオンです。元のリクエストから逆になっていますが、プロセスを逆にする可能性があります。

これのいくつかが役立つことを願っています。

編集:

あなたが本当にごまかしたいと思っていて、あなたが作成する文書が本当に基本的であるなら、あなたはそうすることができます。ただし、これはdocxでのみ機能することを知っています。

  1. 最初にいくつかのフォーマットを使用して(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はcolor属性でRBGと連携します。

したがって、1つのxsltですべてを取得する方法がありますが、それは頭痛の種でもあります。私見ですが、OpenXmlWriterアプリケーションのコードははるかにクリーンなソリューションになります。または、おそらく両方の組み合わせ...

于 2013-01-28T15:46:10.913 に答える
2

検索で見つけた解決策がいくつかあります。最も簡単な方法は、必要なすべての XSLT をサポートする .rtf 形式に変換することでしょう。これはここで非常によく説明されています。

私がオンラインで見つけた別の解決策は、誰かが PDF にアクセスする場所ですが、最初に .DOCX に変換します。彼の解決策はここにあります。.DOCX に変換される部分だけが必要な場合は、.DOCX が .PDF に置き換えられないようにコードを編集する必要があります。

プロジェクトがどのように機能するかの詳細によっては、これが興味深いものになる場合があります。

これがお役に立てば幸いです。現在、単一の API でこれを行う直接的な方法はありません。.XPS、.RTF などの形式に変換してから、別の API を使用して WordMl に変換する必要があります。

ハッピーコーディング!

于 2013-01-27T00:59:56.227 に答える