• 解决Devexpress的RichEditControl控件保存为docx文件后在word里打开字体显示不正确的问题


    问题复现

    用Richeditcontrol编辑如下内容并保存为.docx文件:

    image

    用word或wps打开的效果:

    image

    寻找原因

    我用word编辑个一样内容的文件,将这两个文件的扩展名修改为zip,解压后经过对比,发现document.xml文件这里不同:

    image

    我用bing搜索了这个关键字,搜索到了相关文档,奈何和谐社会。

    解决办法

    增加一个“保存“按钮,保存为docx文件后,把其中的document.xml文件修改之。代码如下:

    using DevExpress.XtraRichEdit;
    using Ionic.Zip;
    using System;
    using System.IO;
    using System.Linq;
    using System.Windows.Forms;
    using System.Xml;
    
    namespace RicheditcontrolFontDemo
    {
        public partial class FormMain : Form
        {
            public FormMain()
            {
                InitializeComponent();
            }
    
            private void barButtonItemSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
            {
                SaveFileDialog sfd = new SaveFileDialog
                {
                    Filter = "doc|*.docx"
                };
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    this.richEditControl.SaveDocument(sfd.FileName, DocumentFormat.OpenXml);
                    MondifyFonts(sfd.FileName);
                }
            }
    
            private void MondifyFonts(string path)
            {
                using (ZipFile zip = new ZipFile(path)) // DotNetZip
                {
                    var entry = zip.First(e => e.FileName == "word/document.xml");
    
                    string tempPath = DateTime.Now.ToString("yyyyMMddHHmmssfff");
                    entry.Extract(tempPath);
                    AddEastAsiaFont($"{tempPath}//word/document.xml");
                    zip.RemoveEntry(entry);
                    zip.AddFile($"{tempPath}//word/document.xml", "word");
                    zip.Save();
    
                    Directory.Delete(tempPath, true);
                }
            }
    
            private void AddEastAsiaFont(string file)
            {
                XmlDocument doc = new XmlDocument();
                XmlNamespaceManager xmlm = new XmlNamespaceManager(doc.NameTable);
                xmlm.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
                doc.Load(file);
                var nodes = doc.SelectNodes("//w:rFonts", xmlm);
    
                foreach (XmlNode node in nodes)
                {
                    if (!AnyEastAsiaAttribute(node))
                    {
                        string fontName = GetFontName(node);
                        if (fontName != null)
                        {
                            XmlAttribute atr = doc.CreateAttribute("w", "eastAsia", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
                            atr.Value = fontName;
                            node.Attributes.Append(atr);
                        }
                    }
                }
    
                doc.Save(file);
            }
    
            private string GetFontName(XmlNode node)
            {
                foreach (XmlAttribute item in node.Attributes)
                {
                    if (item.Name == "w:ascii" || item.Name == "w:hAnsi")
                    {
                        return item.Value;
                    }
                }
                return null;
            }
    
            private bool AnyEastAsiaAttribute(XmlNode node)
            {
                foreach (XmlAttribute item in node.Attributes)
                {
                    if (item.Name == "w:eastAsia")
                    {
                        return true;
                    }
                }
    
                return false;
            }
        }
    }
    
  • 相关阅读:
    下载并安装chrome插件的方法
    QString转化为char *的方式
    a socket demo
    TCP/IP相关知识总结(马士兵教育)视频对应图片
    C++中的按位或的用意
    dll路径加载顺序
    【第二周】【作业七】四人小组项目
    【第二周】【作业六】结对项目,四则运算++
    【第二周】【作业八】个人项目词频统计++
    【第二周】【作业三】效能测试
  • 原文地址:https://www.cnblogs.com/zzy0471/p/devexpressricheditcontrolfont.html
Copyright © 2020-2023  润新知