识别包含图像的 .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 字节(但有些文档的标题要大一些)。我们可以尝试利用它来判断文档中是否有图像。我们就说 8000 字节吧——因为真正的图像肯定不止几 KB。


那么.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文件夹。

  • 现在,打开终端应用程序,并常去cd ~/Documents那里。

  • 输入ruby docx-images.rb,它将递归扫描您的Documents文件夹以查找docxdoc文件。它会将前者解压缩到/tmp/word,并检查它们是否包含嵌入媒体。后者只是解压缩到/dev/null,因此不会留下任何痕迹。

  • 您最终会得到一份包含嵌入媒体的列表。


证明

为了证明这个方法可行,我创建了四个文件。一个包含图片,一个不包含图片,两者都是 asdocdocx

证明

然后运行脚本:

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

显然,脚本可以改进以检查该media文件夹中是否存在实际图像,但除非文件确实包含任何媒体,否则不太可能存在图像。“6060”字节检查也是如此。这是一个黑客行为,但对我来说很有效。

当然,该脚本依赖于unzip各自系统的实现,但它适用于OS X版本。

答案2

为了视窗

  • 将 .docx 重命名为 .zip,打开 zip 文件并提取图像(最佳方式!)。
  • 然后在下方寻找图像\zipfile\word\media

参考

相关内容