Identificando arquivos .doc/.docx que contêm imagens

Identificando arquivos .doc/.docx que contêm imagens

Estou movendo minhas anotações para o Evernote. Para este fim, preciso converter arquivos .doc/.docx para rtf. A razão para isso é que tenho um script para importar rtf para o Evernote. No entanto, alguns dos meus arquivos .doc/.docx contêm imagens.

Existe alguma maneira de identificar quais arquivos .doc/.docx contêm imagens sem visualizá-los todos? Eu tenho milhares. Dessa forma posso simplesmente abrir os poucos que possuem imagens e copiar/colar todo o conteúdo direto no Evernote.

Devo dizer que estou usando o OS X 10.6.8.

Responder1

Onde os arquivos .doc armazenam imagens?

Os arquivos do Word docsão compactados e colocados em um formato de contêiner. Eles armazenam mídia em algum lugar neste formato de arquivo compilado, provavelmente logo após o doccabeçalho do formato. Após os dados da imagem, está o seu documento real em uma pasta compatível com zip.

layout de arquivo

Portanto, quando você tenta descompactar um docarquivo, obtém um número excessivo de bytes no início. Estas são as suas imagens (mais o cabeçalho do formato). Agora você pode tentar unzipo arquivo e verificar a quantidade excessiva 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

Por meio de testes, descobri que o cabeçalho dos documentos do Word em "texto simples" tem 6.060 bytes de tamanho (alguns são um pouco maiores). Podemos tentar explorá-lo para determinar se há uma imagem dentro de um documento. Digamos apenas 8.000 bytes - já que imagens reais certamente terão mais do que alguns KB.


E quanto aos arquivos .docx?

Com o formato Office 2007 ( docx), isso é muito mais fácil. Esses são arquivos compactados e qualquer arquivo do Word que contenha mídia incorporada de qualquer tipo (imagens, vídeo) incluirá o file.docx/word/mediadiretório. Então, só precisamos descompactar os docxarquivos e verificar se esse diretório existe.


Um script para verificar imagens

  • Crie um novo arquivo vazio, chame-o docx-images.rbe cole o seguinte conteúdo:

    #!/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
    
  • Salve-o em algum lugar, de preferência em uma pasta onde você deseja iniciar sua busca por docxarquivos, talvez sua Documentspasta.

  • Agora, abraTerminal.app, e use cd ~/Documentspara ir até lá.

  • Digite ruby docx-images.rbe ele verificará recursivamente sua Documentspasta em busca docxde docarquivos. Ele descompactará o primeiro /tmp/worde verificará se eles contêm mídia incorporada. Estes últimos são apenas descompactados /dev/null, não deixando rastros.

  • Você terminará com uma lista daqueles com mídia incorporada.


Prova

Para provar que isso funciona, criei quatro arquivos. Um com imagens, outro sem imagens – tanto como doccomo docx:

prova

Então, executando o script:

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

Claramente, o script poderia ser melhorado para verificar imagens reais nessa mediapasta, mas é improvável que exista, a menos que o arquivo realmente contenha alguma mídia. O mesmo vale para a verificação de “6060” bytes. É um hack, mas funciona para mim.

Claro, o script depende da implementação unzipno respectivo sistema, mas funciona para a versão OS X.

Responder2

Parajanelas:

  • Renomeando o .docx para .zip, abrindo o arquivo zip e extraindo as imagens (Melhor maneira!).
  • Em seguida, procure a imagem abaixo \zipfile\word\mediada imagem.

Referência

informação relacionada