有没有工具可以做到这一点。我见过一些 Python/Java 工具来自动化 OpenOffice,但有没有人可靠地编写脚本来执行多个文件,并递归遍历包含 .doc 文件的文件夹/目录树,将转换后的 .txt 和 .html 文件放在其位置的原始文件旁边。
答案1
Linux/Unix
我知道有两个 Unix 工具:
catdoc
antiword
你可以使用find
递归方式浏览文件夹
find . -name "*.doc" -exec <command> {} \;
<command>
将 .doc 文件转换为 .txt 文件的适当操作在哪里,使用catdoc
或antiword
。
Mac OS X
您可以使用相同的工具,但必须使用以下方式安装它们,例如,自制。为此,请在终端中输入:
ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"
进而:
brew install catdoc
brew install antiword
答案2
@slhck 您的解决方案几乎可行,但输出到显示器/STDOUT,所有文件都连接在一起。我需要单独的 .txt 文件作为输出。原因是我们没有在输出中考虑文件名。
为了解决必须遍历文件夹层次结构的问题,如果我使用 Windows 搜索 *.doc,然后将结果复制到一个文件夹中,并将它们全部放在一个文件夹中,那么我就可以启动 Ubuntu 并运行以下命令。
(我在某处有一个文件/文件夹递归代码,如果有时间,我会将其挖出来并在以后添加。)但是现在,只需像上面那样展平文件层次结构就足够了。
顺便说一句,catdoc 比 antiword 更好用,因为 antiword 抱怨有些文件不是 word 文档,这些文件往往是带有格式和文本块的 .doc 文件,这些文本块在文档内以框架形式组织。catdoc 似乎可以转换我所有的文档。
#!/usr/bin/perl -w
use File::Basename;
my $okFiles = "";
my $couldntGet = "";
@files = <*>;
foreach $file (@files)
{
if ( $file =~ m/\.doc/ )
{
my ( $filenameOnly, $dir, $ext ) = fileparse($file, qr/\.[^.]*/);
if ( ( defined $filenameOnly ) && ( defined $ext ) )
{
$okFiles .= "file: ".$file." filename only:".$filenameOnly." extension:".$ext."\n";
system( "catdoc \"".$file."\" > \"".$filenameOnly.".txt\"" );
}
else
{
$couldntGet .= "*file: ".$file." - couldn't get filename only and extension\n";
}
}
print $okFiles;
print $couldntGet;
}
答案3
catdoc 和 antiword 对文件格式的支持非常有限,它们能理解的最新版本是 Word 2000。
我知道您可以编写脚本 LibreOffice 将其理解的任何文件转换为文本或 pdf(这是 MediaGoblin 所做的),但我不知道具体如何做到这一点。