辨識包含影像的 .doc/.docx 文件

辨識包含影像的 .doc/.docx 文件

我正在將筆記轉移到 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,因此不會留下任何痕跡。

  • 您最終會得到一個帶有嵌入式媒體的清單。


證明

為了證明這是有效的,我創建了四個文件。一種有圖像,一種沒有圖像 - 兩者均為docdocx

證明

然後,運行腳本:

charon:test werner$ ruby docx-images.rb 
images.docx
images.doc

顯然,可以改進腳本來檢查該media資料夾中的實際圖像,但除非檔案確實包含任何媒體,否則它不太可能存在。 “6060”位元組檢查也是如此。這是一個黑客,但它對我有用。

當然,該腳本取決於各自系統上的實現unzip,但它適用於 OS X 版本。

答案2

為了視窗:

  • 將 .docx 重新命名為 .zip,打開 zip 檔案並提取圖像(最好的方法!)。
  • 然後在下面的圖片中尋找圖片\zipfile\word\media

參考

相關內容