1

我有几千字的文件,是我的一些同事整理的。他们不是很懂技术的人,他们只是拿了 10 兆像素的相机,直接在 word 文件中嵌入了几张照片,没有重新采样。通常图像在页面上被缩小到非常小,比如大约 3" x 2"。

我需要编写某种工具来依次遍历这些,每个~300MB,word文件并对图像进行下采样,然后保存word文件。

我们主要处理 .doc 文件,而不是 .docx。也可能有一些PowerPoint文件。

我有几个可用的选项。我可以用 C# 编写一个程序,它为用户提供了一个很好的界面,允许他们在保存时指定 DPI 和 JPEG 质量。或者,我可以使用 VBA 宏来执行此操作,但是我可能需要编写 DLL 或使用第 3 方来调整图像大小。

我已经完成了一些从 .xls 和 .xlsx 文件到 C# 的 Excel 导入,这很容易,但是我怀疑以格式看起来没有变化的方式将下采样图像写回 .doc 文件可能会很棘手。

我可以得到一些输入:是否有一些免费的库(免费用于商业用途)用于访问 .doc 文件,它们可以做我需要它们做的事情?如果我用 VBA 编写它,除了下采样问题 - 我还会面临其他障碍吗?最后,您对如何解决这个问题有其他建议吗?

4

1 回答 1

0

好的,我在大约一周内没有任何答案或评论,所以我将用我在那段时间学到的东西来回答我自己的问题。我希望这对以后的其他人有所帮助。

正如我所提到的,我们正在处理数以千计的办公室(word 和 powerpoint)文件,其中包含全分辨率数码相机图像。这些文件可以在任何地方达到几百 MB,它们最多应该是几百 KB 到几 MB。这给公司网络造成了负担,人们打开这些关键文件也很慢。

我最初所做的是使用 7-Zip 解压缩 .doc 文件。我使用隐藏的命令行界面System.Diagnostics.Process从 .doc 文件中提取“WordDocument”。

然后,我将逐字节读取 WordDocument,直到找到 JPEG SOI 标记:0xFF 0xD8,然后读取直到 EOI 标记:0xFF 0xD9。我会将 WordDocument 的那一部分作为流读入一个Image,并在那里调整它的大小。然后,我会将图像以较小的分辨率/较小的质量保存回 WordDocument 流。我可以确认图像被正确读取,并且它们被正确插入到 WordDocument 中。我们最终得到的文件比开始时要小得多。不幸的是,7-Zip 允许您从 .doc 文件中提取这些组件,但它似乎不允许您重新插入它。所以所有这些工作基本上都是白费的。我可能对此有误,但我的版本(目前最新版本)不允许我将文件添加到 .doc 包中。

接下来,我重新编写了该函数,以便它使用 MS Office 互操作库。我打开 aWord.Application和 a Word.Document,运行Document.Convert(),然后将其保存为 .docx 文件。很多时候这已经足够了,但有时我们最终会得到一个稍微小一点的文件。检查 .docx 文件的 GZip 内容后,文档的创建者似乎使用了 Microsoft Photo Editor 3,它以某种方式在 docx 中添加了大约几十 MB 的 OLE 信息。

所以这就是我要做的。我已经概述了上面我尝试过的两种方法。第一种是原始的 .doc 编辑技术,只有在您能找到将 WordDocument 重新打包到 .doc 中的方法时才会起作用——而且我还没有使用 PowerPoint 文件对其进行测试,但我认为过程类似。第二种方法的优点是提供 .docx 和 .pptx 文件,可以使用 zip 兼容的打包库打开这些文件,并且可以很容易地编辑/删除资源。不幸的是,这意味着需要在机器上安装 Office,如果您没有相对较新的 Office 版本,则该Document.Convert()方法将引发异常。

我希望对阅读本文的人有所帮助。

于 2011-04-04T23:24:31.310 回答