2009-05-04 11 views
2

Ich habe einen (Satz) Word-Dokument (e), für die ich verschiedene Eigenschaften (Anzahl der Seiten, Autor, etc.) mit Win32 :: OLE in Perl zu bekommen bin versucht:Warum unterscheidet sich die Anzahl der Seiten in einem Word-Dokument in Perl und Word VBA?

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

Diese Erträge 4 Seiten. Aber die tatsächliche Anzahl der Seiten im Dokument ist 9. Die Anzahl der Seiten im ersten Abschnitt ist 4. Ich möchte die Gesamtzahl der Seiten im Dokument.

Wenn in Word VBA ich wie folgt vor:

MsgBox ActiveDocument.BuiltInDocumentProperties("Number of pages") 

Zeigt 9. Die Anzahl der Seiten in der Eigenschaften/Statistik-Seite angezeigt ist 9.

Muss ich eine Kraft neu berechnen? Gibt es eine Möglichkeit, die OLE-Bibliothek zu bitten, eine Neuberechnung zu erzwingen, oder muss ich jeden Abschnitt einzeln behandeln?

Ich bin auf XP, Word 2007, ActivePerl v5.10.0.

Antwort

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

Dies funktioniert. Das $ doc-> Repaginate war das, wonach ich suchte. Vielen Dank. Was ist der Unterschied zwischen -> valof und -> value? –

+0

Ich hasse es zuzugeben. Ich bin mir nicht sicher über den Unterschied zwischen valof und value oder gar {Value}. Das Skript, das ich gepostet habe, wurde von etwas anderem übernommen, das ich geschrieben hatte. Nun, da Sie es erwähnt haben, $ doc-> BuiltInDocumentProperties-> Item (wdPropertyPages) -> {Wert}; $ doc-> BuiltInDocumentProperties-> Element (wdPropertyPages) -> Wert; $ doc-> BuiltInDocumentProperties-> Element (wdPropertyPages) -> valof; geben alle das gleiche Ergebnis. Dies ist etwas, in das ich schauen sollte, aber nur aus ästhetischen Gründen würde ich bei -> Value bleiben. –