2011-04-01 81 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()方法會拋出異常。

我希望能幫助任何人閱讀。