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

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

ノートを Evernote に移動しています。そのためには、.doc/.docx ファイルを rtf に変換する必要があります。その理由は、rtf を Evernote にインポートするスクリプトがあるからです。ただし、.doc/.docx ファイルの中には画像が含まれているものもあります。

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

OS X 10.6.8 を使用していると記載する必要があります。

答え1

.doc ファイルでは画像はどこに保存されますか?

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

ファイルレイアウト

したがって、ファイルを解凍しようとすると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) では、これははるかに簡単です。これらは実際に圧縮されたファイルであり、あらゆる種類の埋め込みメディア (画像、ビデオ) を含むすべての 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フォルダーに保存します。

  • さあ、開けてターミナル.app、そしてcd ~/Documentsそこに行くのに使います。

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

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


証拠

これが機能することを証明するために、4 つのファイルを作成しました。1 つは画像付き、もう 1 つは画像なしです。どちらも およびdocですdocx

証拠

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

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

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

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

答え2

のためにウィンドウズ:

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

参照

関連情報