Devexpress RichEditControl 導入word文件后字體變為方正姚體的解決方案


 

      最近在做一個排版軟件,用過RichEditControl 導入外部Word文件的時候,發現導的文件后字體會變成“方正姚體”,官方這個BUG至少在V16.1版本尚未解決,翻閱了大量資料,發現 DevExpress控件使用之RichEditControl的使用 這篇文章 介紹過解決方案就是整體替換,但是這樣會把所有字體都替換為同一種字體,還有生成Word模板若干問題總結(更新中)這篇文章介紹過,僅RTF格式的文件導入后字體正常。但是限制用戶只能導入RTF格式文件也不是個很好的解決辦法。

        於是我嘗試用代碼自動轉換用戶導入的Word文件為RTF格式,即如果發現要導入的文件不是RTF(doc、docx、wps等),用第三方插件(Aspose.Word)自動將非RTF格式轉換為RTF,但是這個嘗試又發現問題,就是用微軟官方Office軟件另存為RTF格式后,再導入RichEditControl,字體正常保持原樣,但是用第三方插件(Aspose.Word)另存為RTF后,字體又變為微軟雅黑,甚是郁悶。后來發現用第三方控件導出的RTF大小與Office導出的RTF大小不一致,也就說RTF編碼也像doc和docx一樣存在不同版本。

 

導入前文件格式↑

 

導入后文件格式↑

 

        第三方插件轉換RTF行不通,於是嘗試用其他格式轉換,OpenDocument(.odt),ePub,Mhtml(.mht)試過幾次都不穩定。 本來想讓程序脫離微軟Office獨立運行, 看來只能引用微軟Office組件了。在網上下載了一個Microsoft.Office.Interop.Word.dll文件,是Office 2010 版本的,但我本機安裝的是Office 2007,引入程序后,很慶幸執行轉換操作成功,導入RichEditControl后字體也正常,但是有些擔心將分發到不同的電腦后會不會出現Office引用問題。

至此問題曲折解決。

 

以下摘抄部分代碼:

/// <summary>
        /// 將Doc轉換為rtf
        /// </summary>
        /// <param name="doc"></param>
        /// <returns></returns>
        private string DocTortf(string doc)
        {
            //創建一個word的實例
            Word.Application newApp = new Word.Application();

            // 指定源文件和目標文件
            object Source = doc;

            object Target = Path.GetDirectoryName(doc) + "\\" + Path.GetFileNameWithoutExtension(doc) + ".rtf";
            File.Create(Target.ToString()).Dispose();
            object Unknown = Type.Missing;

            // 打開要轉換的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);

            //關閉word實例
            newApp.ActiveDocument.Close(ref Unknown, ref Unknown, ref Unknown);
            newApp.Quit(ref Unknown, ref Unknown, ref Unknown);

            return Target.ToString();
        }
View Code

 

/// <summary>
        /// 文件導入之前觸發的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rchEdit_BeforeImport(object sender, DevExpress.XtraRichEdit.BeforeImportEventArgs e)
        {

            _srcFileName = e.Options.SourceUri;//獲取要導入的文件路徑
            if (_srcFileName != "")  //路徑不為空(顯示導入文件的路徑)
            {
                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//路徑為空(從數據庫加載)
            {
                _IsImportFromOutFile = false;
            }

        }
View Code

 

/// <summary>
        /// 文檔加載完成后觸發的事件
        /// </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 = "宋體";    //設置默認字體
                document.DefaultCharacterProperties.FontSize = 12;

                document.Unit = DevExpress.Office.DocumentUnit.Centimeter;//基本單位設置為厘米

                var path = Application.StartupPath + "\\" + ConfigurationManager.AppSettings["pageset"].ToString();

                if (!System.IO.File.Exists(path)) return;

                INIFileHelper.path = path;

                if (_IsImportFromOutFile == true && _IsImportRtf == false)//從外部導入的文件,則初始化頁面字體為宋體(RichEditControl有Bug,導入文件后默認是方正姚體)
                {

                    if (!File.Exists(_srcFileName)) return;//   如果源文件不存在則忽略

                    
                    //如果導入的是doc或docx,則轉換為rtf,並重新加載
                    string descDoc = DocTortf(_srcFileName);

                    //創建新的Doc文檔
                    rchEdit.CreateNewDocument();

                    rchEdit.LoadDocument(descDoc, DevExpress.XtraRichEdit.DocumentFormat.Rtf);

                    File.Delete(descDoc);//刪除臨時文件

                }
                else if (this._FileId == null && _IsImportFromOutFile == false)//如果是新創建的文件
                {
                  
                    _IsImportFromOutFile = false;
                }
            }

            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message);
            }

        }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM