识别包含图像的.doc / .docx文件


7

我正在将笔记移至Evernote。为此,我需要将.doc / .docx文件转换为rtf。原因是我有一个脚本将rtf导入evernote。但是,我的某些.doc / .docx文件包含图像。

有什么方法可以识别哪些.doc / .docx文件包含图像而无需全部查看?我有数千。这样,我可以简单地打开一些有图像的文件,然后将整个内容直接复制/粘贴到evernote中。

应该说我正在使用OS X 10.6.8。

Answers:


11

.doc文件在哪里存储图像?

Word doc文件实际上是经过压缩的,然后放入了容器格式。他们以这种编译文件格式将媒体存储在某个位置,可能就在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文件夹中,也许是文件夹中。

  • 现在,打开Terminal.app,然后使用cd ~/Documents它去那里。

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

  • 最后,您将获得包含嵌入式媒体的列表。


证明

为了证明这可行,我创建了四个文件。一个带有图像,一个没有图像– as docdocx

证明

然后,运行脚本:

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

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

当然,该脚本取决于unzip各自系统上的实现,但是它适用于OS X版本。


非常感谢您的答复。我将代码复制到一个新文档中,将其复制到其中一个包含.doc文件和包含.doc文件的子文件夹的文件夹中。然后,我使用终端导航到该文件夹​​并运行ruby代码。然后,终端窗口将列出许多.doc文件。我以为这个列表应该包含那些包含图像的.doc文件,对吗?如果是这种情况,那么事情就不太正确了,因为我获得了文件夹和子文件夹中文件的完整列表。我应该补充一点,一些.doc文件将采用97格式。
修订

因此,您可以获得每个 .doc文件的列表,而不只是带有图像的文件的列表?您是否可以unzip -c some-file.doc > /dev/null针对这些错误分类的文件之一运行,并告诉我是否还有6060字节以外的偏移量?
slhck 2012年

Simons-MacBook-Pro:7000-Acts and the Early church Simon$ unzip -c 7000-TROAS.doc > /dev/null End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. note: 7000-TROAS.doc may be a plain executable, not an archive unzip: cannot find zipfile directory in one of 7000-TROAS.doc or 7000-TROAS.doc.zip, and cannot find 7000-TROAS.doc.ZIP, period.
修订

嗯,这让我相信这些文件不是使用与我所用的Word版本相同(在这种情况下,2011年)创建的-但是“ Word 97-2003”是一种文件格式,无论使用哪种格式类型。当然,我的脚本会失败,因为它假定所有没有图像的文件的头均为6060字节。也许您可以提供一个包含图像的文档示例,而没有图像的示例?
slhck

我该如何发送给您?
修订

0

对于Windows

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

参考

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.