首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

施用OpenXml转换docx内容为RTF

2012-11-12 
使用OpenXml转换docx内容为RTF实际上这是个非常蛋疼的命题。它需要你有两个方面的能力:1.你实际RTF式。2.你

使用OpenXml转换docx内容为RTF

实际上这是个非常蛋疼的命题。它需要你有两个方面的能力:

1.      你实际RTF格式。

2.      你知道在OpenXml格式的文档中各种Style存在于哪个部份。

由于完整的RTF style非常多。我这里只写了一个最简单的例子,希望它能起排线的作用:

假设我有一个docx文档如下:

Hello!

This is a test text.

用Open Xml转换成RTF代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using SD = System.Drawing;using DocumentFormat.OpenXml.Packaging;using DocumentFormat.OpenXml.Wordprocessing;using com.mksword.Net.OpenXmlTools;using System.Text.RegularExpressions;namespace ConsoleApplication10{    class Class1 : WordprocessingDocumentUtil     {        private static Dictionary<char, int> map = new Dictionary<char, int>{            {'A',10},{'B',11},{'C',12},{'D',13},{'E',14},{'F',15},{'9',9},            {'8',8},{'7',7},{'6',6},{'5',5},{'4',4},{'3',3},{'2',2},{'1',1},            {'0',0}};        public void Action()        {            OpenedDocumentHandler(ConvertDoc2Rtf);        }        private bool ConvertDoc2Rtf(WordprocessingDocument WPD)        {            bool result = false;            string source1 = "{\\rtf1\\ansi";            string colortable = null;            int colorIndex = 0;            string strsource = "";            MainDocumentPart MDP = WPD.MainDocumentPart;            Document Doc = MDP.Document;            foreach (Paragraph P in Doc.Descendants<Paragraph>().ToList())            {                foreach (Run R in P.Descendants<Run>().ToList())                {                    if (R.RunProperties == null)                    {                        Text T = R.Descendants<Text>().FirstOrDefault();                        strsource += T.Text;                    }                    else                    {                        RunProperties RPs = R.RunProperties;                        Color C = RPs.Descendants<Color>().FirstOrDefault();                        Text T = R.Descendants<Text>().FirstOrDefault();                        bool flag = false;                        if (C != null)                        {                            if (colortable != null)                            {                                colortable += RTFColorTable(C);                            }                            else                            {                                colortable = "\n{\\colortbl ;";                                colortable += RTFColorTable(C);                            }                            colorIndex++;                            strsource += "\\cf" + colorIndex.ToString()+" ";                            flag = true;                        }                        Underline UL = RPs.Descendants<Underline>()                            .FirstOrDefault();                        if (UL != null)                        {                            strsource += "\\ul " + T.Text + "\\ulnone";                        }                        else                        {                            strsource += T.Text+ " ";                        }                        if (colortable != null && flag)                        {                            strsource += "\\cf0 ";                        }                    }                }                strsource += "\\par\n";            }            if (colortable != null)            {                colortable += "}\n";                source1 += colortable + strsource + "\n}";            }            else            {                source1 += strsource + "\n}";            }            SetLog(source1, OXULogType.INFO);            Clipboard.SetText(source1);            return result;        }        private string RTFColorTable(Color Color)        {            string result = null;            Regex regex = new Regex("([0-9 a-f A-F]{2})([0-9 a-f A-F]{2})"                + "([0-9 a-f A-F]{2})");            Match match = regex.Match(Color.Val);            result += "\\red" + Hex2Dec(match.Groups[1].Value);            result += "\\green" + Hex2Dec(match.Groups[2].Value);            result += "\\blue" + Hex2Dec(match.Groups[3].Value) + ";";            return result;        }        private string Hex2Dec(string Hex)        {            string result = null;             char[] buffer = Hex.ToUpper().ToCharArray();            int r = 0;            for (int i = 0; i < 2; i++)            {                r += i == 0 ? 16 * map[buffer[i]] : map[buffer[i]];            }            result = r.ToString();            return result;        }    }}
欢迎访问《许阳的红泥屋》

热点排行