Identyfikowanie plików .doc / .docx zawierających obrazy

7

Przenoszę moje notatki do notatek. W tym celu muszę przekonwertować pliki .doc / .docx na rtf. Powodem tego jest to, że mam skrypt do importowania RTF do Evernote. Jednak niektóre z moich plików .doc / .docx zawierają obrazy.

Czy jest jakiś sposób na określenie, które pliki .doc / .docx zawierają obrazy bez wyświetlania ich wszystkich? Mam tysiące. W ten sposób mogę po prostu otworzyć kilka, które mają obrazy i skopiować / wkleić całą zawartość bezpośrednio do evernote.

Powinien powiedzieć, że używam OS X 10.6.8.

rev
źródło

Odpowiedzi:

11

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.

file layout

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:

proof

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.

slhck
źródło
wielkie dzięki za odpowiedź. Skopiowałem kod do nowego dokumentu do jednego z moich folderów, który zawierał pliki .doc i podfoldery z plikami .doc. Następnie używam terminala, aby przejść do folderu i uruchomić kod ruby. W oknie terminala pojawiła się lista plików .doc. Czy miałbym rację, zakładając, że ta lista powinna zawierać te pliki .doc, które zawierają obrazy? Jeśli tak jest, to coś jest nie tak, ponieważ mam pełną listę plików w folderach i podfolderach. Powinienem dodać, że niektóre pliki .doc będą miały format 97.
rev
Więc masz listę każdy .doc plik zamiast tylko z obrazami? Możesz biec unzip -c some-file.doc > /dev/null dla jednego z tych plików, które zostały błędnie sklasyfikowane i powiedz mi, czy jest inny offset niż 6060 bajtów?
slhck
Simons-MacBook-Pro:7000-Acts and the Early church Simon$ unzip -c 7000-TROAS.doc > /dev/null End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. note: 7000-TROAS.doc may be a plain executable, not an archive unzip: cannot find zipfile directory in one of 7000-TROAS.doc or 7000-TROAS.doc.zip, and cannot find 7000-TROAS.doc.ZIP, period.
rev
Hm, to sprawia, że ​​wierzę, że te pliki nie zostały stworzone przy użyciu tej samej wersji Worda, którą posiadam (w tym przypadku 2011) - ale „Word 97-2003” jest jednym z formatów plików, które powinny być takie same niezależnie od rodzaj. Oczywiście mój skrypt nie powiedzie się, ponieważ zakłada nagłówek 6060 bajtów dla wszystkich plików bez obrazy. Może możesz podać przykład dokumentu, który zawiera obrazy, a który nie?
slhck
Jak mogę ci je wysłać?
rev
0

Dla Windows :

  • Zmiana nazwy .docx na .zip, otwarcie pliku zip i wyodrębnienie obrazów (Najlepszy sposób!).
  • Następnie poszukaj obrazu pod \zipfile\word\media dla obrazu.

Odniesienie

Abhijeet
źródło