在 Windows 和 Mac 的文件夹和子文件夹中将 .doc 文件批量转换为 .txt(纯 ascii 文本)和/或 .html?

在 Windows 和 Mac 的文件夹和子文件夹中将 .doc 文件批量转换为 .txt(纯 ascii 文本)和/或 .html?

有没有工具可以做到这一点。我见过一些 Python/Java 工具来自动化 OpenOffice,但有没有人可靠地编写脚本来执行多个文件,并递归遍历包含 .doc 文件的文件夹/目录树,将转换后的 .txt 和 .html 文件放在其位置的原始文件旁边。

答案1

Linux/Unix

我知道有两个 Unix 工具:

  • catdoc
  • antiword

你可以使用find递归方式浏览文件夹

find . -name "*.doc" -exec <command> {} \;

<command>将 .doc 文件转换为 .txt 文件的适当操作在哪里,使用catdocantiword

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 所做的),但我不知道具体如何做到这一点。

相关内容