2009-09-10 211 views
13

我们有一些代码可以从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使用?

在此先感谢。

+2

不是我有答​​案,但它几乎肯定是因为它被嵌入为一个未压缩的位图,而不是像JPEG这样的压缩表示。 – 2009-09-10 13:05:43

回答

5

RTF文件中的图像被存储为未压缩的WMF。在Mac上,它会是macpict。保持文件大小的最佳方法是将图像链接到文档,而不是在文档中插入副本。折衷是你必须将文件保存在一起。

编辑 正在压缩RTF的选项?使用zip/rar,你会得到你的文件大小,但首先显然你必须解压缩。应该有可以做rtf压缩的工具,但我从来没有使用过它们。

+0

谢谢。压缩不会帮助 - 我仍然需要解压缩来处理文件。这不是文件存储的大小,这是我的问题 - 这是处理RTF的时间。 我不明白关于链接 - 我可能缺乏Word技能......是否有可能让Word超链接到一个URL并在该文档中显示该URL的内容?我可以通过网址轻松制作图片。只要图像出现在读者的文档中,读者不需要做任何事情就可以获得图像,那么我会很高兴(即我不希望我的用户必须点击链接) – 2009-09-10 14:24:55

+0

添加一个超级链接很容易,无论是从单词本身还是VBA,但很抱歉,我不知道如何让图像在rtf文档中可见,但没有WMF的副本。例如,如果您有非白色背景,屏幕截图往往比它们需要的大得多。你可能会考虑编辑你的图像并保存为bmp的。 bmp格式会让你知道wmf会有多大。作为16位图像,您失去了多少颜色信息? – DaveParillo 2009-09-10 14:48:22

+0

抱歉 - 我的意思是16张彩色图片。只是保存了我的显示器的转储 - 原本是一个24位3.5M图像。保存为16色和641K。该图像确实带来了一些破坏,但它仍然是“可用的” – DaveParillo 2009-09-10 14:57:56

15

这里是最好的解决办法

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

摘录:

症状

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

例如,包含JPEG 图形并保存为Word 2000文档的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字符串值添加到微软Windows注册表 。

+0

链接页面是关于Word如何保存图像的两个副本(原始文件和未压缩版本)并给出注册表更改,以告诉它只保存原始文件。有趣的 – codeulike 2012-08-06 14:26:13

+0

我认为这比标记为答案的答案更好。 – bfhd 2013-11-11 00:10:06

+0

我不认为有人知道如何完成写字板的等价物?我尝试将'ExportPictureWithMetafile = 0'字符串值添加到'HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Applets \ Wordpad \ Options',但它没有明显的效果。 – ulatekh 2016-06-05 20:29:01

-1

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

- 最好的运气。

1

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

所以,你可能会在你的模板中放置一个标签[照片]。然后你用RTF代码替换标签。您可以在网上找到这些代码的一些很好的参考。例如。 here 。现在

,我的代码看起来是这样的:

\面值{\ RTF1 \ ANSI \ deff0 {\ trowd \ cellx8810 {标题} \ intbl \ QC \细胞\排} { \ 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 \ hex 您的其他图像} \ intbl \细胞\排}

,如果你让你的图像转换为字节数组,你可以使用BitConverter.ToString(阵列),以获得您的十六进制代码。只有你需要用“”替换破折号“ - ”;

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

希望它有帮助。 干杯队友

0

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

感谢您的建议家伙。

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/)取代原来的形象。