如何使用嵌入式图像减小RTF的大小?

时间:2009-09-10 12:39:55

标签: java performance image rtf

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

提前致谢。

6 个答案:

答案 0 :(得分:17)

这是最佳解决方案

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

摘录:

  

症状

     

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

     

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

     

原因

     

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

     

解决

     

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

     

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

答案 1 :(得分:5)

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

修改 压缩RTF是一种选择吗?使用zip / rar,你会得到你的文件大小,但你必须首先解压缩。应该有工具可以进行rtf压缩,但我从未使用它们。

答案 2 :(得分:1)

我们在工作中做了类似的项目。只有我们没有使用“插入/图片/来自文件...”功能。我们的模板有一个名为[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 \六角    您的图像为十六进制的字节数组 } \ intbl \ cell {\ pict \ jpegblip \ picwgoal4000 \ pichgoal3000 \ piccropl-50 \ piccropr-50 \ piccropt-50 \ piccropb-50 \六角    您的其他图片 } \ intbl \ cell \ row}

如果将图像转换为字节数组,则可以使用BitConverter.ToString(数组)来获取十六进制代码。只有你需要用“”代替短语“ - ”;

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

希望它有所帮助。 干杯队友

答案 3 :(得分: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/)。

答案 4 :(得分:0)

Swartbees的回答非常适合我。我首先使用G.I.M.P将图像质量降低到“0”。保存为jpeg功能。按照上面Swartbees建议的微软解决方案后,我将图片重新插入到文件中,尺寸增加可以忽略不计229k到279k(而不是29000kb)。

感谢您的建议。

答案 5 :(得分:-1)

是的,删除多余的字符。要做到这一点,您必须将它们插回到您的流中。 例如,如果你在一行中有超过20个f字符,那么你可以用流中的f [20]替换。这是一个开始。

- 运气好。