web-dev-qa-db-ja.com

画像を含む.doc / .docxファイルの識別

ノートをevernoteに移動します。このために、.doc /.docxファイルをrtfに変換する必要があります。これは、rtfをevernoteにインポートするスクリプトがあるためです。ただし、一部の.doc /.docxファイルには画像が含まれています。

すべてを表示せずに、どの.doc/.docxファイルに画像が含まれているかを特定する方法はありますか?私は何千人もいます。このようにして、画像のあるいくつかを開いて、コンテンツ全体をコピーしてEvernoteに直接貼り付けることができます。

私はOSX10.6.8を使用していると言うべきです。

7
rev

.docファイルはどこに画像を保存しますか?

Word docファイルは実際に圧縮されてから、コンテナ形式になります。メディアは、このコンパイル済みファイル形式のどこかに、おそらくdoc形式のヘッダーの直後に保存されます。画像データの後に、実際のドキュメントがZip互換フォルダとしてあります。

file layout

したがって、docファイルを解凍しようとすると、最初に過剰なバイト数が発生します。これらはあなたの画像(およびフォーマットヘッダー)です。これで、ファイルをunzipして、超過バイト数を確認することができます。

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

テストの結果、「プレーンテキスト」のWord文書のヘッダーが6060バイト大きいことがわかりました(ただし、少し大きいものもあります)。これを利用して、ドキュメント内に画像があるかどうかを判断できます。実際の画像には間違いなく数KB以上あるため、8000バイトとしましょう。


.docxファイルはどうですか?

Office 2007形式(docx)を使用すると、これははるかに簡単です。これらは実際のzipファイルであり、あらゆる種類の埋め込みメディア(画像、ビデオ)を含むWordファイルには、file.docx/Word/mediaディレクトリが含まれます。したがって、docxファイルを解凍し、そのディレクトリが存在するかどうかを確認する必要があります。


画像をチェックするスクリプト

  • 新しい空のファイルを作成し、それをdocx-images.rbと呼び、次のコンテンツを貼り付けます。

    #!/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
    
  • どこか、できればdocxファイルの検索を開始するフォルダー、おそらくDocumentsフォルダーに保存します。

  • ここで、Terminal.appを開き、cd ~/Documentsを使用してそこに移動します。

  • Ruby docx-images.rbと入力すると、Documentsフォルダーでdocxファイルとdocファイルが再帰的にスキャンされます。前者を/tmp/Wordに解凍し、埋め込みメディアが含まれているかどうかを確認します。後者は/dev/nullに解凍されるだけなので、痕跡は残りません。

  • メディアが埋め込まれているもののリストが表示されます。


証明

これが機能することを証明するために、4つのファイルを作成しました。 1つは画像あり、もう1つは画像なし– docdocxの両方:

proof

次に、スクリプトを実行します。

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

明らかに、そのmediaフォルダー内の実際の画像をチェックするようにスクリプトを改善することはできますが、ファイルに実際にメディアが含まれていない限り、スクリプトが存在する可能性はほとんどありません。 「6060」バイトのチェックについても同じことが言えます。それはハックですが、私にとってはうまくいきます。

もちろん、スクリプトはそれぞれのシステムでのunzipの実装に依存しますが、OSXバージョンでは機能します。

11
slhck

Windowsの場合:

  • 。docxの名前を.Zipに変更し、Zipファイルを開いて、画像を抽出します(最善の方法です!)。
  • 次に、\zipfile\Word\mediaの下の画像で画像を探します。

参照

0
Abhijeet