将 RTF 字符串合并为一个

Merge RTF strings into one

我正在尝试将多个 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[=10=]";
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();
var richTxtBox2 = new RichTextBox();
RichTextBox ricTxtArray = new RichTextBox(); ;
//richTxtBox.Sel
foreach (string text in result)
{ 
    if (text.StartsWith("{")) {
        if (!string.IsNullOrWhiteSpace(richTxtBox.Text)) { 
            richTxtBox.AppendText(Environment.NewLine); 
        }
        richTxtBox2.Rtf = text;

        richTxtBox.AppendText(richTxtBox2.Text);
    }
    else {
        if (!string.IsNullOrWhiteSpace(richTxtBox.Text)) { 
            richTxtBox.AppendText(Environment.NewLine); 
        }
        richTxtBox.AppendText(text); 
    }           
}

return richTxtBox.Rtf;

目前我的输出是这样的:

"{\rtf1\ansi\ansicpg1250\deff0\nouicompat\deflang1029{\fonttbl{\f0\fnil\fcharset238 Microsoft Sans Serif;}{\f1\fnil\fcharset0 Microsoft Sans Serif;}}\r\n{\*\generator Riched20 10.0.17763}\viewkind4\uc1 \r\n\pard\f0\fs17 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\f1\lang1033\'ed na \'fa\f0\'e8et klienta.\par\r\n\'c8\f1\'edsklo \'fa\f0\'e8tu bude dod\f1\'e1no\par\r\n\f0\lang1029 P\'f8i demont\f1\lang1033\'e1\f0\'9ei li\'9aty LZ dve\'f8\f1\'ed zji\f0\'9at\'ecna vada lakov\f1\'e1n\'ed.\f0\lang1029\par\r\n}\r\n"

如您所见,我在输入 1 中将字体设置为 Tahoma,但在输出中完全没有。

我的想法是创建单独的段落,每个段落都有自己的格式,但该怎么做?

您不能使用 AppendText 方法添加 Rtf 格式的字符串。由于 AppendRtf 方法不存在,我们必须通过设置 SelectionStart, SelectionLength and SelectedRtf.

来模仿它

这里是实现您需要的完整代码:

string MergeRtf(params string[] input)
{
    var richTextBox1 = new RichTextBox();   
    if (input!=null && input.Length>0)
    {    
        richTextBox1.Rtf = input[0]; // first input

        for(int i=1; i<input.Length; i++) 
        {
            richTextBox1.AppendText("\r\n"); // add a paragraph break

            // set the Selection to the end of the Control
            richTextBox1.SelectionStart = richTextBox1.TextLength;
            // Nothing is selected
            richTextBox1.SelectionLength = 0;
            // AppenRtf
            richTextBox1.SelectedRtf = input[i]; // any subsequent input
        }
    }
    return richTextBox1.Rtf;
}

您可以使用此测试装置从 LinqPad 对其进行测试:

void Main()
{
    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[=11=]";
    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 total = MergeRtf(input1,input2);

    total.Dump("Rtf");
}

这将是您的输出:

{\rtf1\ansi\ansicpg1250\deff0\deflang1029{\fonttbl{\f0\fnil\fcharset238 Tahoma;}{\f1\fnil\fcharset0 Arial;}{\f2\fnil Arial;}} {\colortbl ;\red0\green0\blue0;} \viewkind4\uc1\pard\f0\fs16 St\'f8edisko 222, ppokji\'9a\'9dovna Wustenrot PU 15.20022.0037626\par Platba na fakturu, p\'f8epolsat na poji\'9a\'9dovnu a pln\'ecn\'ed na \'fa\'e8et klienta.\par \'c8\'edsklo \'fa\'e8tu bude dod\'e1no\par \pard\sa50\cf1\lang0\f1\fs18 Pri demont\'e1\'9ei li\'9aty LZ dver\'ed zji\'9atena vada lakov\'e1n\'ed.\f2\par \pard\cf0\lang1029\f0\fs16\par }

注意 fonttbl 在最终输出中如何只包含 Tahoma 和 Arial。 input2 中存在的额外字体不会保留,因为只为在 input2 变量中找到的 Rtf 中的文本选择了 Arial 字体。