C# 将txt转换为rtf
我有一堆文本文件要转换成rtf。仅仅在代码中更改扩展名是不起作用的,底层文件是相同的。我需要在rtf格式的文本。有人知道我怎么做吗 问题是,当我加载纯文本文件时,RichTextBox不会格式化新行,因此它会将其作为一个连续的文本块加载,而不是插入新行C# 将txt转换为rtf,c#,wpf,rtf,C#,Wpf,Rtf,我有一堆文本文件要转换成rtf。仅仅在代码中更改扩展名是不起作用的,底层文件是相同的。我需要在rtf格式的文本。有人知道我怎么做吗 问题是,当我加载纯文本文件时,RichTextBox不会格式化新行,因此它会将其作为一个连续的文本块加载,而不是插入新行 唯一的解决方案是打开纯文本文件并“另存为”rtf 只需将文本添加到空RTF模板中,纯文本没有任何格式设置,因此假设RTF模板如下所示(来自wikipedia示例): 更新:我忘记了新行、大括号和反斜杠:) Antonio改进的方法(注意,我定义了
唯一的解决方案是打开纯文本文件并“另存为”rtf 只需将文本添加到空RTF模板中,纯文本没有任何格式设置,因此假设RTF模板如下所示(来自wikipedia示例): 更新:我忘记了新行、大括号和反斜杠:) Antonio改进的方法(注意,我定义了一个代码页\ansicpg1250): 编码字符(波兰语字符)方法:
Zbignew Wiadro答案的一个版本(减去波兰语字符),它试图避免多个字符串分配
public static string Convert(string s)
{
var ret = new StringBuilder((int) (71 + (s.Length * 1.1)));
ret.Append(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
foreach (var letter in s)
{
switch (letter)
{
case '\\':
case '{':
case '}':
ret.Append('\\');
break;
case '\r':
ret.Append("\\par");
break;
}
ret.Append(letter);
}
ret.Append(" }");
return ret.ToString();
}
设计简单
- 从StringBuilder开始,猜测最后一个字符串将包括标题、原始文本和10%的扩展缓冲区,这样随着字符串生成器的增长,我们就不会有多个数组副本。(如果我们的GES很低,它仍然可以工作,但代价是一个阵列拷贝(可能)
- 写下标题
- 循环遍历字符串并在一次传递中执行所有转义
- 如果您想添加回波兰语转换,那么在switch语句中只需要更多的情况,而不是更多的字符串副本
- 写出后面的大括号
- 将字符串生成器转储为字符串
公共静态字符串转换器(字符串文本)
{
//使用wiki中的默认模板
StringBuilder sb=new StringBuilder(@“{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard”);
foreach(文本中的字符)
{
如果(字符加载到richtextbox,然后另存为rtf,问题是当我加载纯文本文件时,richtextbox没有格式化新行
,您可以尝试将\r
替换为\r\n
(或\r\n
替换为\r\n
),然后再加载到richtextbox,您还需要退出大括号和反斜杠。
public static string PlainTextToRtf(string plainText)
{
string escapedPlainText = plainText.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}");
string rtf = @"{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard ";
rtf += escapedPlainText.Replace(Environment.NewLine, @" \par ");
rtf += " }";
return rtf;
}
public static string PlainTextToRtf(string plainText)
{
if (string.IsNullOrEmpty(plainText))
return "";
string escapedPlainText = plainText.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}");
escapedPlainText = EncodeCharacters(escapedPlainText);
string rtf = @"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ";
rtf += escapedPlainText.Replace(Environment.NewLine, "\\par\r\n ") + ;
rtf += " }";
return rtf;
}
private static string EncodeCharacters(string text)
{
if (string.IsNullOrEmpty(text))
return "";
return text
.Replace("ą", @"\'b9")
.Replace("ć", @"\'e6")
.Replace("ę", @"\'ea")
.Replace("ł", @"\'b3")
.Replace("ń", @"\'f1")
.Replace("ó", @"\'f3")
.Replace("ś", @"\'9c")
.Replace("ź", @"\'9f")
.Replace("ż", @"\'bf")
.Replace("Ą", @"\'a5")
.Replace("Ć", @"\'c6")
.Replace("Ę", @"\'ca")
.Replace("Ł", @"\'a3")
.Replace("Ń", @"\'d1")
.Replace("Ó", @"\'d3")
.Replace("Ś", @"\'8c")
.Replace("Ź", @"\'8f")
.Replace("Ż", @"\'af");
}
public static string Convert(string s)
{
var ret = new StringBuilder((int) (71 + (s.Length * 1.1)));
ret.Append(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
foreach (var letter in s)
{
switch (letter)
{
case '\\':
case '{':
case '}':
ret.Append('\\');
break;
case '\r':
ret.Append("\\par");
break;
}
ret.Append(letter);
}
ret.Append(" }");
return ret.ToString();
}
public static string ConvertToRtf(string text)
{
// using default template from wiki
StringBuilder sb = new StringBuilder(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
foreach (char character in text)
{
if (character <= 0x7f)
{
// escaping rtf characters
switch (character)
{
case '\\':
case '{':
case '}':
sb.Append('\\');
break;
case '\r':
sb.Append("\\par");
break;
}
sb.Append(character);
}
// converting special characters
else
{
sb.Append("\\u" + Convert.ToUInt32(character) + "?");
}
}
sb.Append("}");
return sb.ToString();
}