• C#使用开源类库解析和生成rtf格式的内容


    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

  • 相关阅读:
    poj 1392 Ouroboros Snake
    poj 1780 Code
    poj 2513 Colored Sticks
    ZOJ 1455 Schedule Problem(差分约束系统)
    poj 3169 Layout (差分约束)
    ZOJ1260/POJ1364国王(King)
    poj 1201/zoj 1508 intervals 差分约束系统
    zoj 2770 Burn the Linked Camp (差分约束系统)
    构造函数和析构函数
    PHP面向对象——静态属性和静态方法
  • 原文地址:https://www.cnblogs.com/chinasoft/p/15936336.html
Copyright © 2020-2023  润新知