Конвертировать Word doc или docx файлы в текстовые файлы?

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

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

Какие-либо предложения?

11 ответов

Решение

Обратите внимание, что отличным источником информации для приложений Microsoft Office является Object Browser. Вы можете получить к нему доступ через 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 "$@\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:

  1. Используйте Archive:: Zip, чтобы получить word/document.xml файл из вашего docx файл. (Docx это просто архив в архиве.)

  2. Используйте XML:: LibXML для его анализа.

  3. Затем используйте 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, чтобы выполнить обработку.

Другие вопросы по тегам