Identifizieren von .doc/.docx-Dateien, die Bilder enthalten

Identifizieren von .doc/.docx-Dateien, die Bilder enthalten

Ich verschiebe meine Notizen zu Evernote. Dazu muss ich .doc/.docx-Dateien in RTF konvertieren. Der Grund dafür ist, dass ich ein Skript zum Importieren von RTF in Evernote habe. Einige meiner .doc/.docx-Dateien enthalten jedoch Bilder.

Gibt es eine Möglichkeit, herauszufinden, welche .doc/.docx-Dateien Bilder enthalten, ohne sie alle anzuzeigen? Ich habe Tausende. Auf diese Weise kann ich einfach die wenigen öffnen, die Bilder enthalten, und den gesamten Inhalt direkt in Evernote kopieren/einfügen.

Sollte sagen, dass ich OS X 10.6.8 verwende.

Antwort1

Wo speichern .doc-Dateien Bilder?

Word- docDateien werden eigentlich komprimiert und dann in ein Containerformat gepackt. Sie speichern Medien irgendwo in diesem kompilierten Dateiformat, wahrscheinlich direkt nach dem docHeader des Formats. Nach den Bilddaten folgt dann Ihr eigentliches Dokument als Zip-kompatibler Ordner.

Dateilayout

Wenn Sie also versuchen, eine docDatei zu entpacken, erhalten Sie am Anfang eine überschüssige Anzahl von Bytes. Dies sind Ihre Bilder (plus der Formatheader). Sie können nun versuchen, unzipdie Datei zu öffnen und die überschüssige Anzahl von Bytes zu überprüfen.

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

Beim Testen habe ich festgestellt, dass der Header von „Klartext“-Word-Dokumenten 6060 Byte groß ist (einige sind allerdings etwas größer). Wir können versuchen, dies auszunutzen, um festzustellen, ob sich in einem Dokument ein Bild befindet. Sagen wir einfach 8000 Byte – da echte Bilder definitiv mehr als ein paar KB groß sein werden.


Was ist mit .docx-Dateien?

Mit dem Office 2007-Format ( docx) ist dies viel einfacher. Dies sind tatsächlich komprimierte Dateien, und jede Word-Datei, die eingebettete Medien jeglicher Art (Bilder, Videos) enthält, enthält das file.docx/word/mediaVerzeichnis. Wir müssen also nur die docxDateien entpacken und prüfen, ob dieses Verzeichnis vorhanden ist.


Ein Skript zum Suchen nach Bildern

  • Erstellen Sie eine neue leere Datei, nennen Sie sie docx-images.rbund fügen Sie den folgenden Inhalt ein:

    #!/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
    
  • Speichern Sie es irgendwo, vorzugsweise in einem Ordner, von dem aus Sie mit der Suche nach Dateien beginnen möchten docx, vielleicht Ihrem DocumentsOrdner.

  • Jetzt öffneTerminal.app, und verwenden Sie , cd ~/Documentsum dorthin zu gelangen.

  • Geben Sie ein ruby docx-images.rb, und Ihr DocumentsOrdner wird rekursiv nach - docxund doc-Dateien durchsucht. Erstere werden nach entpackt /tmp/wordund es wird geprüft, ob sie eingebettete Medien enthalten. Letztere werden einfach nach entpackt /dev/nullund hinterlassen somit keine Spuren.

  • Sie erhalten am Ende eine Liste mit den Geräten mit eingebetteten Medien.


Nachweisen

Um zu beweisen, dass das funktioniert, habe ich vier Dateien erstellt. Eine mit Bildern, eine ohne Bilder – jeweils als docund docx:

nachweisen

Führen Sie dann das Skript aus:

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

Natürlich könnte das Skript verbessert werden, um nach tatsächlichen Bildern in diesem mediaOrdner zu suchen, aber es ist unwahrscheinlich, dass es existiert, es sei denn, die Datei enthält wirklich Medien. Dasselbe gilt für die „6060“-Byte-Prüfung. Es ist ein Hack, aber bei mir funktioniert es.

Natürlich ist das Skript von der Implementierung unzipauf dem jeweiligen System abhängig, für die OS X-Version funktioniert es aber.

Antwort2

FürWindows:

  • Benennen Sie die DOCX-Datei in eine ZIP-Datei um, öffnen Sie die ZIP-Datei und extrahieren Sie die Bilder (der beste Weg!).
  • Suchen Sie dann unter dem Bild \zipfile\word\medianach dem Bild.

Referenz

verwandte Informationen