Note that there are some explanatory texts on larger screens.

plurals
  1. POPerl ole selection property iterating
    text
    copied!<p>I searched answer but did not find answer, so it brings me to register at stackowerflow. I am trying to write simple perl script using win32 ole which will iterate over all M$ word paragraphs (any text that ends with a hard return) and print only those paragraphs that matches the specified condition. The problem is that I need to access font size property. It seems to me that this property is set only once in first paragraph and later is not updated. Please see following code:</p> <pre><code>#!/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"; exit 1;} # STARTING OLE my $Word = Win32::OLE-&gt;GetActiveObject('Word.Application') || Win32::OLE-&gt;new('Word.Application','Quit') or die Win32::OLE-&gt;LastError(); $Word-&gt;{'Visible'} = 0; my $doc = $Word-&gt;Documents-&gt;Open($fnameFullPath); my $paragraphs = $doc-&gt;Paragraphs() ; my $enumerate = new Win32::OLE::Enum($paragraphs); # PROCESSING PARAGRAPHS while(defined(my $paragraph = $enumerate-&gt;Next())) { my $text = $paragraph-&gt;{Range}-&gt;{Text}; my $sel = $Word-&gt;Selection; my $font = $sel-&gt;Font; if ($font-&gt;{Size} == 18){ print "Text: ", $text, "\n"; print "Font Bold: ", $font-&gt;{Bold}, "\n"; print "Font Italic: ", $font-&gt;{Italic}, "\n"; print "Font Name: ", $font-&gt;{Name}, "\n"; print "Font Size: ", $font-&gt;{Size}, "\n"; print "=========\n"; } } # CLOSING OLE $Word-&gt;ActiveDocument-&gt;Close ; $Word-&gt;Quit; </code></pre> <p>Here is output what I obtained:</p> <pre><code>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 ========= </code></pre> <p>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</p> <pre><code>if ($font-&gt;{Size} == 18) </code></pre> <p>is only evaluated in 1st processed paragraph. This also supports fact that if I change condition to following (Match 2nd paragraph):</p> <pre><code>if ($font-&gt;{Size} == 12) </code></pre> <p>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 ?</p> <p>Many thanks</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload