Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: win 32 OLE Selection property

by Ratazong (Prior)
on Aug 22, 2012 at 05:43 UTC ( #988951=note: print w/ replies, xml ) Need Help??


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


Comment on Re: win 32 OLE Selection property
Download Code
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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://988951]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (11)
As of 2014-07-28 11:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (196 votes), past polls