最近在做一个排版软件,用过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();
}
/// <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;
} }
/// <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 = ; 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);
} }

Devexpress RichEditControl 导入word文件后字体变为方正姚体的解决方案的更多相关文章

  1. Java读取word文件,字体,颜色

    在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性.但由于需要,要把doc文档中的内容(字体,下 ...

  2. jsp 文件使用 include指令 导入 jspf 分析,及导入jspf 文件后出现乱码问题

    1.为什么要导入jspf文件 在做网站开发中,因为有很多的页面的导航栏是相同的,所以我们要把导航栏提取出来,生成一个jspf文件. 然后在jsp页面中使用 include 指令 导入jspf文件,这样 ...

  3. Node.js中读取文件后用Json.parse方法报错解决方案

    今天,在调试一个node项目时,发现了一个很大的坑,在此分享给大家! 大家都知道,Json.parse()方法对格式要求是很严格的,格式不对极其容易报错,但是有时候格式看似是正确的也会报错. 比如这一 ...

  4. 【Unity】3.5 导入音频文件

    分类:Unity.C#.VS2015 创建日期:2016-04-05 一.简介 音频文件 (Audio File) 资源的选择原则应该以无故障地流畅运行为宗旨.下面列出了常用的音频文件. .AIFF ...

  5. Blend_技巧篇_导入PSD文件制作ToggleButton (Z)

    原文:Blend_技巧篇_导入PSD文件制作ToggleButton (Z) 系统: Win7sp1 32位 IDE: Microsoft VisualStudio 2013 Ultimate Ble ...

  6. html中对应Word中的字体和字号

    原文链接:https://blog.csdn.net/xuexizhe88/article/details/79277587:https://blog.csdn.net/qq_31603575/art ...

  7. Word文件交换的电脑打开字体、排版变化的原因和解决方法!

    方案: 有时候.我们好不easy用Word写好文档,做好排版发给别人,别人会告诉你格式怎么是乱的啊,标题.正文.页眉页脚什么的格式都变了. 想尽各种办法都没能得到解决,那么出现这样的情况的原因究竟是什 ...

  8. MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白

    MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白,症状例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVVAxOT ...

  9. IOS 使用cocoapods后无法导入头文件问题

    IOS 使用cocoapods后无法导入头文件问题 这时候如果你发现import的时候没有提示AFN e t wo r k i n g.h的文件,可以在target-Build Settings下修改 ...

随机推荐

  1. 对抗样本攻防战,清华大学TSAIL团队再获CAAD攻防赛第一

    最近,在全球安全领域的殿堂级盛会 DEF CON 2018 上,GeekPwn 拉斯维加斯站举行了 CAAD CTF 邀请赛,六支由国内外顶级 AI 学者与研究院组成的队伍共同探讨以对抗训练为攻防手段 ...

  2. Linux Performance Analysis and Tools(Linux性能分析和工具)

    首先来看一张图: 上面这张神一样的图出自国外一个Lead Performance Engineer(Brendan Gregg)的一次分享,几乎涵盖了一个系统的方方面面,任何人,如果没有完善的计算系统 ...

  3. 中国Linux开源镜像站大全

    本文来源:各大开源软件.发行版镜像页面.       请注意这是一个总结,如果您自己搭建了一个小型开源镜像,这里并没有.以下列出的是包含大量不同镜像的站点.       具体配置中,我建议您使用大企业 ...

  4. 最近开始研究php的缓存技术,来个系统自带的OPcache

    最近开始研究php的缓存技术,来个系统自带的OPcache php5.5以上版本  系统自带 PHP5.2-5.4 可通过扩展来安装 OPcache是 zend出品  比apc的优势在于  长期更新 ...

  5. centos上自动执行脚本执行php文件

    1 先编写执行PHP文件的脚本 vi php.sh #!/bin/sh /usr/bin/php /etc/1.php 2把php.sh添加到自动执行任务中 cd /etc/ vi crontab * ...

  6. 进程和创建线程的两种方法(threading.Thread)

    进程 如QQ 要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理, 网络接口的调用等,进程就是各种资源管理的集合 线程:是操作系统最小的调度单位,是一串指令的结合 进程 要操作 ...

  7. hibernate 三种状态

    JPA是Java Persistence API的简称,中文名Java持久层API. 因JPA是由Hibernate的创建者编写,因此和Hibernate基本相似一致.JPA由不同的服务解析,因此在w ...

  8. Git----分支管理之创建与合并分支02

    在版本回退里,你已经知道 ,每次提交,Git都把它们串i成一条时间线,这条时间线就是一个分支,截至到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支,HEAD严格来说不是指向提交 ...

  9. Python library not found: libpython2.7mu.so.1.0

    在使用pyinstaller生成python可执行文件的时候,包错误,提示有几个依赖的库找不到:Python library not found: libpython2.7mu.so.1.0 参考st ...

  10. locate包的安装

    linux中locate命令可以快速定位我们需要查找的文件,但是在yum中,locate的安装包名为 mlocate(yum list | grep locate可以查看),安装方法: yum -y ...