MS Word 仅显示 TextWriter 创建的 rtf 文件中的第一条记录

MS Word shows only first record from a rtf file created by TextWriter

我正在使用 TextWriter 制作基于字符串的 RTF 文件。

TextWriter tw = new StreamWriter(@"C:\test\test.rtf",false,Encoding.GetEncoding("iso-8859-1"));
tw.Write(text);

下面是我提供给 TextWriter 的字符串。我用 String.Concat<T>(IEnumerable<T>) 该集合中的值已被 Xceed.Wpf.Toolkit.RichTextBox

转换为 RTF
"{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl\

\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs24\f2\cf0 \cf0\ql{\

\f2 {\b\ltrch test.}\li0\ri0\sa0\sb0\fi0\ql\par}\r\n{\f2 {\b\ltrch (test, test, test, test)}\li0\ri0\sa0\sb0\fi0\ql\

\par}\r\n{\f2 \li0\ri0\sa0\sb0\fi0\ql\par}\r\n{\f2 {\ltrch test: test}\li0\ri0\sa0\sb0\fi0\ql\par}\r\n}\r\n}{\rtf1\

\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl\red0\

\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs24\f2\cf0 \cf0\ql{\f2 {\

\b\ltrch test.}\li0\ri0\sa0\sb0\fi0\ql\par}\r\n{\f2 {\b\ltrch (test, test, test, test)}\li0\ri0\sa0\sb0\fi0\ql\par}\r

\n{\f2 \li0\ri0\sa0\sb0\fi0\ql\par}\r\n{\f2 {\ltrch test: test}\li0\ri0\sa0\sb0\fi0\ql\par}\r\n}\r\n}"

这是 RTF 文件:

{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl

\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs24\f2\cf0 \cf0\ql{\f2 {\b\ltrch 

test.}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\b\ltrch (test, test, test, test)}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 \li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\ltrch test: test}\li0\ri0\sa0\sb0\fi0\ql\par}
}
}{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl

\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs24\f2\cf0 \cf0\ql{\f2 {\b\ltrch 

test.}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\b\ltrch (test, test, test, test)}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 \li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\ltrch test: test}\li0\ri0\sa0\sb0\fi0\ql\par}
}
}

在记事本中打开正常。 但我必须删除 2 个花括号(}{ 就在第二个 rtf1 标记之前)才能让 MS Word 显示整个文件:

{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl

\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs24\f2\cf0 \cf0\ql{\f2 {\b\ltrch 

test.}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\b\ltrch (test, test, test, test)}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 \li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\ltrch test: test}\li0\ri0\sa0\sb0\fi0\ql\par}
}
\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl

\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs24\f2\cf0 \cf0\ql{\f2 {\b\ltrch 

test.}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\b\ltrch (test, test, test, test)}\li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 \li0\ri0\sa0\sb0\fi0\ql\par}
{\f2 {\ltrch test: test}\li0\ri0\sa0\sb0\fi0\ql\par}
}
}

在我删除那些大括号之前,Word 只显示第一条记录:

test.
(test, test, test, test)

test: test

而不是整个文档:

test.
(test, test, test, test)

test: test
test.
(test, test, test, test)

test: test

我已经尝试 google 解决方案,但无济于事。 任何帮助将不胜感激。

{\rtf1 代码告诉字处理器文档已经开始;之后,它会进行括号匹配,直到找到匹配的括号,这是 }{ 对的第一个字符。从技术上讲,reader 已经完成了它应该做的事情——阅读完整的 RTF 文档——然后它停止阅读。

在我看来,您正在使用 WPF 控件构建许多完整的 RTF 文档,然后将它们连接在一起,并希望 Word 将它们全部读取,就好像它们是单个文档一样,但事实并非如此。

所以这就像通过将 <html> 个元素连接在一起生成网页;

<html>
    <head>
    </head>
    <body>
        <p>para 1</para
    </body>
</html>
<html>
    <head>
    </head>
    <body>
        <p>para 1</para
    </body>
</html>

你真正想要将 body 标签的内容连接在一起的地方,或者根本避免连接。

我猜您正在转换一批文本,正确的方法是加载包含完整内容的控件。伪代码类似于;

  var ctrl = new Xceed.Wpf.Toolkit.RichTextBox();
  foreach(var textToConvert in input)
  {
       ctrl.AppendText(textToConvert);
  }

  var doc = ctrl.Document;
  var content = new TextRange(doc.ContentStart, doc.ContentEnd);

  if (content.CanSave(DataFormats.Rtf))
  {
      using (var stream = new MemoryStream())
      {
          content.Save(stream, DataFormats.Rtf);
      }
  }