Определение файлов .doc/.docx, содержащих изображения

Определение файлов .doc/.docx, содержащих изображения

Я переношу свои заметки в evernote. Для этого мне нужно преобразовать файлы .doc/.docx в rtf. Причина в том, что у меня есть скрипт для импорта rtf в evernote. Однако некоторые из моих файлов .doc/.docx содержат изображения.

Есть ли способ определить, какие файлы .doc/.docx содержат изображения, не просматривая их все? У меня их тысячи. Таким образом я могу просто открыть несколько файлов с изображениями и скопировать/вставить весь контент прямо в evernote.

Должен сказать, что я использую OS X 10.6.8.

решение1

Где файлы .doc хранят изображения?

Файлы Word docна самом деле сжаты и затем помещены в формат контейнера. Они хранят медиа где-то в этом скомпилированном формате файла, вероятно, сразу после 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 байт — поскольку реальные изображения определенно будут иметь размер больше, чем несколько КБ.


А как насчет файлов .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.

решение2

ДляОкна:

  • Переименуйте .docx в .zip, откройте zip-файл и извлеките изображения (лучший способ!).
  • Затем найдите изображение под \zipfile\word\mediaизображением.

Ссылка

Связанный контент