2009-07-10 3 views
9

Мне нужен способ конвертировать .doc или .docx расширения до .txt без установки каких-либо элементов. Я также не хочу, чтобы вручную открывать Word, чтобы сделать это, очевидно. Пока он работает на авто.Преобразование файлов Word или docx в текстовые файлы?

Я думал, что либо Perl, либо VBA могли бы сделать трюк, но я тоже не могу найти что-либо в Интернете.

Любые предложения?

ответ

8

Обратите внимание, что отличным источником информации для приложений Microsoft Office является Обозреватель объектов. Вы можете получить к нему доступ через ToolsMacroVisual 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 "[email protected]\n" if [email protected]; 

    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__ 
1

.doc, которые используют WordprocessingML и .docx's XML format, могут проанализировать их XML для получения фактического текста документа. Вам нужно будет прочитать их спецификации, чтобы выяснить, какие теги содержат читаемый текст.

0

Вы не можете сделать это в VBA, если вы не хотите запускать Word (или другое приложение Office). Даже если вы имели в виду VB, вам все равно придется запустить (скрытый) экземпляр Word для обработки.

+0

до тех пор, как она может быть автоматизирована через запланированную задачу на ПК с Windows, не имеет значения, открыто ли слово ... плохо переформулировать вопрос – CheeseConQueso

2

Вы пытаетесь сделать это без, требующих каких-либо установленных компонентов MS Office? Даже тогда VBA потребует установки COM-библиотек для работы.

Как насчет Perl Win32::OLE автоматизация?

4

Я настоятельно рекомендую AsposeWords, если вы можете сделать Java или .NET. Он может конвертировать без Word, между всеми основными типами текстовых файлов.

12

Простой Perl единственное решение для DOCX:

  1. Использование Archive::Zip получить word/document.xml файл из файла docx. (A docx - это просто архив в молнии.)

  2. Используйте XML::LibXML, чтобы проанализировать его.

  3. Затем используйте XML::LibXSLT, чтобы преобразовать его в текст или формат html. Увидеть Интернет, чтобы найти хороший файл docx2txt.xsl :)

Cheers!

J.

4

Если у вас есть некоторый вкус юниксовских установки, вы можете использовать утилиту «строки», чтобы найти и извлечь все считываемые строки из документа. Будет некоторая беспорядок до и после текста, который вы ищете, но результаты будут читабельны.

+0

Это отличный инструмент ... никогда не использовал его до сих пор и задавался вопросом, где я получил информацию из. еще раз спасибо – CheeseConQueso

1

Мне нужен способ, чтобы преобразовать .doc или .docx расширений .txt без установки каких-либо

for I in *.doc?; do mv $I `echo $ | sed 's/\.docx?/\.txt'`; done 

Просто шучу.

Вы можете использовать antiword для более старых версий документов Word и попытаться проанализировать xml новых.

2

Обратите внимание, что вы также можете использовать OpenOffice для выполнения конверсий разных документов, чертежей, расширений и т. Д. На платформах Windows и * nix.

Вы можете обращаться к OpenOffice программно (аналогично COM в Windows) с помощью UNO с разных языков, для которых существует привязка UNO, в том числе от Perl через модуль OpenOffice::UNO.

На OpenOffice::UNO page вы также найдете образец Perl скриптлет который открывает документ, все, что вам тогда нужно сделать, это экспортировать его в txt с использованием методы document.storeToURL() - см a Python example, который может быть легко приспособлен для ваших потребностей Perl.

4

Для .doc, у меня был некоторый успех с помощью инструмента командной строки linux antiword. Он извлекает текст из .doc очень быстро, давая хороший отрисовку отступов. Затем вы можете передать это текстовому файлу в bash.

Для .docx, я использовал OOXML SDK как некоторые другие упомянутые пользователи. Это просто библиотека .NET, чтобы упростить работу с OOXML, который зашифрован в файле OOXML. Существует много метаданных, которые вы захотите отбросить, если вас интересует только текст. Некоторые другие люди уже написали код, который я вижу: DocXToText.

Aspose.Words имеет очень простой API с большой поддержкой, которую я тоже нашел.

Существует также команда Баш из commandlinefu.com, который работает распаковкой .docx:

unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g' 
1

Метод Синан Ünür работает хорошо.
Тем не менее, я получил крах с файлами, которые я трансформировал.

Другой метод заключается в использовании Win32 :: OLE и Win32 :: Буфер обмена, как, например:

  • Открыть документ Слово
  • Выбрать весь текст
  • Копировать в буфер обмена
  • Печать на содержимое буфера обмена в txt-файле
  • Очистить буфер обмена и закрыть документ Word

На основании сценария, данного Sigvald Refsu в 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; 
} 

Надеется, что это может поможет.

0

С docxtemplater вы можете легко получить полный текст слова (работает только с docx).

Вот код (Node.js)

DocxTemplater=require('docxtemplater'); 
doc=new DocxTemplater().loadFromFile("input.docx"); 
result=doc.getFullText(); 

Это всего три строки кода и не зависит ни от какого слова (например, все ясно, JS)