2

回答を検索しましたが、回答が見つからなかったので、stackowerflow に登録しました。win32 ole を使用して単純な perl スクリプトを作成しようとしています。これは、すべての M$ ワード パラグラフ (ハード リターンで終わるテキスト) を反復処理し、指定された条件に一致するパラグラフのみを出力します。問題は、フォント サイズ プロパティにアクセスする必要があることです。このプロパティは最初の段落で一度だけ設定され、その後は更新されないようです。次のコードを参照してください。

#!/usr/bin/perl
use strict;
use warnings;
use Win32::OLE::Const 'Microsoft Word';
#$Win32::OLE::CP = CP_UTF8;
binmode STDOUT, 'encoding(utf8)';

# OPEN FILE SPECIFIED AS FIRST ARGUMENT
my $fname=$ARGV[0];
my $fnameFullPath = `cygpath.exe -wa $fname`;
$fnameFullPath =~ s/\\/\\\\/g;
$fnameFullPath =~ s/\s*$//;
unless (-e $fnameFullPath) { print "Error: File did not exists\n"; exit 1;}

# STARTING OLE
my $Word = Win32::OLE->GetActiveObject('Word.Application')
    || Win32::OLE->new('Word.Application','Quit')
    or die Win32::OLE->LastError();

$Word->{'Visible'} = 0;
my $doc = $Word->Documents->Open($fnameFullPath);
my $paragraphs = $doc->Paragraphs() ;
my $enumerate = new Win32::OLE::Enum($paragraphs);

# PROCESSING PARAGRAPHS
while(defined(my $paragraph = $enumerate->Next())) {

    my $text = $paragraph->{Range}->{Text};
    my $sel = $Word->Selection;
    my $font = $sel->Font;

    if ($font->{Size} == 18){
        print "Text: ", $text, "\n";
        print "Font Bold: ", $font->{Bold}, "\n";
        print "Font Italic: ", $font->{Italic}, "\n";
        print "Font Name: ", $font->{Name}, "\n";
        print "Font Size: ", $font->{Size}, "\n";
        print "=========\n";
    }
}

# CLOSING OLE
$Word->ActiveDocument->Close ;
$Word->Quit;

ここに私が得た出力があります:

Text: This is a doc file containing different fonts and size, document also contain header and footer (Font: TNR, Size: 18)
Font Bold: 0
Font Italic: 0
Font Name: Times New Roman
Font Size: 18
=========
Text: This is a Perl example (Font TNR, Size: 12)
Font Bold: 0
Font Italic: 0
Font Name: Times New Roman
Font Size: 18
=========
Text: This is a Python example(Font: Courier New, Size: 10)
Font Bold: 0
Font Italic: 0
Font Name: Times New Roman
Font Size: 18
=========

出力でわかるように、元のドキュメントのサイズが異なっていても、どこでもフォント サイズ 18 です (フォント名も更新されません)。これは、処理される最初の段落で $font が一度だけ設定されているという仮定につながります。したがって、次の条件

if ($font->{Size} == 18)

最初に処理された段落でのみ評価されます。これは、条件を次のように変更した場合 (2 番目の段落に一致) という事実もサポートしています。

if ($font->{Size} == 12)

出力は何もありません。最初の段落は 12 ではなく 18 であるため、条件は false であるため、$font は更新されなくなり、true になることはありません。私が間違っていることは何ですか?

どうもありがとう

4

1 に答える 1

1

スニペットで確認してください#Insert this code。これで問題なく動作します。

# PROCESSING PARAGRAPHS

while(defined(my $paragraph = $enumerate->Next())) {

    #Insert this code
    $paragraph->{Range}->Select(); 
    sleep(1);
    #-------------

    my $text = $paragraph->{Range}->{Text};    
    my $sel = $Word->Selection;
    my $font = $sel->Font;

    if ($font->{Size} == 18){
        print "Text: ", $text, "\n";
        print "Font Bold: ", $font->{Bold}, "\n";
        print "Font Italic: ", $font->{Italic}, "\n";
        print "Font Name: ", $font->{Name}, "\n";
        print "Font Size: ", $font->{Size}, "\n";
        print "=========\n";
    }
}
于 2014-01-08T06:00:32.050 に答える