如何使用代码中的图像修改RTF文件

时间:2015-02-22 13:45:42

标签: delphi rtf delphi-xe7 trichedit

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

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

所以我还没有改变任何东西,但2.rtf不再包含任何图像,并且尺寸小于1.rtf。其他一切(表格/文字/字体/ ...)似乎没问题。任何想法如何保存所有图像(和其他对象)?

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

cxRichEdit1.Properties.AllowObjects := True;
cxRichEdit1.Lines.LoadFromFile('e:\Work\InvoiceGenerator\bin\Invoice2.rtf');
cxRichEdit1.Lines.SaveToFile('e:\Work\InvoiceGenerator\bin\Invoice3.rtf');

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

2 个答案:

答案 0 :(得分:2)

TRichEdit控件无法加载图片。所以,你不会以这种方式取得任何成功。无论如何,TRichEdit用于显示和编辑富文本。它不适用于后台文档处理。视觉控制在这里是错误的。

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

答案 1 :(得分:1)

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