2009-05-04 1 views
2

Perl에서 Win32 :: OLE를 사용하여 다양한 속성 (페이지 수, 작성자 수 등)을 얻으려는 (일련의) Word 문서가 있습니다.왜 Perl과 Word VBA에서 Word 문서의 페이지 수가 다른가요?

print $MSWord->Documents->Open($name)-> 
BuiltInDocumentProperties->{"Number of pages"}->value . " \n"; 

그러면 4가 반환됩니다. 페이지. 그러나 문서의 실제 페이지 수는 9입니다. 첫 번째 섹션의 페이지 수는 4입니다. 문서의 총 페이지 수를 원합니다.

Word VBA에서 다음을 수행 할 경우 :

MsgBox ActiveDocument.BuiltInDocumentProperties("Number of pages") 

그러면 9가 표시됩니다. 등록 정보/통계 페이지에 표시된 페이지 수는 9입니다.

다시 계산 하시겠습니까? OLE 라이브러리에 강제로 재 계산을 요청하거나 모든 섹션을 개별적으로 처리해야합니까?

XP, Word 2007, ActivePerl v5.10.0입니다.

답변

4
#!/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} = 1; 

my $doc = $word->{Documents}->Open(catfile $ENV{TEMP}, 'test.doc'); 
$doc->Repaginate; 

my $props = $doc->BuiltInDocumentProperties; 
my $x = $props->Item(wdPropertyPages)->valof; 
print "$x\n"; 

$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; 
} 
+0

이것은 작동합니다. $ doc-> Repaginate는 내가했던 것입니다. 감사. -> valof와 -> value의 차이점은 무엇입니까? –

+0

나는 그것을 싫어한다. 가치와 가치 또는 {가치}의 차이에 대해 너무 확신하지 못합니다. 제가 게시 한 스크립트는 제가 작성한 다른 것으로부터 채택되었습니다. 이제 언급 했으니 $ doc-> BuiltInDocumentProperties-> Item (wdPropertyPages) -> {Value}; $ doc-> BuiltInDocumentProperties-> Item (wdPropertyPages) -> 값; $ doc-> BuiltInDocumentProperties-> Item (wdPropertyPages) -> valof; 모두 같은 결과가 나타납니다. 이것은 들여다 볼만한 것이지만, 심미적 인 이유만으로, 나는 "가치"를 고수 할 것입니다. –