Конвертировать файлы Word doc или docx в текстовые файлы?
-
12-09-2019 - |
Вопрос
Мне нужен способ преобразовать .doc
или .docx
расширения к .txt
ничего не устанавливая.Я также не хочу вручную открывать Word, чтобы сделать это очевидно.До тех пор, пока он работает в автоматическом режиме.
Я думал, что либо Perl, либо VBA могли бы сделать это, но я не могу найти ничего в Интернете ни для того, ни для другого.
Есть какие-нибудь предложения?
Решение
Обратите внимание, что отличным источником информации для приложений Microsoft Office является Обозреватель объектов.Вы можете получить к нему доступ через 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:
Использование Архив::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'
Я настоятельно рекомендую Как слова если вы можете использовать Java или .NET.Он может конвертировать без установленного Word между всеми основными типами текстовых файлов.
Если у вас установлена какая-либо версия unix, вы можете использовать утилиту 'strings' для поиска и извлечения всех читаемых строк из документа.До и после текста, который вы ищете, будет некоторая путаница, но результаты будут читабельны.
Обратите внимание, что вы также можете использовать Открытый офис для выполнения разных документов, чертежей, электронных таблиц и т.д.конверсии как на платформах Windows, так и на * nix.
Вы можете получить доступ к OpenOffice программно (способом, аналогичным COM в Windows) через UNO из множества языков, для которых существует привязка UNO, в том числе из Perl через OpenOffice::ООН модуль.
На OpenOffice:: Страница UNO вы также найдете образец скриптлета Perl, который открывает документ, все, что вам затем нужно сделать, это экспортировать его в txt
используя document.storeToURL()
метод - см. пример Python который может быть легко адаптирован к вашим потребностям Perl.
.док , который использует WordprocessingML Текстовая обработка и XML -формат docx .docx может быть проанализирован их XML для извлечения фактического текста документа.Вам нужно будет ознакомиться с их спецификациями, чтобы выяснить, какие теги содержат читаемый текст.
Метод Синана Юнюра работает хорошо.
Однако у меня произошел некоторый сбой с файлами, которые я преобразовывал.
Другой метод заключается в использовании Win32::OLE и Win32::Clipboard как таковых:
- Откройте документ Word
- Выделите весь текст
- Скопировать в буфер обмена
- Распечатайте содержимое буфера обмена в текстовом файле
- Очистите буфер обмена и закройте документ Word
На основе сценария , предоставленного Сигвальдом Рефсу в http://computer-programming-forum.com/53-perl/c44063de8613483b.htm, Я придумал следующий сценарий.
Примечание:Я решил сохранить текстовый файл с тем же базовым именем, что и у файла .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;
}
Надеюсь, это может вам помочь.
Вы не можете сделать это в VBA, если не хотите запускать Word (или другое приложение Office).Даже если бы вы имели в виду VB, вам все равно пришлось бы запустить (скрытый) экземпляр Word для выполнения обработки.
Мне нужен способ конвертировать расширения .doc или .docx в .txt без установки чего - либо
for I in *.doc?; do mv $I `echo $ | sed 's/\.docx?/\.txt'`; done
Просто шучу.
Вы могли бы использовать антислово для более старых версий документов Word и попробуйте проанализировать XML новых.
С docxtemplater ( шаблон документа ), вы можете легко получить полный текст word (работает только с docx).
Вот код (Node.JS)
DocxTemplater=require('docxtemplater');
doc=new DocxTemplater().loadFromFile("input.docx");
result=doc.getFullText();
Это всего лишь три строки кода, и они не зависят ни от одного экземпляра word (все обычные JS).