2009年4月5日

如何快速取出內嵌於 Microsoft Word 檔的大量圖片

上個週末老爸問我一個問題:要怎樣把 word 裡面的圖片抓下來?
 
我想這是很簡單的問題嘛,所以我就叫他在 word 裡面點選那張圖, 然後用右鍵選單的「複製」或者按「ctrl+v」來複製圖片,再貼進小畫家另存新檔。

然後我就繼續回頭做自己的事,過了幾分鐘老爸又丟了一個新的需求:我這個 word 檔裡面圖片很多耶,這樣每張圖片都要重複一次這個動作,很麻煩耶,而且我不想每張圖片都要自己重新命名啦!

……

說實話從來沒遇到過這麼實際的需求,於是我開始思考要怎樣很方便的一次取出內嵌在 word 檔的所有圖片,而且這方法必須是對一般正常人是很簡單的,我總不能叫老爸打開 VBE 寫一段 VBA recursive 的把所有圖檔取出來,然後 call FileSystem API 去存檔吧?!

這時候我想起來去年有一次研討會講如何客製化 Office 2007 的 Ribbon,好像可以用來解決這個問題!

2009 年 5 月的 Microsoft TechNet Magazine 有一篇「A Guide to Customizing the Office 2007 Ribbon」,很適合拿來當做 reference,對 dev 來說可以當做 Office 2007 的檔案格式的入門文章。對於要做 Office Automation 的人來說也很實用,如果要深入底層追問題的話。

關鍵在於 Office 2007 的檔案格式:Office Open XML(MSDNWiki),這是一個 zip 格式,可以想像成一份 Office 2007 Document 就跟一份 HTML Document 一樣,是由文字、圖片、影片等等的資料兜出來的,這些資料都是各自獨立的檔案,最後透過 Office 把這些檔案合併為 .docx/.xslx/.pptx 等格式的單一檔案。Office 2007 Document 也是用 Markup Language 來描述的,並不是 binary 編碼的格式。

(所以在 Office System 裡面應當也有類似 Web Browser 的 Layout Engine 之類的東西)

那麼到底要如何一次取出 word 檔內的所有圖片呢?請按照以下操作步驟:
  1. 若是由 Word 2003 建立的 .doc 檔,請先用 Word 2007 打開。(若是 .docx 格式請直接跳到步驟 3)
  2. 將 .doc 檔案另存為 .docx 格式。(這時可能會跳出一些警告訊息說格式可能會跑掉,請直接忽略它,圖片並不會因此被扭曲變形)
  3. 將附檔名從 .docx 改為 .zip。
  4. 解壓縮這個 zip 檔,word 檔中所有的圖片會位於 word\media 資料夾中。
就是這麼簡單,雖然這種需求可以說十年才遇到一次,但是要是不知道這種接近 hack 的技巧,處理起來還真是很頭大呢!(我猜可能網路上可以找到現成的小工具來做這件事,但是我懶惰沒有去找 XD 如果這個小工具還要安裝的話,感覺也不太保險…)

PS. A Guide to Customizing the Office 2007 Ribbon 中有提到:
After you've edited the contents of the package, you need to change the file extension back from .zip to its original extension. But you don't have to keep changing the extension to .zip each time you want to edit the underlying package. Instead, you can use a utility that will recognize your Office Open XML Format document as a ZIP package without ever changing the extension in the first place. There are at least a few of these. One open source option that I like is 7-zip. After you install it, just right-click your Office Open XML Format document, point to 7-zip, and then click Open Archive. You can even edit XML document parts directly in the package, and the archive utility will prompt you to update the package after you save your changes.


我只能說 7-zip 真是太優秀啦!又免費阿!有裝 7-zip 的話就不用把副檔名改成 zip 了,直接就可以把 .docx/.xslx/.pptx 內的檔案解壓縮出來到你指定的資料夾囉!

另外,A Guide to Customizing the Office 2007 Ribbon 裡面的 xml sample code 是有問題的,不能用「<Ribbon></Ribbon>」,要全部用小寫:「<ribbon></ribbon>」

3 則留言:

坎尼 提到...

打開 word 文件 -> 另存新檔 -> 選 html

會多個 xxx.html + xxx.html.files 的資料夾
裡面就是所有的圖片了

這樣有沒有比較簡單?

Unknown 提到...

That's great! 想了一下以後我覺得,對 word 2003 以及更舊的版本來說,砍尼的方法的確是比較方便,而且在本機就可以做了,不需要把 office 升級或者另外找一台有 office 2007 的機器來轉檔。不過在本機上已經有裝 office 2007 的狀態下,搭配 7-zip 的話可以直接在 context menu(右鍵選單)中執行解壓縮,連 word 文件(.docx)都不用打開,感覺更方便!

Unknown 提到...

昨天重灌狂人也針對這個需求寫了一篇文章(縣令存 jpeg 檔):http://feedproxy.google.com/~r/briian/~3/yisYEOAbhws/。砍泥的作法他在更早之前也寫過:http://briian.com/?p=1120

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D