http://www.perlmonks.org?node_id=988951


in reply to win 32 OLE Selection property

Hi

It seems to me that this property is set only once in first paragraph and later is not updated.
If that assumption is correct, you might want to store the font-information to a variable outside of the loop and access it inside in case it is not redefined there. Something like:
my $oldFont; # variable to hold the current font while(defined(my $paragraph = $enumerate->Next())) { my $text = $paragraph->{Range}->{Text}; my $sel = $Word->Selection; my $font = $sel->Font; if (!defined($font)) { $font = $oldFont; } # use the old f +ont instead else { $oldFont = $font; } # use this font + for future paragraphs
HTH, Rata

Replies are listed 'Best First'.
Re^2: win 32 OLE Selection property
by wakatana (Novice) on Aug 22, 2012 at 09:00 UTC
    Hello Rata, thank you for your answer but it did not helped me much :( seems pretty similar to what i did (or did not). I tried this:
    #!/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"; exi +t 1;} 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); my $oldFont = $Word->Selection->Font; # add +ed line while(defined(my $paragraph = $enumerate->Next())) { my $text = $paragraph->{Range}->{Text}; my $sel = $Word->Selection; my $font = $sel->Font; if (!defined($font)) { $font = $oldFont; } # use the old f +ont instead else { $oldFont = $font; } # use this font + for future paragraphs 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"; } } $Word->ActiveDocument->Close ; $Word->Quit;
    Here is output:
    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 =========
    As you can see in output everywhere is Font Size 18 even if in original document are different sizes (Also font name is not updated). This brings me to assumption that $font is set only once in 1st paragraph which is processed. Thus the following condition
    if ($font->{Size} == 18)
    is only evaluated in 1st processed paragraph. This also supports fact that if I change condition to following (Match 2nd paragraph):
    if ($font->{Size} == 12)
    the output is nothing. Because first paragraph is 18 not 12 and thus the condition is false, $font is not updated any more so it wont never be true. What I am doing wrong ? Many thanks