You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何合并多个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;

关键细节说明

  1. 使用SelectedRtf插入内容:这个属性会直接把RTF格式的内容插入到当前选择位置,完全保留原有的字体、字号、颜色等格式信息。
  2. 控制段落分隔:用isFirstItem标记避免在第一个内容前添加多余换行,确保每个原RTF内容作为独立段落存在。
  3. 清理无效字符:比如input1末尾的\0,需要去掉,否则可能导致RTF解析异常。
  4. 兼容纯文本内容:对于非RTF格式的文本,依然用AppendText追加,保证逻辑完整性。

验证效果

运行修正后的代码后,合并后的RTF会保留input1的Tahoma字体,以及input2的Arial字体、字号等格式,每个原内容都是独立的段落,不会出现格式混乱的问题。

内容的提问来源于stack exchange,提问作者SonDy

火山引擎 最新活动