Как извлечь текст из MS Word? - PullRequest
3 голосов
/ 15 июля 2011

Я пытаюсь открыть документ Word и просто извлечь весь текст документа и отобразить его пользователю, используя Win32 :: OLE

#usr/bin/perl
#OLEWord.pl

#Use string and print warnings
use strict;use warnings;
#Using OLE + OLE constants for Variants and OLE enumeration for Enumerations
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';

$Win32::OLE::Warn = 3;

#set the file to be opened
my $file = '/work/Test.docx';

#Create a new instance of Win32::OLE for the Word application, die if could not open the application
my $MSWord = Win32::OLE->new('Word.Application','Quit') and "Opened Word" or die     "Unable to open document ", Win32::OLE->LastError(); 
#Set the screen to Visible, so that you can see what is going on
$MSWord->{'Visible'} = 1;
#open the request file or die and print warning message
my $Doc = $MSWord->Documents->Open('C:\work\Test.docx') or die "Could not open ", $file, " Error:", Win32::OLE->LastError();

#$MSWord->ActiveDocument->SaveAs({Filename => 'AlteredTest.docx', 
                            #FileFormat => wdFormatDocument});


sub ShowObjs {
my $obj = shift;
foreach (sort keys %$obj) {
print "Keys: $_ - $obj->{$_}\n"; }
 }

 my $paragraphs = $Doc->Paragraphs;
 ShowObjs($paragraphs);

 #  Get and print the Text inside the opened file
 my $paragraphs = $Doc->Paragraphs;
 my $txt = $Doc->Range->Text;
 print $txt;

 $MSWord->ActiveDocument->Close;
 $MSWord->Quit;

Iполучаю этот код ошибки:

Исключение OLE из "Microsoft Word":

Сбой команды

Win32 :: OLE (0.1709) Ошибка ox800a1066 в METHOD /PROPERTYGET "Открыть" в строке OLEWord.pl 20

Обновление: Я могу нормально открыть приложение Word, только когда я пытаюсь открыть файл, проблема

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

У меня есть несколько сценариев для преобразования DOC в различные выходные форматы, используя Win32 :: OLE .Обычно они начинаются так:

use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';
my $wr = Win32::OLE->new('Word.Application')
    or die "Failure - word. \n";

$wr->{DisplayAlerts} = wdAlertsNone;
$wr->{Visible} = 0;

my $Doc = $wr->Documents->Open({
    FileName           => $input_file_path,
    ConfirmConversions => 0,
    AddToRecentFiles   => 0,
    Revert             => 0,
    ReadOnly           => 1,
    OpenAndRepair      => 0,
}) or exit;

...

Обратите внимание, что $input_file_path должен содержать абсолютный путь к вашему файлу.Вы также можете включить Visible и DisplayAlerts, чтобы увидеть любую ошибку, которую может выдать Word.

Редактировать: Вы можете просматривать абзацы, используя перечислитель in:

use Win32::OLE qw(in);

...

my $paragraphs = $Doc->Paragraphs;
for my $par (in $paragraphs) {
    print $par->Range->Text();
}

Или вы можете использовать собственный метод экспорта Word и сохранить документ в качестве одного из поддерживаемых форматов:

$Doc->SaveAs({
    FileName   => 'c:\\work\\Test.txt',
    FileFormat => wdFormatEncodedText,
});

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

1 голос
/ 15 июля 2011

Win32::OLE может быть немного смешным в общении. если что-то вызывает запрос, вы можете получить сообщение, подобное этому. Обычно может случиться так, что он захочет открыть файл, например, только для чтения, и открыть диалоговое окно, но эти диалоговые окна могут прерваться при инициализации по умолчанию Win32::OLE.

Если это так, звоните

Win32::OLE->Initialize(Win32::OLE::COINIT_OLEINITIALIZE);

до того, как вы сделаете что-либо, например, создание каких-либо объектов (то есть, до Win32::OLE->new), которые могут сработать.

...