Есть ли инструмент для этого. Я видел некоторые инструменты Python/Java для автоматизации OpenOffice, но кто-нибудь надежно написал этот сценарий, чтобы сделать более одного файла, и пройти через дерево папок / каталогов с файлами .doc в нем, поместив преобразованные файлы .txt и .html следующим к исходному файлу в его местоположении.
3 ответа
Linux/Unix
Мне известны два инструмента Unix:
catdoc
antiword
Вы можете просто использовать find
для рекурсивного просмотра папки
find . -name "*.doc" -exec <command> {} \;
Где <command>
- это соответствующее действие для преобразования файла .doc в файл .txt с использованием catdoc
или antiword
.
Mac OS X
Вы можете использовать те же инструменты, но вам придется установить их, например, с помощью Homebrew. Для этого введите в Терминале:
ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"
А потом:
brew install catdoc
brew install antiword
@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;
}
catdoc и antiword имеют очень ограниченную поддержку форматов файлов, последняя версия, которую они понимают, это Word 2000.
Я знаю, что вы можете написать скрипт LibreOffice, чтобы конвертировать любые файлы, которые он понимает, в текст или PDF (это то, что делает MediaGoblin), но я не знаю, как именно это сделать.