TRichEdit:如何从代码中修改带有图像的RTF内容?

问题描述 投票:0回答:3

我有 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 中找不到类似的功能。

delphi rtf delphi-xe7 trichedit
3个回答
2
投票

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

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


1
投票

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


0
投票

您可以使用第 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;

我在这里解释了他们的目的。您还可以找到我从 JVCL 中分离出来的组件,即使您没有 Delphi 11,它也可以处理图像。

© www.soinside.com 2019 - 2024. All rights reserved.