如何使用代码中的图像修改 RTF 文件
How to modify RTF file with images from the code
我有 RTF 格式的文档模板,它包含一些文本和一些图像(使用写字板创建,Win 7)。我需要更改一些文本并保存。我正在尝试这样做(Delphi XE7,Win32 平台,Windows 7 x64 SP1):
RichEdit1.Lines.LoadFromFile('1.rtf');
RichEdit1.Lines.SaveToFile('2.rtf');
所以我还没有改变任何东西,但是 2.rtf 不再包含任何图像并且比 1.rtf 小得多。其他一切 (tables/text/fonts/...) 似乎没问题。有关于如何保存所有图像(和其他对象)的想法吗?
更新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 中找不到类似的功能。
RTF 通常只是一个 ASCII 文本文件(使用二进制数据时除外,存储在 \bin 标记之后。因此您可以尝试从文件中提取图像和对象数据并将其替换为占位符。稍后, 当你想保存文件时,你可以使用 StringReplace 再次插入图像和对象数据。困难的部分是图像和其他对象的提取,因为你需要一些 RTF 解析器逻辑来检测它们的开始和结束位置。
TRichEdit
控件不会加载图像。所以,你不会有任何成功的方式。不管怎样,TRichEdit
是为了显示和编辑富文本。它不适用于后台文档处理。视觉控制在这里完全错误。
实现您的目标的最简单方法是将 RTF 文件视为 ASCII 编码的文本文件并对其进行解析。寻找商定的占位符并将其替换为所需的文本。这将要求您能够解析 RTF。您究竟需要多高级的解析器在某种程度上取决于您的雄心壮志。您可能只需要正则表达式类型处理就可以产生一些有效的东西。但是,这也可能有些脆弱。
我有 RTF 格式的文档模板,它包含一些文本和一些图像(使用写字板创建,Win 7)。我需要更改一些文本并保存。我正在尝试这样做(Delphi XE7,Win32 平台,Windows 7 x64 SP1):
RichEdit1.Lines.LoadFromFile('1.rtf');
RichEdit1.Lines.SaveToFile('2.rtf');
所以我还没有改变任何东西,但是 2.rtf 不再包含任何图像并且比 1.rtf 小得多。其他一切 (tables/text/fonts/...) 似乎没问题。有关于如何保存所有图像(和其他对象)的想法吗?
更新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 中找不到类似的功能。
RTF 通常只是一个 ASCII 文本文件(使用二进制数据时除外,存储在 \bin 标记之后。因此您可以尝试从文件中提取图像和对象数据并将其替换为占位符。稍后, 当你想保存文件时,你可以使用 StringReplace 再次插入图像和对象数据。困难的部分是图像和其他对象的提取,因为你需要一些 RTF 解析器逻辑来检测它们的开始和结束位置。
TRichEdit
控件不会加载图像。所以,你不会有任何成功的方式。不管怎样,TRichEdit
是为了显示和编辑富文本。它不适用于后台文档处理。视觉控制在这里完全错误。
实现您的目标的最简单方法是将 RTF 文件视为 ASCII 编码的文本文件并对其进行解析。寻找商定的占位符并将其替换为所需的文本。这将要求您能够解析 RTF。您究竟需要多高级的解析器在某种程度上取决于您的雄心壮志。您可能只需要正则表达式类型处理就可以产生一些有效的东西。但是,这也可能有些脆弱。