15

我们有一些代码可以从 RTF 模板生成 RTF 文档。它基本上是在 RTF 文件中进行字符串搜索和特殊标签的替换。这可以通过网页访问。

通常,此处理时间非常快。

但是,我们需要在模板中嵌入图像。我们一直使用 Word 的“插入/图片/来自文件...”功能将这些嵌入为 JPEG 图像。但我们发现生成的 RTF 文件大小很大程度上取决于图像。

例如,我插入了一个 20k JPEG 徽标(基本上是带有一些文字的纯色背景)。RTF 文件的大小从大约 390k(没有图像)增加到 510k(有图像)。

然后我们插入一个包含屏幕截图的JPEG,即图像包含文本、多种颜色等。JPEG 大约为150k。使用此图像,RTF 文件的大小从 390k 增加到 3.5MB。

因此,Word 用于将图像存储到 RTF 中的编码不会线性执行。我猜这取决于JPEG图像中的内容。

我需要尽量减少 RTF 模板的大小,以尽量减少文件处理时间。

  • 有人对如何使用嵌入图像最小化 RTF 文件的大小有任何想法吗?
  • 有什么方法可以控制 Word 使用的编码吗?我在任何地方都看不到任何选项。
  • 有谁知道 Word/RTF 使用什么类型的二进制编码?

提前致谢。

4

6 回答 6

17

这里是最好的解决方案

http://support.microsoft.com/kb/224663

摘抄:

症状

当您将包含 EMF、PNG、GIF 或 JPEG 图形的 Microsoft Word 文档保存为不同的文件格式(例如,Word 6.0/95 ( .doc) 或富文本格式 ( .rtf))时,文件大小为该文件可能会急剧增加。

例如,包含保存为 Word 2000 文档的 JPEG 图形的 Microsoft Word 2000 文档的文件大小可能为 45,568 字节 (44.5KB)。但是,当您将此文件另存为 Word 6.0/95 ( .doc) 或 RTF 格式 ( .rtf) 时,文件大小可能会增长到 1,289,728 字节 (1.22MB)。

原因

此功能是 Microsoft Word 中设计的。如果将 EMF、PNG、GIF 或 JPEG 图形插入到 Word 文档中,则在保存文档时,将在文档中保存图形的两个副本。图形以适用的 EMF、PNG、GIF 或 JPEG 格式保存,并且还转换为 WMF(Windows 图元文件)格式。

解析度

警告如果您错误地使用注册表编辑器,您可能会导致严重的问题,可能需要您重新安装操作系统。Microsoft 不能保证您可以解决因错误使用注册表编辑器而导致的问题。使用注册表编辑器需要您自担风险。

若要防止 Word 在文档中保存图形的两个副本并减小文档的文件大小,请将 ExportPictureWithMetafile=0 字符串值添加到 Microsoft Windows 注册表。

于 2010-01-18T18:12:56.257 回答
5

RTF 文件中的图像存储为未压缩的 WMF。在 mac 上,它会是 macpict。减小文件大小的最佳选择是将图像链接到文档,而不是在文档中插入副本。权衡是您必须将文件保存在一起。

编辑 压缩 RTF 是一种选择吗?使用 zip/rar,您将恢复文件大小,但显然首先必须解压缩。应该有可以进行 rtf 压缩的工具,但我从未使用过它们。

于 2009-09-10T14:08:53.557 回答
1

我们在工作中完成了一个类似的项目。只有我们没有使用“插入/图片/来自文件...”功能。我们的模板有一个名为 [photos] 的标签,我想你自己的也有。当我们处理文档时,我们将标签替换为显示图像所需的 RTF 代码。我们将它们放在一个表格中,每行显示两个图像,并在顶部显示一个标题行。

因此,您可以在模板中放置标签 [照片]。然后用 RTF 代码替换标签。您可以在网络上找到对这些代码的一些很好的参考。例如。在这里

现在,我的代码看起来像这样:

\par {\rtf1\ansi\deff0{\trowd\cellx8810 {标题}\intbl\qc\cell\row}{\trowd\cellx4405\cellx8810{\pict\jpegblip\picwgoal4000\pichgoal3000\piccropl-50\piccropr-50 \piccropt-50\piccropb-50\hex 您的图像作为十六进制字节数组}\intbl\cell{\pict\jpegblip\picwgoal4000\pichgoal3000\piccropl-50\piccropr-50\piccropt-50\piccropb-50\ hex 你的另一张图片}\intbl\cell\row}

如果您将图像放入字节数组,您可以使用 BitConverter.ToString(array) 来获取您的十六进制代码。只有您需要将破折号“-”替换为“”;

我们的文件将占用不到“普通”RTF 空间的 1/10。如果我们用 Notepad++ 之类的编辑器打开文档的代码,我们可以看到 RTF 代码,但是如果我们打开文档并将其保存为 RTF(更改其名称),它将从 1.5Mb 变为 50Mb!我猜 DaveParillo 的回答证明了这一点:我只为每张图片写一次。

希望能帮助到你。队友的欢呼声

于 2012-03-13T16:40:15.700 回答
1

最初,请记住每个字节使用 2 个字符(两个字节)存储,这意味着增量至少是原始图片的两倍大小。

您需要的其他事情是 Word 和 Word Pad 插入相同图像的不同(风格或格式)以及其他字段(RTF 可以在没有它们的情况下显示)。

以下是一些用于在 RTF 中插入图像的脚本(https://joseluisbz.wordpress.com/2011/06/22/script-de-clases-rtf-para-jsp-y-php/),以及一个使用示例( https://joseluisbz.wordpress.com/2011/07/16/subiendo-imagenes-png-y-jpg-y-archivos-a-mysql-con-php-y-jsp-y-mostrarlos-en-rtf -usando-clases/ )

现在,也许您需要将原始图像替换为另一个图像(http://joseluisbz.wordpress.com/2013/07/26/exploring-a-wmf-file-0x000900/)。

于 2013-08-16T03:19:34.363 回答
0

Swartbees 的答案对我来说非常有效。我首先使用 GIMP Save as jpeg 功能将图像质量降低到“0”。在按照上面 Swartbees 建议的微软解决方案之后,我将图片重新插入到文件中,大小增加可以忽略不计,从 229k 到 279k(而不是 29000kb)。

谢谢你们的建议。

于 2013-01-16T05:12:08.370 回答
-1

是的,通过删除多余的字符。为此,您必须将它们重新插入您的流中。例如,如果一行中有超过 20 个 f 字符,则可以在流中替换为 f[20]。这是一个开始。

- 祝你好运。

于 2010-12-26T04:34:21.207 回答