6

MS Exchange / Outlook 邮件使用 MAPI 存储数据。一个常见的 MAPI 属性包含消息正文的富文本版本(0x1009、PR_RTF_COMPRESSED、PidTagRtfCompressed)。如果富文本字符串的结构无效,则 Outlook 2003 及更早版本无法显示任何正文内容。

例如,此 RTF 代码省略了结束“}”。

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 asdfasdf\par

正确的版本是

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 asdfasdf\par
}

是否有可用于测试 RTF 代码是否有效的 .NET 方法或库?如果没有,我愿意接受 C++ 和 Java 或 COM 库。如果没有,是否有应用程序报告 RTF 字符串中的违规行为?

理想的解决方案是报告包含不规则的行号。一个适当的解决方案将报告整个 RTF 是否有效且格式正确。

此问题与 MAPI 无关。例如,如果将上面指定的无效 RTF 字符串写入 .RTF 文件,它会在 WordPad 5.1 中正确打开,但 Word 2007 报告错误并请求我修复文件。


一个建议是我将 RTF 流式传输到富文本框中。我试过这段代码:

private void button1_Click(object sender, EventArgs e)
        {
            string aaa = richTextBox1.Rtf;
            richTextBox1.Rtf = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 asdfasdf\par}";
            richTextBox1.Refresh();
        }

无论richTextBox1.Rtf 是否以“}”结尾,富文本框都会将其显示为其内容:asdfasdf

当我省略最后一个“}”时,我正在寻找的解决方案会报告错误。

4

1 回答 1

2

为什么不将 RTF 加载到隐藏的 RTF 控件中,然后将其输出?究竟什么会设置无效的 RTF?我认为 Outlook 从来没有这样做过。

于 2012-10-01T21:56:54.690 回答