我正在将我的笔记移至 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
文件夹以查找docx
和doc
文件。它会将前者解压缩到/tmp/word
,并检查它们是否包含嵌入媒体。后者只是解压缩到/dev/null
,因此不会留下任何痕迹。您最终会得到一份包含嵌入媒体的列表。
证明
为了证明这个方法可行,我创建了四个文件。一个包含图片,一个不包含图片,两者都是 asdoc
和docx
:
然后运行脚本:
charon:test werner$ ruby docx-images.rb
images.docx
images.doc
显然,脚本可以改进以检查该media
文件夹中是否存在实际图像,但除非文件确实包含任何媒体,否则不太可能存在图像。“6060”字节检查也是如此。这是一个黑客行为,但对我来说很有效。
当然,该脚本依赖于unzip
各自系统的实现,但它适用于OS X版本。