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

StackOverflow https://stackoverflow.com/questions/1110409

Вопрос

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

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

Есть какие-нибудь предложения?

Это было полезно?

Решение

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

Я настоятельно рекомендую Как слова если вы можете использовать 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top