-1

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

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

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

更新1。刚刚找到解决方法。我有 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 中找不到类似的功能。

4

2 回答 2

2

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

实现目标的最简单方法是将 RTF 文件视为 ASCII 编码的文本文件并对其进行解析。寻找商定的占位符并将其替换为所需的文本。这将要求您能够解析 RTF。您需要多高级的解析器在一定程度上取决于您的野心。您可以通过正则表达式类型处理来产生一些有效的东西,这似乎是合理的。但是,这也可能有些脆弱。

于 2015-02-23T09:59:27.210 回答
1

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

于 2015-02-22T16:57:58.950 回答