https://blog.csdn.net/gc_2299/article/details/80143801
问题描述
自己项目组开发的应用程序A,其中的内容编辑功能模块支持多种特殊符号的显示与编辑,例如上下标、粗糙度、尺寸公差、形位公差等,这些内容都是采用C#的GDI+功能来绘制的,内容保存到数据库时特殊符号采用编码的方式保存。近期在开发过程中遇到以下两类问题:
1)内容编辑功能模块中需要支持从Word或者CAD等软件中复制过来的OLE图形对象的显示,但是目前该功能模块无法获取这些图形的实际尺寸,也就无法正常显示OLE对象,经常造成在内容编辑功能模块中显示OLE图形对象变形;
2)应用程序A与另外一个项目组开发的应用程序B之间要进行集成,需要将应用程序A中内容编辑功能模块填写的包含特殊符号的内容传递给应用程序B使用,由于应用程序A中的特殊符号是特殊编码的,而应用程序B中使用的开源office控件进行内容显示,并不能识别出应用程序A中传递过来的特殊符号编码,因此需要对应用程序A中内容编辑功能模块填写的包含特殊符号的内容进行处理,便于应用程序B中保存和显示。
通过咨询同事以及百度相关资料,最终发现Word和CAD等软件中的内容,大部分可以直接复制到C#中的RichTextBox控件中,而RichTextBox可以将这些内容以RTF格式字符串输出。因此有如下考虑:
1)针对问题1),当将Word和CAD等软件中的内容复制到剪切板上后,是否可以将其以RTF格式读取并解析,获取其中的图形信息(主要是获取图形的实际宽度和高度),然后按符合图形实际高宽比的区域在应用程序A中的内容编辑功能模块中显示图形,这样就解决了图形变形的问题;
2)针对问题2),将应用程序A中包含特殊符号的内容转换为RTF格式,然后传递给应用程序B,这样Office控件就可以识别 RTF格式的内容并显示。
通过百度C#和RTF相关的内容,最终找到两个比较合适的开源项目:RtfDomParser和DotNetRtfWriter,其中RtfDomParser项目主要用于解析RTF格式的字符串,然后生成一个包含RTF元素的树结构;而DotNetRtfWriter项目主要用于创建RTF格式的字符串。先对这两个项目进行简要的介绍及代码应用测试。
解决方案之RtfDomParser[1]
RtfDomParser是个开源的C#类库,主要用于解析RTF格式内容并生成rtf文档结构树,该类库使用GNU2授权。RtfDomParser的源码地址为: https://github.com/SourceCodeBackup/RtfDomParser
该类库定义了多种RTF元素类型,对应RTF格式中的不同对象。
类库中最重要的类是RTFDomDocument,该类既用于解析RTF格式文件,也可解析RTF格式字符串,并将解析后的文档结构树保存到对象内容,该类提供的方法如下:
类库中提供了一个示例项目,项目名称为RtfDomParser.WinFormsDemo,该项目用WinForm的方式展示了如何使用该类库来解析RTF格式内容。我仿照该项目写了个测试程序,主要用来解析RichTextBox控件中的rtf格式内容(C#RichTextBox控件中有一个rtf属性,可以返回rtf格式的内容),还可以解析剪切板中的rft内容,测试窗口截图如下:
解决方案之DotNetRtfWriter
DotNetRtfWriter是一个开源的.Net类库,主要用于创建RTF文档。项目的源码地址为:https://github.com/elistia/DotNetRtfWriter
该类库中将RTF内容分为四类:
RTFParagraph类型:表示一段文本,可以设置字体大小、颜色,前景色、背景色等属性;
RTFSection类型:示例和说明中没有介绍,暂时不清楚这个类型该如何使用;
RTFTable类型:表示一个表格,可以设置表格行数、列数、格式、内容等属性;
RTFImage类型:表示一个图形,可以设置图形的来源和尺寸,但实际测试时没有将图形加载起来;
类库中最重要的类是RtfDocument类,该类表示一个RTF文档,它继承自RtfBlockList类。
使用RtfDocument类创建一个对象实例后,可以通过调用AddParagraph、AddImage、AddTable等方法向文档中增加文本、图像或表格。最终通过调用Save函数将文档内容保存为一个rtf格式的文档,或者调用render函数返回rtf格式的字符串,供其它模块使用。
本文测试时使用的是该类库自带的示例,效果如下图所示:
测试的时候对于在rtf文档中加图片还有点问题,根据它提供的示例无法把图片加到RichTextBox控件中,目前还在查找原因。
测试代码的地址为:https://github.com/guochao2299/RTFDllAssemblyTest
[1]该节的开头内容及截图来自RtfDomParser自带的文档。
————————————————
版权声明:本文为CSDN博主「gc_2299」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gc_2299/article/details/80143801