我正在將筆記轉移到 Evernote。為此,我需要將 .doc/.docx 檔案轉換為 rtf。原因是我有一個腳本將rtf匯入到evernote中。但是,我的一些 .doc/.docx 檔案包含圖像。
有沒有辦法在不查看全部圖像的情況下識別哪些 .doc/.docx 檔案包含圖像?我有幾千個。這樣我就可以簡單地打開少數有圖像的內容,然後將整個內容直接複製/貼上到 Evernote 中。
應該要說我使用的是 OS X 10.6.8。
答案1
.doc 檔案在哪裡儲存影像?
Worddoc
檔案實際上被壓縮,然後放入容器格式。他們以這種編譯文件格式儲存媒體,可能就在doc
格式標頭之後。在圖像資料之後,是您的真實文檔,作為 zip 相容資料夾。
因此,當您嘗試解壓縮檔案時doc
,您會在開頭獲得過多的位元組數。這些是您的圖像(加上格式標題)。現在您可以嘗試unzip
該文件並檢查多餘的位元組數。
charon:test werner$ unzip -c images.doc > /dev/null
warning [images.doc]: 47166 extra bytes at beginning or within zipfile
charon:test werner$ unzip -c noimages.doc > /dev/null
warning [noimages2.doc]: 6060 extra bytes at beginning or within zipfile
透過測試,我發現「純文字」Word文件的標題有6060位元組大(有些更大一些)。我們可以嘗試利用它來確定文件中是否有圖像。我們就說 8000 位元組 - 因為真實影像肯定不只幾 KB。
.docx 檔案怎麼樣?
使用 Office 2007 格式 ( docx
),這要容易得多。這些是實際的壓縮文件,任何包含任何類型的嵌入媒體(圖像、影片)的 Word 文件都將包含該file.docx/word/media
目錄。因此,我們只需解docx
壓縮檔案並檢查該目錄是否存在。
檢查影像的腳本
建立一個新的空文件,將其命名為
docx-images.rb
,並貼上以下內容:#!/usr/bin/env ruby require 'open3' TEMPDIR = "/tmp/word/" # check for docx files Dir.glob("**/*.docx").each do |file| system("rm -rf '#{TEMPDIR}'") system("unzip '#{file}' -d #{TEMPDIR} > /dev/null") if File.directory?("#{TEMPDIR}/word/media/") puts file end end # check for doc files Dir.glob("**/*.doc").each do |file| stdin, stdout, stderr = Open3.popen3("unzip -c '#{file}' > /dev/null") info = stderr.readlines[0] info = info.gsub(" extra bytes at beginning or within zipfile", "").gsub(/warning\s\[.*\]:\s+/, "") if info.to_i > 8000 # assume a little more than usual header size puts file end end
將其保存在某個位置,最好是在您要從中開始搜尋
docx
文件的資料夾中,也許是您的Documents
資料夾中。現在,打開終端程式,並用來
cd ~/Documents
去那裡。輸入
ruby docx-images.rb
,它將遞歸掃描您的Documents
資料夾中的docx
檔案doc
。它將把前者解壓縮到/tmp/word
,並檢查它們是否包含嵌入媒體。後者只是解壓縮到/dev/null
,因此不會留下任何痕跡。您最終會得到一個帶有嵌入式媒體的清單。
證明
為了證明這是有效的,我創建了四個文件。一種有圖像,一種沒有圖像 - 兩者均為doc
和docx
:
然後,運行腳本:
charon:test werner$ ruby docx-images.rb
images.docx
images.doc
顯然,可以改進腳本來檢查該media
資料夾中的實際圖像,但除非檔案確實包含任何媒體,否則它不太可能存在。 “6060”位元組檢查也是如此。這是一個黑客,但它對我有用。
當然,該腳本取決於各自系統上的實現unzip
,但它適用於 OS X 版本。