Конвертировать Word doc или docx файлы в текстовые файлы?
Мне нужен способ конвертировать .doc
или же .docx
расширения до .txt
без установки чего-либо. Я также не хочу вручную открывать Word, чтобы сделать это, очевидно. Пока он работает на авто.
Я думал, что Perl или VBA могли бы добиться цели, но я не могу найти что-либо в Интернете ни для чего.
Какие-либо предложения?
11 ответов
Обратите внимание, что отличным источником информации для приложений Microsoft Office является Object Browser. Вы можете получить к нему доступ через Tools
→ Macro
→ Visual Basic Editor
, Когда вы окажетесь в редакторе, нажмите F2, чтобы просмотреть интерфейсы, методы и свойства, предоставляемые приложениями Microsoft Office.
Вот пример использования Win32:: OLE:
#!/usr/bin/perl
use strict;
use warnings;
use File::Spec::Functions qw( catfile );
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';
$Win32::OLE::Warn = 3;
my $word = get_word();
$word->{Visible} = 0;
my $doc = $word->{Documents}->Open(catfile $ENV{TEMP}, 'test.docx');
$doc->SaveAs(
catfile($ENV{TEMP}, 'test.txt'),
wdFormatTextLineBreaks
);
$doc->Close(0);
sub get_word {
my $word;
eval {
$word = Win32::OLE->GetActiveObject('Word.Application');
};
die "$@\n" if $@;
unless(defined $word) {
$word = Win32::OLE->new('Word.Application', sub { $_[0]->Quit })
or die "Oops, cannot start Word: ",
Win32::OLE->LastError, "\n";
}
return $word;
}
__END__
Простое Perl-решение для docx:
Используйте Archive:: Zip, чтобы получить
word/document.xml
файл из вашегоdocx
файл. (Docx это просто архив в архиве.)Используйте XML:: LibXML для его анализа.
Затем используйте XML:: LibXSLT, чтобы преобразовать его в текстовый или HTML-формат. Найдите в Интернете хороший файл docx2txt.xsl:)
Ура!
J.
Для.doc у меня был некоторый успех с антисловом инструмента командной строки linux. Он очень быстро извлекает текст из.doc, обеспечивая хороший рендеринг отступов. Затем вы можете передать это в текстовый файл в bash.
Для.docx я использовал OOXML SDK, как упоминали некоторые другие пользователи. Это всего лишь библиотека.NET, облегчающая работу с OOXML, заархивированным в файле OOXML. Существует множество метаданных, которые вы захотите удалить, если вас интересует только текст. Некоторые другие люди уже написали код, который я вижу: DocXToText.
Aspose.Words имеет очень простой API с отличной поддержкой, я также нашел.
Также есть команда bash от commandlinefu.com, которая работает, разархивировав.docx:
unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
Я настоятельно рекомендую AsposeWords, если вы можете сделать Java или.NET. Он может конвертировать, без установленного Word, между всеми основными типами текстовых файлов.
Если у вас установлен некоторый вариант Unix, вы можете использовать утилиту 'strings', чтобы найти и извлечь все читаемые строки из документа. До и после текста, который вы ищите, будет некоторая путаница, но результаты будут читабельными.
Обратите внимание, что вы также можете использовать OpenOffice для выполнения различных преобразований документов, чертежей, электронных таблиц и т. Д. На платформах Windows и * nix.
Вы можете получить доступ к OpenOffice программным способом (аналогично COM в Windows) через UNO с различных языков, для которых существует привязка UNO, в том числе из Perl через модуль OpenOffice::UNO.
На странице OpenOffice::UNO вы также найдете образец скрипта Perl, который открывает документ, все что вам нужно сделать, это экспортировать его в txt
используя document.storeToURL()
Метод - посмотрите пример Python, который может быть легко адаптирован к вашим потребностям Perl.
Метод Синан Юнур работает хорошо.
Тем не менее, я получил некоторые сбои с файлами, которые я преобразовывал.
Другой способ заключается в использовании Win32::OLE и Win32::Clipboard как таковых:
- Откройте документ Word
- Выделить весь текст
- Скопировать в буфер обмена
- Распечатать содержимое буфера обмена в текстовом файле
- Очистите буфер обмена и закройте документ Word
Основываясь на сценарии, представленном Сигвальдом Рефсу в http://computer-programming-forum.com/53-perl/c44063de8613483b.htm, я придумал следующий сценарий.
Примечание. Я решил сохранить txt-файл с тем же базовым именем, что и файл.docx, и в той же папке, но это можно легко изменить.
###########################################
use strict;
use File::Spec::Functions qw( catfile );
use FindBin '$Bin';
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Word';
use Win32::Clipboard;
my $monitor_word=0; #set 1 to watch MS Word being opened and closed
sub docx2txt {
##Note: the path shall be in the form "C:\dir\ with\ space\file.docx";
my $docx_file=shift;
#MS Word object
my $Word = Win32::OLE->new('Word.Application', 'Quit') or die "Couldn't run Word";
#Monitor what happens in MS Word
$Word->{Visible} = 1 if $monitor_word;
#Open file
my $Doc = $Word->Documents->Open($docx_file);
with ($Doc, ShowRevisions => 0); #Turn of revision marks
#Select the complete document
$Doc->Select();
my $Range = $Word->Selection();
with ($Range, ExtendMode => 1);
$Range->SelectAll();
#Copy selection to clipboard
$Range->Copy();
#Create txt file
my $txt_file=$docx_file;
$txt_file =~ s/\.docx$/.txt/;
open(TextFile,">$txt_file") or die "Error while trying to write in $txt_file (!$)";
printf TextFile ("%s\n", Win32::Clipboard::Get());
close TextFile;
#Empty the Clipboard (to prevent warning about "huge amount of data in clipboard")
Win32::Clipboard::Set("");
#Close Word file without saving
$Doc->Close({SaveChanges => wdDoNotSaveChanges});
# Disconnect OLE
undef $Word;
}
Надеюсь, это поможет вам.
Файлы.doc, использующие формат XML WordprocessingML и .docx, могут анализировать свои XML-файлы для получения фактического текста документа. Вы должны прочитать их спецификации, чтобы выяснить, какие теги содержат читаемый текст.
Мне нужен способ конвертировать расширения.doc или.docx в.txt без установки чего-либо
for I in *.doc?; do mv $I `echo $ | sed 's/\.docx?/\.txt'`; done
Просто шутка.
Вы можете использовать antiword для старых версий документов Word и попытаться разобрать xml новых.
С помощью docxtemplater вы можете легко получить полный текст слова (работает только с docx).
Вот код (Node.JS)
DocxTemplater=require('docxtemplater');
doc=new DocxTemplater().loadFromFile("input.docx");
result=doc.getFullText();
Это всего лишь три строки кода и не зависит ни от одного экземпляра слова (все просто JS)
Вы не можете сделать это в VBA, если не хотите запускать Word (или другое приложение Office). Даже если вы имеете в виду VB, вам все равно придется запустить (скрытый) экземпляр Word, чтобы выполнить обработку.