On May 9, 2006, at 2:58 PM, Peter Bailey wrote:

> Justin Collins wrote:
>> Peter Bailey wrote:
>>> require 'FileUtils'
>>>      #If the page count is odd, then, add a blank to make it an even
>>>     blankpages.push($1)
>>>     File.open(infofile + ".pageinfo", "w") do |writetext|
>>>       writetext << "Number of blankpages in this PDF:
>>> #{blankpages.length}\n" <<
>>>       "Blank Pages in This PDF: #{blankpages.join(' ')}\n"
>>>     end
>>>   end
>>>   end
>>> end
>>>
>>>
>>
>> I think part of the issue here is that you open the file for writing,
>> then do a read on the same file. Looking at IO.read:
>>
>> Opens the file, optionally seeks to the given offset, then returns
>> /length/ bytes (defaulting to the rest of the file). read ensures the
>> file is closed before returning.
>>
>> But you have already opened the file. So, your structure above looks
>> something like:
>>
>>
>> File.open(psfile) { #opens psfile
>>
>>     File.read(psfile) {  #opens psfile
>>
>>     } #closes psfile
>>
>>     File.read(psfile) { #opens psfile
>>
>>     } #closes psfile
>>
>> } #closes psfile
>>
>>
>> I'm not sure if that is the problem or not.
>>
>> -Justin
>
>
> Thanks, Justin. Your comments made me dive deeper, and, it works!
> Obviously, there shouldn't be any reason why I couldn't read a file
> twice, or as many times as I needed. But, I did make it neater here,
> closing one read before starting another. . . .
>
> require 'FileUtils'
> Dir.chdir("c:/scripts/ruby/temp")
> psfiles = Dir.glob('*.ps')
>
> blankpages = []
> totalpages = 0
>
> psfiles.each do |psfile|
>  infofile = File.basename(psfile, '.ps')
>  #Scan for the number of pages in the original PDF.
>  File.read(psfile).scan(/\%\%Pages: (\d{1,5})\n/) do
>   File.open(psfile, "a") do |writepage|
>    totalpages = $1
>    #totalpages.push($1)
>    #If the page count is odd, then, add a blank to make it an even  
> page
> count.
>    if (totalpages.to_i % 2) !=0 then
>     writepage << "\%\%Blank page from Asura\nshowpage\n"
>     totalpages = totalpages.to_i + 1.to_i
>    end
> end
> end
>  File.read(psfile).scan(/\%\%Page: [(\d)()]+
> (\d{1,5})\n\%\%PageBoundingBox:
>   \d{1,5} \d{1,5} \d{1,5} \d{1,5}\n\%\%PageOrientation:/) do
>   blankpages = $1
>   end
>    File.open(infofile + ".pageinfo", "w") do |writetext|
>     writetext << "Total number of pages in this PDF: #{totalpages}\n"
> <<\
>     "Number of blank pages in this PDF: \
> #{blankpages.length}\n" << "Blank Pages\              in This PDF:
> #{blankpages.join(' ')}\n"
> 			end
> end
>
>
> -- 
> Posted via http://www.ruby-forum.com/.
>

If you are going to File.read the whole file into memory anyway, I  
would do it once, make _all_ my modifications on the string and then  
write the whole string out.

e.g.

file_contents = File.read(psfile)

file_contents.scan(\%\%Pages: (\d{1,5})\n/) do
     if odd
       file_contents << blank_page
     end
end

file_contents.scan(/\%\%Page: [(\d)()]+
(\d{1,5})\n\%\%PageBoundingBox:
   \d{1,5} \d{1,5} \d{1,5} \d{1,5}\n\%\%PageOrientation:/) do
...
end

File.open(psfile, "w") { |f| f.print file_contents }