惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
L
LangChain Blog
博客园_首页
Recent Announcements
Recent Announcements
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
博客园 - 叶小钗
博客园 - 【当耐特】
The Cloudflare Blog
J
Java Code Geeks
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans

博客园 - habin

利用KindEditor实现公司通讯录的维护 在winform嵌入外部应用程序 Js下载文件到本地(兼容多浏览器) 解决lhgDialog插件在IE11浏览器的BUG Devexpress ChartControl 柱状图简单例子 解决“远程会话已断开连接,因为访问被拒绝导致许可证存储的创建失败,请使用提升的权限运行远程桌面客户端”问题 MVC项目初次发布到IIS可能会遇到的问题 Android Studio下载及离线升级方法 动态调用WebService 统计某个单词出现次数 不能在 Page 回调中调用 Response.Redirect 解决方法 JQuery TextExt 控件使用 替换文本框title提示文本 通过ashx获取JSON数据的两种方式 终于解决SQL Server 2008 64位系统无法导入Access/Excel的问题 2012/08/01 Asp.net项目部署ActiveReport jQuery Mobile对话框插件 JS实现日期比较 Apache根目录运行.net网站
Devexpress RichEditControl 导入word文件后字体变为方正姚体...
habin · 2017-08-30 · via 博客园 - habin

      最近在做一个排版软件,用过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