lib/princely.rb in princely-1.2.5 vs lib/princely.rb in princely-1.3.0
- old
+ new
@@ -14,26 +14,48 @@
# :type => 'application/pdf'
# )
#
$:.unshift(File.dirname(__FILE__))
require 'logger'
+require 'princely/rails' if defined?(Rails)
class Princely
- VERSION = "1.0.0" unless const_defined?("VERSION")
-
attr_accessor :exe_path, :style_sheets, :log_file, :logger
# Initialize method
#
- def initialize()
+ def initialize(options={})
# Finds where the application lives, so we can call it.
- @exe_path = `which prince`.chomp
+ @exe_path = options[:path] || find_prince_executable
raise "Cannot find prince command-line app in $PATH" if @exe_path.length == 0
- @style_sheets = ''
- @log_file = "#{RAILS_ROOT}/log/prince.log"
- @logger = RAILS_DEFAULT_LOGGER
+ raise "Cannot find prince command-line app at #{@exe_path}" if @exe_path && !File.executable?(@exe_path)
+ @style_sheets = ''
+ @log_file = options[:log_file]
+ @logger = options[:logger]
end
+
+ def logger
+ @logger ||= defined?(Rails) ? Rails.logger : StdoutLogger
+ end
+
+ def log_file
+ @log_file ||= defined?(Rails) ?
+ Rails.root.join("log/prince.log") :
+ File.expand_path(File.dirname(__FILE__) + "/log/prince.log")
+ end
+
+ def ruby_platform
+ RUBY_PLATFORM
+ end
+
+ def find_prince_executable
+ if ruby_platform =~ /mswin32/
+ "C:/Program Files/Prince/Engine/bin/prince"
+ else
+ `which prince`.chomp
+ end
+ end
# Sets stylesheets...
# Can pass in multiple paths for css files.
#
def add_style_sheets(*sheets)
@@ -45,11 +67,11 @@
# Returns fully formed executable path with any command line switches
# we've set based on our variables.
#
def exe_path
# Add any standard cmd line arguments we need to pass
- @exe_path << " --input=html --server --log=#{@log_file} "
+ @exe_path << " --input=html --server --log=#{log_file} "
@exe_path << @style_sheets
return @exe_path
end
# Makes a pdf from a passed in string.
@@ -72,18 +94,19 @@
pdf = IO.popen(path, "w+")
pdf.puts(string)
pdf.close_write
result = pdf.gets(nil)
pdf.close_read
+ result.force_encoding('BINARY') if RUBY_VERSION >= "1.9"
return result
end
def pdf_from_string_to_file(string, output_file)
path = self.exe_path()
# Don't spew errors to the standard out...and set up to take IO
# as input and output
- path << " --silent - -o #{output_file} >> #{@log_file} 2>> #{@log_file}"
+ path << " --silent - -o '#{output_file}' >> '#{log_file}' 2>> '#{log_file}'"
# Show the command used...
logger.info "\n\nPRINCE XML PDF COMMAND"
logger.info path
logger.info ''
@@ -91,6 +114,12 @@
# Actually call the prince command, and pass the entire data stream back.
pdf = IO.popen(path, "w+")
pdf.puts(string)
pdf.close
end
-end
\ No newline at end of file
+
+ class StdoutLogger
+ def self.info(msg)
+ puts msg
+ end
+ end
+end