使用Perl和Win32::OLE,如何将Word文档中的编号列表转换为纯文本?

使用Perl和Win32::OLE,如何将Word文档中的编号列表转换为纯文本?,perl,ms-word,win32ole,Perl,Ms Word,Win32ole,我已经编写了一个Perl脚本,用它来读取Microsoft Word文档内容 我的问题是包含编号列表的文档(以1、2、3、…)开头)。我的Perl脚本无法获取该数字。我只能得到文本内容,不能得到数字 请建议如何将编号列表转换为纯文本,同时保留文本的编号。我的博客文章展示了如何使用PowerPoint实现这一点。事实证明,使用Word的任务更简单一些 #!/usr/bin/env perl use strict; use warnings; use feature 'say'; use Car

我已经编写了一个Perl脚本,用它来读取Microsoft Word文档内容

我的问题是包含编号列表的文档(以1、2、3、…)开头)。我的Perl脚本无法获取该数字。我只能得到文本内容,不能得到数字

请建议如何将编号列表转换为纯文本,同时保留文本的编号。

我的博客文章展示了如何使用PowerPoint实现这一点。事实证明,使用Word的任务更简单一些

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';

use Carp qw( croak );
use Const::Fast;
use Path::Class;
use Try::Tiny;
use Win32::OLE;
use Win32::OLE::Const ('Microsoft.Word');
use Win32::OLE::Enum;

$Win32::OLE::Warn = 3;

run(@ARGV);

sub run {
    my $docfile = shift;
    # Croaks if it cannot resolve
    $docfile = file($docfile)->absolute->resolve;

    my $word = get_word();
    my $doc = $word->Documents->Open(
        {
            FileName => "$docfile",
            ConfirmConversions => 0,
            AddToRecentFiles => 0,
            Revert => 0,
            ReadOnly => 1,
        }
    );
    my $pars =  Win32::OLE::Enum->new($doc->Paragraphs);

    while (my $par = $pars->Next) {
        print_paragraph($par);
    }
}

sub print_paragraph {
    my $par = shift;
    my $range = $par->Range;
    my $fmt = $range->ListFormat;
    my $bullet = $fmt->ListString;
    my $text = $range->Text;

    unless ($bullet) {
        say $text;
        return;
    }

    my $level = $fmt->ListLevelNumber;
    say ">" x $level, join(' ', $bullet, $text);

    return;
}

sub get_word {
    my $word;

    try { $word = Win32::OLE->GetActiveObject('Word.Application') }
    catch { croak $_ };

    return $word if $word;

    $word = Win32::OLE->new('Word.Application', sub { $_[0]->Quit });
    return $word if $word;

    croak sprintf('Cannot start Word: %s', Win32::OLE->LastError);
}
给定以下Word文档:

它生成输出:

This is a document >1. This is a numbered list >2. Second item in the numbered list >3. Third one Back to normal paragraph. >>a. Another list >>b. Yup, here comes the second item >>c. Not so sure what to put here >>>i. Sub-item 这是一份文件 >这是一份编号的清单 >2.编号列表中的第二项 >3.第三个 回到正常段落。 >>a。另一份名单 >>b。是的,第二项来了 >>c。不太确定该在这里放什么 >>>一,。分项 这是必不可少的