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 doc
sã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 doc
cabeçalho do formato. Após os dados da imagem, está o seu documento real em uma pasta compatível com zip.
Portanto, quando você tenta descompactar um doc
arquivo, 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 unzip
o 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/media
diretório. Então, só precisamos descompactar os docx
arquivos e verificar se esse diretório existe.
Um script para verificar imagens
Crie um novo arquivo vazio, chame-o
docx-images.rb
e 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
docx
arquivos, talvez suaDocuments
pasta.Agora, abraTerminal.app, e use
cd ~/Documents
para ir até lá.Digite
ruby docx-images.rb
e ele verificará recursivamente suaDocuments
pasta em buscadocx
dedoc
arquivos. Ele descompactará o primeiro/tmp/word
e 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 doc
como docx
:
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 media
pasta, 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 unzip
no 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\media
da imagem.