【问题标题】:How to reduce size of RTF with embedded images?如何使用嵌入图像减小 RTF 的大小?
【发布时间】:2018-10-24 03:25:09
【问题描述】:

我们有一些代码可以从 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 使用什么类型的二进制编码?

提前致谢。

【问题讨论】:

  • 不是我有答​​案,但几乎可以肯定,因为它被嵌入为未压缩的位图,而不是像 JPEG 这样的压缩表示。

标签: java performance image rtf


【解决方案1】:

这是最好的解决方案

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

摘录:

症状

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

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

原因

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

分辨率

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

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

【讨论】:

  • 链接页面是关于 Word 如何保存图像的两个副本(原始文件和未压缩版本)并提供注册表更改,告诉它只保存原始文件。有趣
  • 我认为这比标记为答案的答案更好。
  • 我想没有人知道如何完成写字板的等效操作吗?我尝试将ExportPictureWithMetafile=0 字符串值添加到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Wordpad\Options,但没有明显效果。
  • 写字板现在似乎在 Windows 10 中为我压缩图像。对于阅读此内容的任何人,请尝试在写字板中打开文件并保存,然后再编辑注册表。它可能会为您压缩文件。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。压缩无济于事-我仍然需要解压缩才能处理文件。我的问题不是文件存储大小——而是处理 RTF 所花费的时间。我不了解链接 - 我可能缺乏 Word 技能......是否可以让 Word 超链接到 URL 并在文档中显示该 URL 的内容?我可以通过 URL 轻松地使我的图像可用。只要图像出现在文档中给读者并且读者不需要做任何事情来获取图像,那么我会很高兴(即我不希望我的用户必须点击链接)
  • 从 word 本身或 VBA 中添加超链接很容易,但抱歉我不知道如何让图像在 rtf 文档中可见,但里面没有 WMF 的副本。例如,如果您有非白色背景,屏幕截图往往会比所需的大得多。您可以考虑编辑图像并将它们保存为 bmp。 bmp 格式将使您了解 wmf 的大小。保存为 16 位图像会丢失多少颜色信息?
  • 对不起 - 我的意思是 16 色图像。刚刚保存了我显示器的转储 - 最初是 24 位 3.5M 图像。保存为 16color,它是 641K。图像确实受到了一些损坏,但它仍然“可用”
【解决方案3】:

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

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

现在,我的代码如下所示:

\par {\rtf1\ansi\deff0{\trowd\cellx8810 {title}\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\十六进制 你的另一张图片 }\intbl\cell\row}

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

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

希望对您有所帮助。 干杯队友

【讨论】:

    【解决方案4】:

    一开始,记住每个字节是用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/) 替换原始图像。

    【讨论】:

      【解决方案5】:

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

      谢谢你们的建议。

      【讨论】:

        【解决方案6】:

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

        -祝你好运。

        【讨论】:

          猜你喜欢
          • 2012-08-09
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 2012-11-08
          • 2013-12-15
          • 2017-02-06
          相关资源
          最近更新 更多