rtf 简单转换html
由于自己写正则写不好!!还有很多可以修改的地方,只是现在比较忙。
没有用到它,现在发出来!让大家帮我看一看。
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
namespace RTFTOHTML
{
public class ColorAndFont
{
public ColorAndFont()
{
}
public ColorTable ct=new ColorTable ();
public FontTable ft = new FontTable();
/// <summary>
/// 预先处理字体和表格
/// </summary>
/// <param name="Source"></param>
public void GetColorAndFontStr(string Source)
{
string ColorStr;
string FontStr;
string RegStr = @"{//colortbl ([/W/w]*;)}";//颜色
Regex r ;
Match m;
r=new Regex(RegStr,RegexOptions.IgnoreCase);
ColorStr = r.Match(Source).Groups[0].Value.ToString();
ColorStr = ColorStr.Replace("{//colortbl ", "").Replace("}", "");//得到以;分界;/red255/green128/blue128;/red0/green64/blue128;
string[] str = ColorStr.Split(';');
for (int i = 0; i < str.Length-1; i++)
{
if (str[i] == "")
{
ct.add("#000000");
}
else
{
RegStr = @"//red(/d{0,3})//green(/d{0,3})//blue(/d{0,3})";
r=new Regex (RegStr,RegexOptions.IgnoreCase);
for(m=r.Match(str[i].ToString());m.Success;m=m.NextMatch())//得到颜色的三个值
{
int red=Convert.ToInt32(m.Groups[1].Value);
int green=Convert.ToInt32(m.Groups[2].Value);
int blue=Convert.ToInt32(m.Groups[3].Value);
Color rd = Color.FromArgb(red,green,blue);
ct.add(ColorTranslator.ToHtml(rd));
}
}
using System;
using System.Text;
namespace RTFTOHTML
{
public class RTFUnEncode
{
/// <summary>
/// rtf 文件中的ansi码转换成简体中文
/// </summary>
/// <param name="str">ansi字符</param>
/// <returns>简体中文</returns>
public static string RTFUnEncodeString(string str)
{
string strb = str.Replace("//'", "%");
byte[] UnUrlEncodestr = System.Web.HttpUtility.UrlDecodeToBytes(strb);
return Encoding.GetEncoding(936).GetString(UnUrlEncodestr);
}
}
}
using System;
using System.IO;
using System.Text;
namespace RTFTOHTML
{
public class RTFFileStream
{
/// <summary>
/// 返回指定文件的数据流
/// </summary>
/// <param name="path">绝对路径</param>
/// <returns>字符串</returns>
public static string FileStr(string filepath)
{
if (File.Exists(filepath))
{
StreamReader sr = new StreamReader(filepath);
string data = sr.ReadToEnd();
sr.Close();
sr.Dispose();
return data;
}
return "";
}
/// <summary>
/// 将HTML保存为html文件
/// </summary>
/// <param name="str">生成的HTML编码字符串</param>
/// <param name="filepath">要保存的文件路径包括文件</param>
public static void Savestr(string str, string filepath)
{
byte[] data = Encoding.Default.GetBytes(str);
FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.Write, FileShare.None);
fs.Write(data, 0, data.Length);
fs.Close();
fs.Dispose();
}
}
}
using System;
using System.Text.RegularExpressions;
namespace RTFTOHTML
{
public class RTH
{
public RTH()
{
}
private ColorAndFont cf = new ColorAndFont();
private string mainCSS = string.Empty;
private string col =string.Empty;
private string fon = string.Empty;
private string size = string.Empty;
private string isb = string.Empty;
private string isunline = string.Empty;
private string isi = string.Empty;
private string aglin = string.Empty;
private string LiN = string.Empty;
public void MainRtfToHtml(string source,string path)
{
Regex r;
Match m;
cf.GetColorAndFontStr(source);
if (cf.ct.Count != 0 && cf.ft.Count != 0)
{
string Regstr = @"/{(.+);/}";
source = Regex.Replace(source, Regstr, "", RegexOptions.IgnoreCase);
string RegexText = @"(?<!//par).+";
string TEXT = string.Empty;
r = new Regex(RegexText, RegexOptions.IgnoreCase | RegexOptions.Multiline);
for (m = r.Match(source); m.Success; m = m.NextMatch())
{
string temptext = m.Groups[0].Value.Replace("//r", "").Trim();
if (temptext != ""&&temptext!="}")
{
TEXT += RtfContent(temptext);
}
}
string temp = "<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.0 Transitional//EN/"><html xmlns=/"http://www.w3.org/1999/xhtml/"><head> <title></title> <style type=/"text/css/"><!--{$css}--></style></head> <body>{$cont}</body></html>";
temp = temp.Replace("{$css}", mainCSS);
temp = temp.Replace("{$cont}", TEXT);
RTFFileStream.Savestr(temp, path);
}
}
private string RtfContent(string str)
{
string cont=string.Empty;
Regex r=new Regex(@"[^//']//[A-Za-z0-9]{0,}?(?:/s)(.+)|(//'[A-Za-z0-9]*.+)",RegexOptions.IgnoreCase | RegexOptions.Multiline);
if (!r.IsMatch(str))
{
r = new Regex(@"//[A-Za-z0-9]{0,}?(?:/s)(.+)|(//'[A-Za-z0-9]*.+)", RegexOptions.IgnoreCase | RegexOptions.Multiline);
}
Match m=r.Match(str);
for(;m.Success;m=m.NextMatch())
{
string tempcont=m.Groups[1].Value+m.Groups[2].Value;
string controlStr = str.Replace(tempcont, "");
if (tempcont != "")
{
cont = RTFUnEncode.RTFUnEncodeString(tempcont);
cont=FormatRTF(cont,controlStr);
}
}
return cont;
}
private string FormatRTF(string cont, string contorlstr)
{
if (cont.IndexOf("}") != -1)
{
if (cont.Trim() == "}")
{
cont = "";
return cont;
}
}
string view = Regex.Match(contorlstr, @"^//viewkind([0-5])").Groups[1].Value;
string col_new = Regex.Match(contorlstr, @"//cf([0-" + cf.ct.Count.ToString() + "])").Groups[1].Value.Trim();
string fon_new = Regex.Match(contorlstr, @"//f([0-" + cf.ft.Count.ToString() + "])").Groups[1].Value.Trim();
string size_new = Regex.Match(contorlstr, @"//fs([10-140])").Groups[1].Value.Trim();
if(col_new!="")
col="color:" + cf.ct.GetColor(int.Parse(col_new)) + ";";
if(fon_new!="")
fon ="font-family:" + cf.ft.GetFont(int.Parse(fon_new)) + ";";
if(size_new!="")
size="font-size:" + size_new + "pt;";
if (Regex.Match(contorlstr, @"(//b)(?:///w|/s)").Groups[1].Value == "//b")
isb = "font-weight: bold;";
else
{
if (Regex.Match(contorlstr, @"(//b0)(?:///w|/s)").Groups[1].Value == "//b0")
isb = "";
}
if (Regex.Match(contorlstr, @"(//i)(?:///w|/s)").Groups[1].Value == "//i")
isi = " font-style: italic;";
else
{
if (Regex.Match(contorlstr, @"(//i0)(?:///w|/s)").Groups[1].Value == "//i0")
isi = "";
}
if (Regex.Match(contorlstr, @"(//ul)(?:///w|/s)").Groups[1].Value=="//ul")
isunline = "text-decoration: underline;";
else
{
if (Regex.Match(contorlstr, @"(//ulnone)(?:///w|/s)").Groups[1].Value == "//ulnone")
isunline = "";
}
string aglin_new = Regex.Match(contorlstr, @"(//q[c,r])(?:///w|/s|//'|)").Groups[1].Value;
switch (aglin_new)
{
case "//qc": aglin = "text-align:center;"; break;
case "//qr": aglin = "text-align:right;"; break;
default: aglin = "text-align:left;"; break;
}
string LiN_new = Regex.Match(contorlstr, @"(?://li(/d{0,}))(?:///w|/s|//'|)").Groups[1].Value;
if (LiN_new != "")
{
LiN = "margin-left:" + Convert.ToInt32(LiN_new) / 20 + ".0pt;";
}
else
LiN = "";
string cfdata = col + fon + size+isb+isi+isunline+aglin+LiN;
if (view != "")
{
mainCSS = "body {margin-left: 0px;margin-top: 0px;margin-right: 0px; margin-bottom: 0px; width:980px; text-align:center;}";
switch (view)
{
case "4": mainCSS += ".viewkind {width:70%;"+cfdata+"}"; break;
default: mainCSS+= ".viewkind {width:100%;"+cfdata+"}"; break;
}
}
cont="<p class=viewkind align=left style='"+cfdata+"'>"+cont+"</p>";
return cont;
}
}
}