Вопрос по vba, perl, docx, doc, text-files – Конвертировать Word doc или docx файлы в текстовые файлы?

11

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

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

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

Ваш Ответ

11   ответов
0

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

Вот код (Node.JS)

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

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

4

nuxAntiword, Он очень быстро извлекает текст из .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

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

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

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

2

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

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

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

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

что отличным источником информации для приложений Microsoft Office являетсяObject Browser, Вы можете получить к нему доступ черезTools & # X2192;Macro & # X2192;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 "[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__
0

lling anything

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

Просто шутка.

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

1


Тем не менее, я получил некоторые сбои с файлами, которые я преобразовывал.

Другой способ заключается в использовании Win32 :: OLE и Win32 :: Clipboard как таковых:

Open the Word document Select all the text Copy in the Clipboard Print the content of Clipboard in a txt file Empty the Clipboard and close the Word document

По сценарию Сигвальда Рефсу вhttp://computer-programming-forum.com/53-perl/c44063de8613483b.htmЯ придумал следующий сценарий.

Note: I chose to save the txt file with the same basename as the .docx file and in the same folder but this can easily be changed

########################################### 
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; 
}

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

12

Use Archive::Zip to get the word/document.xml file from your docx file. (A docx is just a zipped archive.)

Use XML::LibXML to parse it.

Then use XML::LibXSLT to transform it into text or html format. Seach the web to find a nice docx2txt.xsl file :)

Ура!

J.

1

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

Похожие вопросы