我有 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 小得多。其他一切(表格/文本/字体/...)似乎都可以。有什么想法如何保留所有图像(和其他对象)?
更新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 中找不到类似的功能。
TRichEdit
控件不会加载图像。所以,这样你不会取得任何成功。无论如何,TRichEdit
都是用于富文本的显示和编辑。它不适用于后台文档处理。视觉控制在这里根本就是错误的。
实现目标的最简单方法是将 RTF 文件视为 ASCII 编码的文本文件并解析它。查找商定的占位符并将其替换为所需的文本。这将要求您能够解析 RTF。您需要的解析器到底有多先进将在一定程度上取决于您的雄心壮志。您只需进行正则表达式类型处理就可以产生有效的东西,这似乎是合理的。然而,这也可能有些脆弱。
RTF 通常只是一个 ASCII 文本文件(使用二进制数据时除外,存储在 in 标记之后。因此,您可以尝试从文件中提取图像和对象数据并用占位符替换它。稍后,当您需要时要保存文件,您可以使用 StringReplace 再次插入图像和对象数据,困难的部分是提取图像和其他对象,因为您需要一些 RTF 解析器逻辑来检测它们的开始和结束位置。
您可以使用第 3 方库获得对图像的支持。然而,从Delphi 11开始,TRichEdit也支持图像,但有一个bug。
我已经找到了 Embarcadero 错误的解决方案。您必须使用这些特定参数按特定顺序调用这些方法:
RichEditEmba.ReadOnly:= FALSE;
RichEditEmba.Transparent:= FALSE;
RichEditEmba.PlainText:= FALSE;
RichEditEmba.Lines.LoadFromFile('Books - Delphi in all its glory.rtf');
RichEditEmba.ReadOnly:= TRUE;
我解释他们的目的在这里。