From 823ac010c5bc9468ce2326df55f282e4d7a7a923 Mon Sep 17 00:00:00 2001 From: Etienne Massip Date: Wed, 11 Jul 2012 00:14:56 +0000 Subject: [PATCH] File handling cleanup. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9973 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/plugins/rfpdf/lib/core/rmagick.rb | 7 +---- lib/plugins/rfpdf/lib/tcpdf.rb | 45 +++++++++++++++++---------- lib/redmine/export/pdf.rb | 3 +- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib/plugins/rfpdf/lib/core/rmagick.rb b/lib/plugins/rfpdf/lib/core/rmagick.rb index d561047ce..9311ade76 100644 --- a/lib/plugins/rfpdf/lib/core/rmagick.rb +++ b/lib/plugins/rfpdf/lib/core/rmagick.rb @@ -57,12 +57,7 @@ module RFPDF end out['bits'] = image.channel_depth - File.open( TCPDF.k_path_cache + File::basename(filename), 'w'){|f| - f.binmode - f.print image.to_blob - f.close - } - + out end diff --git a/lib/plugins/rfpdf/lib/tcpdf.rb b/lib/plugins/rfpdf/lib/tcpdf.rb index 158964709..be5bd1870 100755 --- a/lib/plugins/rfpdf/lib/tcpdf.rb +++ b/lib/plugins/rfpdf/lib/tcpdf.rb @@ -31,6 +31,9 @@ # #============================================================+ +require 'tempfile' +require 'core/rmagick' + # # TCPDF Class. # @package com.tecnick.tcpdf @@ -86,10 +89,10 @@ class TCPDF @@k_small_ratio = 2/3.0 cattr_accessor :k_path_cache - @@k_path_cache = Rails.root.join('tmp').to_s + @@k_path_cache = Rails.root.join('tmp') cattr_accessor :k_path_url_cache - @@k_path_url_cache = Rails.root.join('tmp').to_s + @@k_path_url_cache = Rails.root.join('tmp') cattr_accessor :decoder @@ -2060,16 +2063,12 @@ class TCPDF type.downcase! if (type == 'jpg' or type == 'jpeg') info=parsejpg(file); - elsif (type == 'png' or type == 'gif') - img = Magick::ImageList.new(file) - img.format = "PNG" # convert to PNG from gif - img.opacity = 0 # PNG alpha channel delete - open( @@k_path_cache + File::basename(file), 'w') do |f| - f.binmode - f.print img.to_blob - end - info=parsepng( @@k_path_cache + File::basename(file)); - File.delete( @@k_path_cache + File::basename(file)) + elsif (type == 'png') + info=parsepng(file); + elsif (type == 'gif') + tmpFile = imageToPNG(file); + info=parsepng(tmpFile.path); + tmpFile.delete else #Allow for additional formats mtd='parse' + type; @@ -2892,14 +2891,29 @@ class TCPDF #Read whole file data=''; - open( @@k_path_cache + File::basename(file),'rb') do |f| + open(file,'rb') do |f| data< a[0],'h' => a[1],'cs' => colspace,'bpc' => bpc,'f'=>'DCTDecode','data' => data} end + def imageToPNG(file) + return unless Object.const_defined?(:Magick) + + img = Magick::ImageList.new(file) + img.format = 'PNG' # convert to PNG from gif + img.opacity = 0 # PNG alpha channel delete + + #use a temporary file.... + tmpFile = Tempfile.new(['', '_' + File::basename(file) + '.png'], @@k_path_cache); + tmpFile.binmode + tmpFile.print img.to_blob + tmpFile + ensure + tmpFile.close + end + # # Extract info from a PNG file # @access protected @@ -3937,9 +3951,6 @@ class TCPDF rescue => err logger.error "pdf: Image: error: #{err.message}" Write(@lasth, attrs['src'], '', fill); - if File.file?( @@k_path_cache + File::basename(file)) - File.delete( @@k_path_cache + File::basename(file)) - end end end diff --git a/lib/redmine/export/pdf.rb b/lib/redmine/export/pdf.rb index 899411a53..e821c4e8a 100644 --- a/lib/redmine/export/pdf.rb +++ b/lib/redmine/export/pdf.rb @@ -22,7 +22,6 @@ require 'tcpdf' require 'fpdf/chinese' require 'fpdf/japanese' require 'fpdf/korean' -require 'core/rmagick' module Redmine module Export @@ -36,7 +35,7 @@ module Redmine attr_accessor :footer_date def initialize(lang) - @@k_path_cache = Rails.root.join('tmp', 'pdf').to_s + @@k_path_cache = Rails.root.join('tmp', 'pdf') FileUtils.mkdir_p @@k_path_cache unless File::exist?(@@k_path_cache) set_language_if_valid lang pdf_encoding = l(:general_pdf_encoding).upcase