Identificar archivos .doc/.docx que contienen imágenes

Identificar archivos .doc/.docx que contienen imágenes

Estoy moviendo mis notas a evernote. Para ello necesito convertir archivos .doc/.docx a rtf. La razón de esto es que tengo un script para importar rtf a evernote. Sin embargo, algunos de mis archivos .doc/.docx contienen imágenes.

¿Hay alguna forma de identificar qué archivos .doc/.docx contienen imágenes sin verlos todos? Tengo miles. De esta manera puedo simplemente abrir las pocas que tienen imágenes y copiar/pegar todo el contenido directamente en Evernote.

Debería decir que estoy usando OS X 10.6.8.

Respuesta1

¿Dónde almacenan las imágenes los archivos .doc?

En realidad, los archivos de Word docse comprimen y luego se colocan en un formato contenedor. Almacenan medios en algún lugar de este formato de archivo compilado, probablemente justo después del docencabezado del formato. Después de los datos de la imagen, está su documento real como una carpeta compatible con zip.

diseño de archivo

Entonces, cuando intentas descomprimir un docarchivo, obtienes un número excesivo de bytes al principio. Estas son tus imágenes (más el encabezado de formato). Ahora puede intentar abrir unzipel archivo y verificar la cantidad sobrante de bytes.

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

A través de las pruebas, encontré que el encabezado de los documentos de Word de "texto sin formato" tiene un tamaño de 6060 bytes (aunque algunos son un poco más grandes). Podemos intentar explotarlo para determinar si hay una imagen dentro de un documento. Digamos simplemente 8000 bytes, ya que las imágenes reales definitivamente tendrán más de unos pocos KB.


¿Qué pasa con los archivos .docx?

Con el formato de Office 2007 ( docx), esto es mucho más sencillo. Estos son archivos comprimidos reales y cualquier archivo de Word que contenga medios incrustados de cualquier tipo (imágenes, videos) incluirá el file.docx/word/mediadirectorio. Entonces, solo necesitamos descomprimir los docxarchivos y verificar si ese directorio existe.


Un script para buscar imágenes.

  • Cree un nuevo archivo vacío, llámelo docx-images.rby pegue el siguiente contenido:

    #!/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
    
  • Guárdelo en algún lugar, preferiblemente en una carpeta desde donde desee comenzar la búsqueda de docxarchivos, tal vez su Documentscarpeta.

  • Ahora, abreTerminal.aplicación, y solía cd ~/Documentsir allí.

  • Escriba ruby docx-images.rby escaneará recursivamente su Documentscarpeta en busca de archivos docxy doc. Descomprimirá el primero /tmp/wordy comprobará si contienen medios incrustados. Estos últimos simplemente se descomprimen para /dev/nullno dejar rastros.

  • Terminarás con una lista de aquellos con medios integrados.


Prueba

Para demostrar que esto funciona, creé cuatro archivos. Uno con imágenes, otro sin imágenes, tanto como doccomo docx:

prueba

Luego, ejecutando el script:

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

Claramente, el script podría mejorarse para buscar imágenes reales en esa mediacarpeta, pero es poco probable que exista a menos que el archivo realmente contenga algún medio. Lo mismo ocurre con la comprobación de "6060" bytes. Es un truco, pero funciona para mí.

Por supuesto, el script depende de la implementación unzipen el sistema respectivo, pero funciona para la versión OS X.

Respuesta2

Paraventanas:

  • Cambiar el nombre del .docx a .zip, abrir el archivo zip y extraer las imágenes (¡la mejor manera!).
  • Luego busque la imagen a continuación \zipfile\word\mediapara ver la imagen.

Referencia

información relacionada