2011-04-01 76 views
1

我有几千个文件,这是我的一些同事放在一起的。他们不是技术娴熟的人,他们只是拿走了他们的1000万像素摄像头,并将几张照片直接嵌入到文件文件中,而无需重新采样。通常图像在页面上缩小到相当小,例如约3“乘2”。MSWord批量重新采样图像

我需要编写一些工具顺序遍历这些,每个〜300MB,word文件和缩减图像,然后保存word文件。

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

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

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

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

回答

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互操作库。我打开Word.ApplicationWord.Document,运行Document.Convert(),然后将其另存为.docx文件。很多时候这是足够的,但是有时我们最终只得到一个稍小的文件。在检查.docx文件的GZip内容后,似乎该文档的创建者使用了Microsoft Photo Editor 3,它已经以某种方式向docx添加了大约几十MB的OLE信息。

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

我希望能帮助任何人阅读。