Devexpress RichEditControl 导入word文件后字体变为方正姚体的解决方案
最近在做一個(gè)排版軟件,用過(guò)RichEditControl 導(dǎo)入外部Word文件的時(shí)候,發(fā)現(xiàn)導(dǎo)的文件后字體會(huì)變成“方正姚體”,官方這個(gè)BUG至少在V16.1版本尚未解決,翻閱了大量資料,發(fā)現(xiàn)DevExpress控件使用之RichEditControl的使用這篇文章介紹過(guò)解決方案就是整體替換,但是這樣會(huì)把所有字體都替換為同一種字體,還有生成Word模板若干問(wèn)題總結(jié)(更新中)這篇文章介紹過(guò),僅RTF格式的文件導(dǎo)入后字體正常。但是限制用戶只能導(dǎo)入RTF格式文件也不是個(gè)很好的解決辦法。
于是我嘗試用代碼自動(dòng)轉(zhuǎn)換用戶導(dǎo)入的Word文件為RTF格式,即如果發(fā)現(xiàn)要導(dǎo)入的文件不是RTF(doc、docx、wps等),用第三方插件(Aspose.Word)自動(dòng)將非RTF格式轉(zhuǎn)換為RTF,但是這個(gè)嘗試又發(fā)現(xiàn)問(wèn)題,就是用微軟官方Office軟件另存為RTF格式后,再導(dǎo)入RichEditControl,字體正常保持原樣,但是用第三方插件(Aspose.Word)另存為RTF后,字體又變?yōu)槲④浹藕冢跏怯魫灐:髞?lái)發(fā)現(xiàn)用第三方控件導(dǎo)出的RTF大小與Office導(dǎo)出的RTF大小不一致,也就說(shuō)RTF編碼也像doc和docx一樣存在不同版本。
導(dǎo)入前文件格式↑
導(dǎo)入后文件格式↑
第三方插件轉(zhuǎn)換RTF行不通,于是嘗試用其他格式轉(zhuǎn)換,OpenDocument(.odt),ePub,Mhtml(.mht)試過(guò)幾次都不穩(wěn)定。 本來(lái)想讓程序脫離微軟Office獨(dú)立運(yùn)行, 看來(lái)只能引用微軟Office組件了。在網(wǎng)上下載了一個(gè)Microsoft.Office.Interop.Word.dll文件,是Office 2010 版本的,但我本機(jī)安裝的是Office 2007,引入程序后,很慶幸執(zhí)行轉(zhuǎn)換操作成功,導(dǎo)入RichEditControl后字體也正常,但是有些擔(dān)心將分發(fā)到不同的電腦后會(huì)不會(huì)出現(xiàn)Office引用問(wèn)題。
至此問(wèn)題曲折解決。
以下摘抄部分代碼:
/// <summary>
/// 將Doc轉(zhuǎn)換為rtf
/// </summary>
/// <param name="doc"></param>
/// <returns></returns>
private string DocTortf(string doc)
{
//創(chuàng)建一個(gè)word的實(shí)例
Word.Application newApp = new Word.Application();
// 指定源文件和目標(biāo)文件
object Source = doc;
object Target = Path.GetDirectoryName(doc) + "\" + Path.GetFileNameWithoutExtension(doc) + ".rtf";
File.Create(Target.ToString()).Dispose();
object Unknown = Type.Missing;
// 打開(kāi)要轉(zhuǎn)換的Word文件
newApp.Documents.Open(ref Source, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown);
// 指定文檔的類型
object format = Word.WdSaveFormat.wdFormatRTF;
//改變文檔類型
newApp.ActiveDocument.SaveAs(ref Target, ref format,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown);
//關(guān)閉word實(shí)例
newApp.ActiveDocument.Close(ref Unknown, ref Unknown, ref Unknown);
newApp.Quit(ref Unknown, ref Unknown, ref Unknown);
return Target.ToString();
}
View Code
/// <summary>
/// 文件導(dǎo)入之前觸發(fā)的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void rchEdit_BeforeImport(object sender, DevExpress.XtraRichEdit.BeforeImportEventArgs e)
{
_srcFileName = e.Options.SourceUri;//獲取要導(dǎo)入的文件路徑
if (_srcFileName != "") //路徑不為空(顯示導(dǎo)入文件的路徑)
{
System.IO.FileInfo fi = new FileInfo(_srcFileName);
if (fi == null)
{
_srcFileName = "";
return;
}
string strExt = fi.Extension;
if (strExt.ToLower() == ".rtf")
{
_IsImportRtf = true;
}
else
{
_IsImportRtf = false;
}
_IsImportFromOutFile = true;
}
else//路徑為空(從數(shù)據(jù)庫(kù)加載)
{
_IsImportFromOutFile = false;
}
}
View Code
/// <summary>
/// 文檔加載完成后觸發(fā)的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void rchEdit_DocumentLoaded(object sender, EventArgs e)
{
try
{
Document document = rchEdit.Document;
document.DefaultCharacterProperties.FontName = "宋體"; //設(shè)置默認(rèn)字體
document.DefaultCharacterProperties.FontSize = 12;
document.Unit = DevExpress.Office.DocumentUnit.Centimeter;//基本單位設(shè)置為厘米
var path = Application.StartupPath + "\" + ConfigurationManager.AppSettings["pageset"].ToString();
if (!System.IO.File.Exists(path)) return;
INIFileHelper.path = path;
if (_IsImportFromOutFile == true && _IsImportRtf == false)//從外部導(dǎo)入的文件,則初始化頁(yè)面字體為宋體(RichEditControl有Bug,導(dǎo)入文件后默認(rèn)是方正姚體)
{
if (!File.Exists(_srcFileName)) return;// 如果源文件不存在則忽略
//如果導(dǎo)入的是doc或docx,則轉(zhuǎn)換為rtf,并重新加載
string descDoc = DocTortf(_srcFileName);
//創(chuàng)建新的Doc文檔
rchEdit.CreateNewDocument();
rchEdit.LoadDocument(descDoc, DevExpress.XtraRichEdit.DocumentFormat.Rtf);
File.Delete(descDoc);//刪除臨時(shí)文件
}
else if (this._FileId == null && _IsImportFromOutFile == false)//如果是新創(chuàng)建的文件
{
_IsImportFromOutFile = false;
}
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message);
}
}
View Code
總結(jié)
以上是生活随笔為你收集整理的Devexpress RichEditControl 导入word文件后字体变为方正姚体的解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 密码学专题 非对称加密算法指令概述 RS
- 下一篇: Java version 32转64位