2009-05-04 5 views
2

J'ai un (ensemble de) document Word (s) pour lequel je suis en train d'obtenir différentes propriétés (nombre de pages, l'auteur, etc.) à l'aide de Win32 ole en Perl:Pourquoi le nombre de pages dans un document Word est-il différent en Perl et Word VBA?

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

Ce rendement 4 pages Mais le nombre réel de pages dans le document est 9. Le nombre de pages dans la première section est 4. Je veux le nombre total de pages dans le document.

Si, dans Word VBA, je fais ce qui suit:

MsgBox ActiveDocument.BuiltInDocumentProperties("Number of pages") 

Cette affiche 9. Le nombre de pages affichées dans la page Propriétés/statistiques est 9.

Dois-je forcer recalculer? Est-il possible de demander à la bibliothèque OLE de forcer un recalcul ou dois-je traiter chaque section séparément?

Je suis sur XP, Word 2007, ActivePerl v5.10.0.

Répondre

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

Cela fonctionne. Le $ doc-> Repaginate était ce que j'étais après. Merci. Quelle est la différence entre -> valof et -> value? –

+0

Je déteste l'admettre. Je ne suis pas trop sûr de la différence entre valof et value ou même {Value}. Le script que j'ai posté est adopté à partir d'autre chose que j'avais écrit. Maintenant que vous l'avez mentionné, $ doc-> BuiltInDocumentProperties-> Item (wdPropertyPages) -> {Value}; $ doc-> BuiltInDocumentProperties-> Item (wdPropertyPages) -> Value; $ doc-> BuiltInDocumentProperties-> Item (wdPropertyPages) -> valof; donnent tous le même résultat. C'est quelque chose à regarder, mais, pour des raisons esthétiques, je voudrais rester avec -> Valeur. –