好的,我在大约一周内没有任何答案或评论,所以我将用我在那段时间学到的东西来回答我自己的问题。我希望这对以后的其他人有所帮助。
正如我所提到的,我们正在处理数以千计的办公室(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()
方法将引发异常。
我希望对阅读本文的人有所帮助。