如何合并多个RTF字符串并保留各自原有格式?
解决RTF字符串合并时保留原格式的问题
你的问题核心在于当前代码把RTF转成了纯文本再追加,这自然会丢失所有格式信息(比如Tahoma字体、颜色、字号这些)。要保留每个输入RTF的格式并生成独立段落,我们需要直接操作RichTextBox的带格式内容插入,而不是纯文本拼接。
问题根源分析
你当前的代码逻辑是:
richTxtBox2.Rtf = text; richTxtBox.AppendText(richTxtBox2.Text);
这里richTxtBox2.Text是把RTF解析后的纯文本,完全丢掉了格式标记,所以合并后的RTF自然没有原有的字体、样式了。
正确实现方案
我们可以利用RichTextBox的SelectedRtf属性,在控件的末尾位置插入完整的RTF内容,这样就能保留所有原格式。如果需要分隔段落,可以在插入每个RTF前(除了第一个)先插入一个段落分隔符,确保每个原内容都是独立段落。
修正后的代码示例
string input1 = @"{\rtf1\ansi\ansicpg1250\deff0\deflang1029{\fonttbl{\f0\fnil\fcharset238 Tahoma;}}\r\n{\*\generator Riched20 12.0.6556.5000;}\viewkind4\uc1\r\n\pard\f0\fs16 St\'f8edisko 222, ppokji\'9a\'9dovna Wustenrot PU 15.20022.0037626\par\r\nPlatba na fakturu, p\'f8epolsat na poji\'9a\'9dovnu a pln\'ecn\'ed na \'fa\'e8et klienta.\par\r\n\'c8\'edsklo \'fa\'e8tu bude dod\'e1no\par\r\n}\r\n\0"; string input2 = @"{\rtf1\ansi\ansicpg1250\uc1\deff0\deflang0\deflangfe0{\fonttbl{\f0\fnil Times New Roman;}{\f1\fnil Arial;}{\f2\fnil Verdana;}{\f3\fnil Webdings;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red0\green200\blue150;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red255\green128\blue64;}\r\n\pard\sb0\sa50\plain\f1\cf1\b0\i0\fs18 Při demontáži lišty LZ dveří zjištěna vada lakování.\par}"; var richTxtBox = new RichTextBox(); bool isFirstItem = true; foreach (string text in new[] { input1, input2 }) // 这里替换成你的result集合 { if (text.StartsWith("{")) { if (!isFirstItem) { // 在两个RTF之间插入换行,保证生成独立段落 richTxtBox.AppendText(Environment.NewLine); } // 定位到控件内容末尾 richTxtBox.SelectionStart = richTxtBox.TextLength; richTxtBox.SelectionLength = 0; // 插入完整RTF内容,保留原格式(清理末尾无效的\0字符) richTxtBox.SelectedRtf = text.TrimEnd('\0'); isFirstItem = false; } else { if (!isFirstItem) { richTxtBox.AppendText(Environment.NewLine); } richTxtBox.AppendText(text); isFirstItem = false; } } string mergedRtf = richTxtBox.Rtf;
关键细节说明
- 使用
SelectedRtf插入内容:这个属性会直接把RTF格式的内容插入到当前选择位置,完全保留原有的字体、字号、颜色等格式信息。 - 控制段落分隔:用
isFirstItem标记避免在第一个内容前添加多余换行,确保每个原RTF内容作为独立段落存在。 - 清理无效字符:比如
input1末尾的\0,需要去掉,否则可能导致RTF解析异常。 - 兼容纯文本内容:对于非RTF格式的文本,依然用
AppendText追加,保证逻辑完整性。
验证效果
运行修正后的代码后,合并后的RTF会保留input1的Tahoma字体,以及input2的Arial字体、字号等格式,每个原内容都是独立的段落,不会出现格式混乱的问题。
内容的提问来源于stack exchange,提问作者SonDy




