Sha256: 498c9f05a0940a4d01dde727161cac8c1c878bb05df9ee17c0b5184c736e249d
Contents?: true
Size: 2 KB
Versions: 1
Compression:
Stored size: 2 KB
Contents
require "libreconv/version" require "uri" require "net/http" require "tmpdir" require "spoon" module Libreconv def self.convert(source, target, soffice_command = nil) Converter.new(source, target, soffice_command).convert end class Converter attr_accessor :soffice_command def initialize(source, target, soffice_command = nil) @source = source @target = target @target_path = Dir.tmpdir @soffice_command = soffice_command determine_soffice_command check_source_type unless @soffice_command && File.exists?(@soffice_command) raise IOError, "Can't find Libreoffice or Openoffice executable." end end def convert cmd = "#{@soffice_command} --headless --convert-to pdf #{@source} -outdir #{@target_path}" pid = Spoon.spawnp(@soffice_command, "--headless", "--convert-to", "pdf", @source, "-outdir", @target_path, ">", "/dev/null") Process.waitpid(pid) target_tmp_file = "#{@target_path}/#{File.basename(@source, ".*")}.pdf" FileUtils.cp target_tmp_file, @target end private def determine_soffice_command unless @soffice_command @soffice_command ||= which("soffice") @soffice_command ||= which("soffice.bin") end end def which(cmd) exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| exts.each do |ext| exe = File.join(path, "#{cmd}#{ext}") return exe if File.executable? exe end end return nil end def check_source_type is_file = File.exists?(@source) && !File.directory?(@source) is_http = URI(@source).scheme == "http" && Net::HTTP.get_response(URI(@source)).is_a?(Net::HTTPSuccess) is_https = URI(@source).scheme == "https" && Net::HTTP.get_response(URI(@source)).is_a?(Net::HTTPSuccess) raise IOError, "Source (#{@source}) is neither a file nor an URL." unless is_file || is_http || is_https end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
libreconv-0.8.0 | lib/libreconv.rb |