【问题标题】:How to modify RTF file with images from the code如何使用代码中的图像修改 RTF 文件
【发布时间】:2015-02-22 13:45:42
【问题描述】:

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

【问题讨论】:

  • 基本 Delphi TRichEdit 控件不支持图像和其他 OLE 对象
  • @Dalija:我不需要对象的“支持”(顺便说一句,图像不存储为 OLE 对象),我只需要“按原样”保存所有对象而不做任何更改。组件不必理解(所有)对象,但我相信它也不应该删除它们。
  • TRichEdit 没有此功能,因为在设计时它从未打算封装RTF 文件。 Rich Edit 旨在在用户可以修改的编辑控件中显示富文本 - 加载/保存 RTF 文件只是该控件的额外奖励。 TRichEdit 不支持许多其他 RTF 事物。解决方案是不要考虑使用TRichEdit,因为我看到您已经使用第三方库找到了您的解决方案。
  • 另一方面,看到这是“模板”的“发票生成器”,您为什么不使用 Delphi 中的一个庞大的报告引擎?
  • @Jeryy 客户希望能够编辑模板,最重要的是 - 在常规文字处理器 (Word/WordPad) 中,因此它应该是替换 RTF 文件的某些部分的最简单方法.

标签: delphi rtf delphi-xe7 trichedit


【解决方案1】:

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

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

【讨论】:

  • 我已经尝试过这种方式(这比 mjn 建议的方式更容易),对于数值,它可以作为简单的子字符串替换来完成,但对于更复杂的字符串/文本值,它并不那么简单。当然,我更愿意避免为这种简单的任务编写功能齐全的 RTF 解析器。可能现在我会使用解决方法(是的,它只是 UI 控件,但我没有看到更好的解决方案)。感谢您的考虑!
【解决方案2】:

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

【讨论】:

  • 对于 OP 来说,简单地替换 RTF 文件中的一些文字文本就足够了(甚至不使用TRichEdit)。
  • @AndreasRejbrand 这正是这个答案所暗示的
  • @DavidHeffernan 不完全是。他在回答中建议从 rtf-text 中保存/提取图像,然后然后读取它并使用richedit 保存,之后他可以再次插入图像源。 Andreas 建议直接在 RTF 源中更改要替换的文本,这可能会容易得多(而不是保存所有图像(可能是多个图像)并在正确的位置再次插入它们。
  • @Rik 好的,我看错了。那将是一件相当奇怪的事情。我会将占位符作为纯文本放在 RTF 中,然后简单地将 RTF 文件视为文本文件。
猜你喜欢
  • 1970-01-01
  • 2023-02-22
  • 2016-01-14
  • 2013-12-15
  • 2019-05-01
  • 1970-01-01
  • 2021-04-13
  • 2016-04-11
  • 2021-05-17
相关资源
最近更新 更多