Я переношу свои заметки в 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
изображением.