Метод Синан Юнюр хорошо работает.
Однако у меня произошел сбой с файлами, которые я преобразовывал.
Другой способ - использовать 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;
}
Надеюсь, это поможет вам.