Конвертировать Word doc или docx файлы в текстовые файлы? - PullRequest
11 голосов
/ 10 июля 2009

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

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

Есть предложения?

Ответы [ 11 ]

12 голосов
/ 10 июля 2009

Простое Perl-решение для docx:

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

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

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

Ура!

J.

9 голосов
/ 10 июля 2009

Обратите внимание, что отличным источником информации для приложений 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__
4 голосов
/ 28 августа 2011

Для .doc у меня был некоторый успех с инструментом командной строки linux antiword . Он очень быстро извлекает текст из .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'
4 голосов
/ 10 июля 2009

Если у вас установлена ​​версия Unix, вы можете использовать утилиту 'strings', чтобы найти и извлечь все читаемые строки из документа. До и после искомого текста будет некоторая путаница, но результаты будут читабельными.

4 голосов
/ 10 июля 2009

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

2 голосов
/ 09 марта 2010

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

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

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

1 голос
/ 13 марта 2014

Метод Синан Юнюр хорошо работает.
Однако у меня произошел сбой с файлами, которые я преобразовывал.

Другой способ - использовать 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; 
}

Надеюсь, это поможет вам.

1 голос
/ 10 июля 2009

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

0 голосов
/ 22 сентября 2014

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

Вот код (Node.JS)

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

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

0 голосов
/ 10 июля 2009

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

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

Просто шучу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...