Gdzie przechowywane są pliki .doc?
Słowo doc pliki są faktycznie spakowane, a następnie umieszczane w formacie kontenera. Przechowują media gdzieś w tym skompilowanym formacie pliku, prawdopodobnie zaraz po doc nagłówek formatu. Po danych obrazu jest twój prawdziwy dokument jako folder zgodny z zip.

Więc kiedy próbujesz rozpakować a doc plik, otrzymasz nadmiarową liczbę bajtów na początku. To są twoje zdjęcia (plus nagłówek formatu). Teraz możesz spróbować unzip plik i sprawdź nadmiarową ilość bajtów.
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
Dzięki testom znalazłem nagłówek „tekstowych” dokumentów Worda o rozmiarze 6060 bajtów dużych (niektóre są jednak nieco większe). Możemy spróbować go wykorzystać do określenia, czy w dokumencie znajduje się obraz. Powiedzmy po prostu 8000 bajtów - ponieważ prawdziwe obrazy z pewnością będą miały więcej niż kilka KB.
Co z plikami .docx?
Z formatem Office 2007 ( docx ), to jest dużo łatwiejsze. Są to rzeczywiste pliki spakowane, a każdy plik programu Word, który zawiera wszelkiego rodzaju osadzone multimedia (obrazy, wideo), będzie zawierał file.docx/word/media informator. Więc musimy tylko rozpakować docx pliki i sprawdź, czy ten katalog istnieje.
Skrypt do sprawdzania obrazów
Utwórz nowy pusty plik, nazwij go docx-images.rbi wklej następującą treść:
#!/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
Zapisz go gdzieś, najlepiej w folderze, w którym chcesz rozpocząć wyszukiwanie docx pliki z, może twoje Documents teczka.
Teraz otwórz się Terminal.app , I użyć cd ~/Documents iść tam.
Rodzaj ruby docx-images.rbi będzie rekurencyjnie skanować twoje Documents folder dla docx i doc pliki. Rozpakuje to pierwsze do /tmp/wordi sprawdź, czy zawierają osadzone media. Te ostatnie są po prostu rozpakowane do /dev/null, nie pozostawiając żadnych śladów.
Skończysz z listą tych z osadzonymi mediami.
Dowód
Aby udowodnić, że to działa, stworzyłem cztery pliki. Jeden z obrazami, jeden bez obrazów - oba jako doc i docx:

Następnie uruchom skrypt:
charon:test werner$ ruby docx-images.rb
images.docx
images.doc
Oczywiście skrypt może zostać ulepszony, aby sprawdzić w nim rzeczywiste obrazy media folder, ale jest mało prawdopodobne, że plik nie zawiera żadnych mediów To samo dotyczy sprawdzania bajtów „6060”. To hack, ale działa na mnie.
Oczywiście skrypt zależy od implementacji unzip w odpowiednim systemie, ale działa dla wersji OS X.