如何修改RTF文件与图像的代码



我有RTF格式的文档模板,它包含一些文本和一些图像(使用写字板创建,Win 7)。我需要更改一些文本并保存它。我正尝试这样做(Delphi XE7,Win32平台,Windows 7 x64 SP1):

  RichEdit1.Lines.LoadFromFile('1.rtf');
  RichEdit1.Lines.SaveToFile('2.rtf');

所以我还没有更改任何内容,但2.rtf不再包含任何图像,并且比1.rtf小得多。其他一切(表/text/fonts/…)似乎都可以。有什么想法可以保存所有图像(和其他对象)吗?

更新1.刚刚找到解决方法。我有DevExpress组件,如果我使用TcxRichEdit而不是TRichEdit,那么我可以保留所有对象:

cxRichEdit1.Properties.AllowObjects := True;
cxRichEdit1.Lines.LoadFromFile('e:WorkInvoiceGeneratorbinInvoice2.rtf');
cxRichEdit1.Lines.SaveToFile('e:WorkInvoiceGeneratorbinInvoice3.rtf');

但我在TRichEdit中找不到类似的功能。

TRichEdit控件不会加载图像。所以,那样你就不会有任何成功。在任何情况下,TRichEdit都用于显示和编辑富文本。它不用于后台文档处理。视觉控制在这里是完全错误的。

实现目标的最简单方法是将RTF文件视为ASCII编码的文本文件并对其进行解析。寻找商定的占位符,并用所需的文本替换它们。这将要求您能够解析RTF。确切地说,您需要多高级的解析器在一定程度上取决于您的雄心。只需正则表达式类型的处理就可以产生一些有效的东西,这是有道理的。然而,这也可能有些脆弱。

RTF通常只是一个ASCII文本文件(除非使用二进制数据,存储在\bin标记之后。因此,您可以尝试从文件中提取图像和对象数据,并将其替换为占位符。稍后,当您想要保存文件时,可以使用StringReplace再次插入图像和对象数据。困难的部分是提取图像和其他对象,因为您需要一些RTF解析器逻辑来检测它们的开始和结束位置离子。

最新更新