libreconv 0.9.1 → 0.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.editorconfig +15 -0
- data/.gitignore +16 -20
- data/.rspec +3 -1
- data/.rubocop.yml +23 -0
- data/.travis.yml +10 -6
- data/Gemfile +2 -0
- data/README.md +24 -6
- data/Rakefile +4 -2
- data/lib/libreconv.rb +148 -35
- data/lib/libreconv/version.rb +3 -1
- data/libreconv.gemspec +22 -15
- metadata +58 -41
- data/spec/fixtures/doc.doc +0 -0
- data/spec/fixtures/docx.docx +0 -0
- data/spec/fixtures/ppt.ppt +0 -0
- data/spec/fixtures/pptx.pptx +0 -0
- data/spec/fixtures/soffice +0 -0
- data/spec/libreconv_spec.rb +0 -100
- data/spec/spec_helper.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5ae94a53817b7bd0f69b71501286d2ecef0f6e4fa698d6a73175fdd0b9c9c1db
|
4
|
+
data.tar.gz: 0af95f4eaafc34508dafa929de52f678fc4d227fe3de1ad6b53195c385ca9b47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53a3ac9d20908d5aecba062984c31461ccafc2defe9fb55432a77b540a24d6274e001b7107885b45eb77890ac7c2da5d0cfa0a2f075b820a36f2d3862e41f009
|
7
|
+
data.tar.gz: f3880d9db0000edbd39479b128b40a9f4357274ef05f75093bdd90bdda6220202d9e2313595c28059027f4b60e186aa277d32a3c6149031211dadd7d78ace707
|
data/.editorconfig
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Editor configuration, see https://editorconfig.org
|
2
|
+
root = true
|
3
|
+
|
4
|
+
[*]
|
5
|
+
charset = utf-8
|
6
|
+
indent_style = space
|
7
|
+
indent_size = 2
|
8
|
+
end_of_line = lf
|
9
|
+
insert_final_newline = true
|
10
|
+
max_line_length = 100
|
11
|
+
trim_trailing_whitespace = true
|
12
|
+
|
13
|
+
[*.md]
|
14
|
+
max_line_length = off
|
15
|
+
trim_trailing_whitespace = false
|
data/.gitignore
CHANGED
@@ -1,24 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
|
-
rdoc
|
14
|
-
spec/reports
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
.idea/
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/_yardoc/
|
4
|
+
/coverage/
|
5
|
+
/doc/
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/tmp/
|
19
9
|
|
20
|
-
|
10
|
+
# rspec failure tracking
|
11
|
+
.rspec_status
|
21
12
|
|
22
|
-
|
13
|
+
/Gemfile.lock
|
14
|
+
/.ruby-version
|
15
|
+
*.gem
|
16
|
+
/vendor/bundle
|
23
17
|
|
18
|
+
# Misc.
|
24
19
|
.DS_Store
|
20
|
+
/.idea/
|
data/.rspec
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require: rubocop-rspec
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
TargetRubyVersion: 2.3
|
5
|
+
|
6
|
+
Style/Documentation:
|
7
|
+
Enabled: false
|
8
|
+
|
9
|
+
Metrics/LineLength:
|
10
|
+
Max: 100
|
11
|
+
|
12
|
+
Style/PercentLiteralDelimiters:
|
13
|
+
PreferredDelimiters:
|
14
|
+
'%w': '[]'
|
15
|
+
|
16
|
+
Style/ExpandPathArguments:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Style/Encoding:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Layout/EndOfLine:
|
23
|
+
Enabled: false
|
data/.travis.yml
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
+
sudo: false
|
1
2
|
language: ruby
|
3
|
+
cache: bundler
|
2
4
|
rvm:
|
3
|
-
-
|
4
|
-
- 2.2
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
- 1.9.3
|
6
|
+
- 2.2
|
7
|
+
- 2.3
|
8
|
+
- 2.5
|
9
|
+
- jruby
|
8
10
|
before_install:
|
9
11
|
- sudo apt-get update -qq
|
10
|
-
- sudo apt-get install libreoffice
|
12
|
+
- sudo apt-get install libreoffice-core libreoffice-writer libreoffice-calc libreoffice-impress -y --no-install-recommends
|
13
|
+
before_script: bundle exec rubocop
|
14
|
+
script: bundle exec rake
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,15 +2,16 @@
|
|
2
2
|
|
3
3
|
Convert office documents using LibreOffice / OpenOffice to one of their supported formats.
|
4
4
|
|
5
|
-
[](https://travis-ci.org/ricn/libreconv)
|
5
|
+
[](https://travis-ci.org/FormAPI/libreconv)
|
7
6
|
[](http://badge.fury.io/rb/libreconv)
|
8
7
|
|
9
8
|
## Installation
|
10
9
|
|
11
10
|
Add this line to your application's Gemfile:
|
12
11
|
|
13
|
-
|
12
|
+
```ruby
|
13
|
+
gem 'libreconv'
|
14
|
+
```
|
14
15
|
|
15
16
|
And then execute:
|
16
17
|
|
@@ -22,7 +23,7 @@ Or install it yourself as:
|
|
22
23
|
|
23
24
|
## Usage
|
24
25
|
|
25
|
-
You need to install
|
26
|
+
You need to install LibreOffice or OpenOffice on your system to use this gem. The code has been tested with LibreOffice 6.1.3.
|
26
27
|
|
27
28
|
```ruby
|
28
29
|
require 'libreconv'
|
@@ -38,8 +39,11 @@ Libreconv.convert('document.docx', '/Users/ricn/pdf_documents')
|
|
38
39
|
# You can also convert a source file directly from an URL
|
39
40
|
Libreconv.convert('http://myserver.com/123/document.docx', '/Users/ricn/pdf_documents/doc.pdf')
|
40
41
|
|
42
|
+
# You cal pass a URL with GET params like this S3 example
|
43
|
+
Libreconv.convert('https://mybucket.s3.amazonaws.com/myserver/123/document.docx?X-Amz-Expires=456&X-Amz-Signature=abc', '/Users/ricn/pdf_documents/doc.pdf')
|
44
|
+
|
41
45
|
# Converts document.docx to document.pdf
|
42
|
-
# If you for some reason can't have soffice in your PATH you can
|
46
|
+
# If you for some reason can't have soffice in your PATH you can specify the file path to the soffice binary
|
43
47
|
Libreconv.convert('document.docx', '/Users/ricn/pdf_documents', '/Applications/LibreOffice.app/Contents/MacOS/soffice')
|
44
48
|
|
45
49
|
# Converts document.docx to my_document_as.html
|
@@ -47,19 +51,33 @@ Libreconv.convert('document.docx', '/Users/ricn/pdf_documents/my_document_as.htm
|
|
47
51
|
|
48
52
|
# Converts document.docx to my_document_as.pdf using writer_pdf_Export filter
|
49
53
|
Libreconv.convert('document.docx', '/Users/ricn/pdf_documents/my_document_as.pdf', nil, 'pdf:writer_pdf_Export')
|
50
|
-
|
51
54
|
```
|
52
55
|
|
56
|
+
## Development
|
57
|
+
|
58
|
+
After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle exec rake` to run the tests.
|
59
|
+
You can also run `irb -r bundler/setup -r libreconv` for an interactive prompt that will allow you to experiment.
|
60
|
+
|
61
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
62
|
+
|
53
63
|
## Credits
|
54
64
|
|
55
65
|
The following people have contributed ideas, documentation, or code to Libreconv:
|
56
66
|
|
57
67
|
* Richard Nyström
|
68
|
+
* Nathan Broadbent
|
58
69
|
|
59
70
|
## Contributing
|
60
71
|
|
72
|
+
* Install LibreOffice on Linux: `sudo apt-get install libreoffice`
|
73
|
+
* Install LibreOffice on Mac: `brew cask install libreoffice`
|
74
|
+
|
61
75
|
1. Fork it
|
62
76
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
63
77
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
64
78
|
4. Push to the branch (`git push origin my-new-feature`)
|
65
79
|
5. Create new Pull Request
|
80
|
+
|
81
|
+
## License
|
82
|
+
|
83
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
data/lib/libreconv.rb
CHANGED
@@ -1,68 +1,181 @@
|
|
1
|
-
|
2
|
-
require "uri"
|
3
|
-
require "net/http"
|
4
|
-
require "tmpdir"
|
5
|
-
require "spoon"
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
3
|
+
require 'libreconv/version'
|
4
|
+
require 'uri'
|
5
|
+
require 'net/http'
|
6
|
+
require 'tmpdir'
|
7
|
+
require 'securerandom'
|
8
|
+
require 'open3'
|
9
|
+
|
10
|
+
# Convert office documents using LibreOffice / OpenOffice to one of their supported formats.
|
7
11
|
module Libreconv
|
12
|
+
class ConversionFailedError < StandardError; end
|
8
13
|
|
14
|
+
# @param [String] source Path or URL of the source file.
|
15
|
+
# @param [String] target Target file path.
|
16
|
+
# @param [String] soffice_command Path to the soffice binary.
|
17
|
+
# @param [String] convert_to Format to convert to (default: 'pdf').
|
18
|
+
# @raise [IOError] If invalid source file/URL or soffice command not found.
|
19
|
+
# @raise [URI::Error] When URI parsing error.
|
20
|
+
# @raise [Net::ProtocolError] If source URL checking failed.
|
21
|
+
# @raise [ConversionFailedError] When soffice command execution error.
|
9
22
|
def self.convert(source, target, soffice_command = nil, convert_to = nil)
|
10
23
|
Converter.new(source, target, soffice_command, convert_to).convert
|
11
24
|
end
|
12
25
|
|
13
26
|
class Converter
|
27
|
+
# @return [String]
|
14
28
|
attr_accessor :soffice_command
|
15
29
|
|
30
|
+
# @param [String] source Path or URL of the source file.
|
31
|
+
# @param [String] target Target file path.
|
32
|
+
# @param [String] soffice_command Path to the soffice binary.
|
33
|
+
# @param [String] convert_to Format to convert to (default: 'pdf').
|
34
|
+
# @raise [IOError] If invalid source file/URL or soffice command not found.
|
35
|
+
# @raise [URI::Error] When URI parsing error.
|
36
|
+
# @raise [Net::ProtocolError] If source URL checking failed.
|
16
37
|
def initialize(source, target, soffice_command = nil, convert_to = nil)
|
17
|
-
@source = source
|
38
|
+
@source = check_source_type(source)
|
18
39
|
@target = target
|
19
|
-
@
|
20
|
-
@
|
21
|
-
|
22
|
-
|
23
|
-
check_source_type
|
24
|
-
|
25
|
-
unless @soffice_command && File.exists?(@soffice_command)
|
26
|
-
raise IOError, "Can't find Libreoffice or Openoffice executable."
|
27
|
-
end
|
40
|
+
@soffice_command = soffice_command || which('soffice') || which('soffice.bin')
|
41
|
+
@convert_to = convert_to || 'pdf'
|
42
|
+
|
43
|
+
ensure_soffice_exists
|
28
44
|
end
|
29
45
|
|
46
|
+
# @raise [ConversionFailedError] When soffice command execution error.
|
30
47
|
def convert
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
48
|
+
tmp_pipe_path = File.join(Dir.tmpdir, "soffice-pipe-#{SecureRandom.uuid}")
|
49
|
+
|
50
|
+
Dir.mktmpdir do |target_path|
|
51
|
+
command = build_command(tmp_pipe_path, target_path)
|
52
|
+
target_tmp_file = execute_command(command, target_path)
|
53
|
+
|
54
|
+
FileUtils.cp target_tmp_file, @target
|
55
|
+
end
|
56
|
+
ensure
|
57
|
+
FileUtils.rm_rf tmp_pipe_path if File.exist?(tmp_pipe_path)
|
38
58
|
end
|
39
59
|
|
40
60
|
private
|
41
61
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
62
|
+
# @param [Array<String>] command
|
63
|
+
# @param [String] target_path
|
64
|
+
# @return [String]
|
65
|
+
# @raise [ConversionFailedError] When soffice command execution error.
|
66
|
+
def execute_command(command, target_path)
|
67
|
+
output, error, status =
|
68
|
+
if RUBY_PLATFORM =~ /java/
|
69
|
+
Open3.capture3(*command)
|
70
|
+
else
|
71
|
+
Open3.capture3(command_env, *command, unsetenv_others: true)
|
72
|
+
end
|
73
|
+
|
74
|
+
target_tmp_file = File.join(target_path, target_filename)
|
75
|
+
return target_tmp_file if status.success? && File.exist?(target_tmp_file)
|
76
|
+
|
77
|
+
raise ConversionFailedError,
|
78
|
+
"Conversion failed! Output: #{output.strip.inspect}, Error: #{error.strip.inspect}"
|
79
|
+
end
|
80
|
+
|
81
|
+
# @return [Hash]
|
82
|
+
def command_env
|
83
|
+
Hash[%w[HOME PATH LANG LD_LIBRARY_PATH SYSTEMROOT TEMP].map { |k| [k, ENV[k]] }]
|
84
|
+
end
|
85
|
+
|
86
|
+
# @param [String] tmp_pipe_path
|
87
|
+
# @param [String] target_path
|
88
|
+
# @return [Array<String>]
|
89
|
+
def build_command(tmp_pipe_path, target_path)
|
90
|
+
[
|
91
|
+
soffice_command,
|
92
|
+
"--accept=\"pipe,name=#{File.basename(tmp_pipe_path)};url;StarOffice.ServiceManager\"",
|
93
|
+
"-env:UserInstallation=#{build_file_uri(tmp_pipe_path)}",
|
94
|
+
'--headless',
|
95
|
+
'--convert-to', @convert_to,
|
96
|
+
escaped_source,
|
97
|
+
'--outdir', target_path
|
98
|
+
]
|
99
|
+
end
|
100
|
+
|
101
|
+
# If the URL contains GET params, the '&' could break when being used as an argument to soffice.
|
102
|
+
# Wrap it in single quotes to escape it. Then strip them from the target temp file name.
|
103
|
+
# @return [String]
|
104
|
+
def escaped_source
|
105
|
+
# TODO: @source.is_a?(URI::Generic) ? "'#{@source}'" : @source
|
106
|
+
@source.to_s
|
107
|
+
end
|
108
|
+
|
109
|
+
# @return [String]
|
110
|
+
def escaped_source_path
|
111
|
+
@source.is_a?(URI::Generic) ? @source.path : @source
|
112
|
+
end
|
113
|
+
|
114
|
+
# @return [String]
|
115
|
+
def target_filename
|
116
|
+
File.basename(escaped_source_path, '.*') + '.' + File.basename(@convert_to, ':*')
|
47
117
|
end
|
48
118
|
|
119
|
+
# @raise [IOError] If soffice headless command line tool not found.
|
120
|
+
def ensure_soffice_exists
|
121
|
+
return if soffice_command && File.exist?(soffice_command)
|
122
|
+
|
123
|
+
raise IOError, 'Can\'t find LibreOffice or OpenOffice executable.'
|
124
|
+
end
|
125
|
+
|
126
|
+
# @param [String] cmd
|
127
|
+
# @return [String, nil]
|
49
128
|
def which(cmd)
|
50
129
|
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
130
|
+
|
51
131
|
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
52
132
|
exts.each do |ext|
|
53
|
-
exe = File.
|
133
|
+
exe = File.expand_path("#{cmd}#{ext}", path)
|
54
134
|
return exe if File.executable? exe
|
55
135
|
end
|
56
136
|
end
|
57
137
|
|
58
|
-
|
138
|
+
nil
|
59
139
|
end
|
60
140
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
141
|
+
# @param [String] source
|
142
|
+
# @return [String, URI::HTTP]
|
143
|
+
# @raise [IOError] If invalid source file/URL.
|
144
|
+
# @raise [URI::Error] When URI parsing error.
|
145
|
+
# @raise [Net::ProtocolError] If source URL checking failed.
|
146
|
+
def check_source_type(source)
|
147
|
+
if File.exist?(source)
|
148
|
+
return source unless File.directory?(source)
|
149
|
+
elsif (uri = check_valid_url(source))
|
150
|
+
return uri
|
151
|
+
end
|
152
|
+
|
153
|
+
raise IOError, "Source (#{source}) is neither a file nor a URL."
|
154
|
+
end
|
155
|
+
|
156
|
+
# @param [String] url
|
157
|
+
# @return [URI::HTTP, false, nil]
|
158
|
+
# @raise [URI::Error] When URI parsing error.
|
159
|
+
# @raise [Net::ProtocolError] If source URL checking failed.
|
160
|
+
def check_valid_url(url)
|
161
|
+
uri = URI(url)
|
162
|
+
return false unless uri.is_a?(URI::HTTP)
|
163
|
+
|
164
|
+
Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
165
|
+
response = http.head(uri.request_uri)
|
166
|
+
return check_valid_url(response['location']) if response.is_a?(Net::HTTPRedirection)
|
167
|
+
|
168
|
+
return response.is_a?(Net::HTTPSuccess) ? uri : nil
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# @param [String] path
|
173
|
+
# @return [String]
|
174
|
+
def build_file_uri(path)
|
175
|
+
separators = /[#{Regexp.quote "#{File::SEPARATOR}#{File::ALT_SEPARATOR}"}]/
|
176
|
+
unsafe = Regexp.new("[^#{URI::PATTERN::UNRESERVED}/?:]")
|
177
|
+
|
178
|
+
'file:///' + URI::DEFAULT_PARSER.escape(path.gsub(separators, '/').sub(%r{^/+}, ''), unsafe)
|
66
179
|
end
|
67
180
|
end
|
68
|
-
end
|
181
|
+
end
|
data/lib/libreconv/version.rb
CHANGED
data/libreconv.gemspec
CHANGED
@@ -1,24 +1,31 @@
|
|
1
|
-
#
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
lib = File.expand_path('../lib', __FILE__)
|
3
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
6
|
require 'libreconv/version'
|
5
7
|
|
6
8
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
9
|
+
spec.name = 'libreconv'
|
8
10
|
spec.version = Libreconv::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
|
12
|
-
spec.
|
13
|
-
spec.
|
14
|
-
spec.
|
11
|
+
spec.authors = ['Richard Nyström', 'Nathan Broadbent']
|
12
|
+
spec.email = ['nathan@formapi.io']
|
13
|
+
|
14
|
+
spec.description = 'Convert office documents to PDF using LibreOffice.'
|
15
|
+
spec.summary = 'Convert office documents to PDF.'
|
16
|
+
spec.homepage = 'https://github.com/FormAPI/libreconv'
|
17
|
+
spec.license = 'MIT'
|
15
18
|
|
16
|
-
spec.files =
|
19
|
+
spec.files = Dir.chdir(File.expand_path('../', __FILE__)) do
|
20
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
end
|
17
22
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
-
spec.
|
19
|
-
|
20
|
-
spec.
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
23
|
+
spec.require_paths = ['lib']
|
24
|
+
|
25
|
+
spec.add_development_dependency 'bundler', '>= 0'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'rspec', '~> 3.8'
|
28
|
+
spec.add_development_dependency 'rubocop'
|
29
|
+
spec.add_development_dependency 'rubocop-rspec'
|
30
|
+
spec.add_development_dependency 'webmock'
|
24
31
|
end
|
metadata
CHANGED
@@ -1,81 +1,112 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libreconv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Nyström
|
8
|
+
- Nathan Broadbent
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2019-10-28 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
+
name: bundler
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
|
-
- -
|
18
|
+
- - ">="
|
18
19
|
- !ruby/object:Gem::Version
|
19
20
|
version: '0'
|
20
|
-
type: :
|
21
|
+
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
|
-
- -
|
25
|
+
- - ">="
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
version: '0'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
+
name: rake
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- -
|
32
|
+
- - ">="
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '0'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- -
|
39
|
+
- - ">="
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '0'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
43
|
+
name: rspec
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '3.8'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '3.8'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rubocop
|
43
58
|
requirement: !ruby/object:Gem::Requirement
|
44
59
|
requirements:
|
45
|
-
- -
|
60
|
+
- - ">="
|
46
61
|
- !ruby/object:Gem::Version
|
47
62
|
version: '0'
|
48
63
|
type: :development
|
49
64
|
prerelease: false
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
52
|
-
- -
|
67
|
+
- - ">="
|
53
68
|
- !ruby/object:Gem::Version
|
54
69
|
version: '0'
|
55
70
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec
|
71
|
+
name: rubocop-rspec
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: webmock
|
57
86
|
requirement: !ruby/object:Gem::Requirement
|
58
87
|
requirements:
|
59
|
-
- -
|
88
|
+
- - ">="
|
60
89
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
90
|
+
version: '0'
|
62
91
|
type: :development
|
63
92
|
prerelease: false
|
64
93
|
version_requirements: !ruby/object:Gem::Requirement
|
65
94
|
requirements:
|
66
|
-
- -
|
95
|
+
- - ">="
|
67
96
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
-
description:
|
97
|
+
version: '0'
|
98
|
+
description: Convert office documents to PDF using LibreOffice.
|
70
99
|
email:
|
71
|
-
-
|
100
|
+
- nathan@formapi.io
|
72
101
|
executables: []
|
73
102
|
extensions: []
|
74
103
|
extra_rdoc_files: []
|
75
104
|
files:
|
76
|
-
- .
|
77
|
-
- .
|
78
|
-
- .
|
105
|
+
- ".editorconfig"
|
106
|
+
- ".gitignore"
|
107
|
+
- ".rspec"
|
108
|
+
- ".rubocop.yml"
|
109
|
+
- ".travis.yml"
|
79
110
|
- Gemfile
|
80
111
|
- LICENSE.txt
|
81
112
|
- README.md
|
@@ -83,14 +114,7 @@ files:
|
|
83
114
|
- lib/libreconv.rb
|
84
115
|
- lib/libreconv/version.rb
|
85
116
|
- libreconv.gemspec
|
86
|
-
|
87
|
-
- spec/fixtures/docx.docx
|
88
|
-
- spec/fixtures/ppt.ppt
|
89
|
-
- spec/fixtures/pptx.pptx
|
90
|
-
- spec/fixtures/soffice
|
91
|
-
- spec/libreconv_spec.rb
|
92
|
-
- spec/spec_helper.rb
|
93
|
-
homepage: https://github.com/ricn/libreconv
|
117
|
+
homepage: https://github.com/FormAPI/libreconv
|
94
118
|
licenses:
|
95
119
|
- MIT
|
96
120
|
metadata: {}
|
@@ -100,25 +124,18 @@ require_paths:
|
|
100
124
|
- lib
|
101
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
102
126
|
requirements:
|
103
|
-
- -
|
127
|
+
- - ">="
|
104
128
|
- !ruby/object:Gem::Version
|
105
129
|
version: '0'
|
106
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
131
|
requirements:
|
108
|
-
- -
|
132
|
+
- - ">="
|
109
133
|
- !ruby/object:Gem::Version
|
110
134
|
version: '0'
|
111
135
|
requirements: []
|
112
136
|
rubyforge_project:
|
113
|
-
rubygems_version: 2.
|
137
|
+
rubygems_version: 2.7.8
|
114
138
|
signing_key:
|
115
139
|
specification_version: 4
|
116
140
|
summary: Convert office documents to PDF.
|
117
|
-
test_files:
|
118
|
-
- spec/fixtures/doc.doc
|
119
|
-
- spec/fixtures/docx.docx
|
120
|
-
- spec/fixtures/ppt.ppt
|
121
|
-
- spec/fixtures/pptx.pptx
|
122
|
-
- spec/fixtures/soffice
|
123
|
-
- spec/libreconv_spec.rb
|
124
|
-
- spec/spec_helper.rb
|
141
|
+
test_files: []
|
data/spec/fixtures/doc.doc
DELETED
Binary file
|
data/spec/fixtures/docx.docx
DELETED
Binary file
|
data/spec/fixtures/ppt.ppt
DELETED
Binary file
|
data/spec/fixtures/pptx.pptx
DELETED
Binary file
|
data/spec/fixtures/soffice
DELETED
File without changes
|
data/spec/libreconv_spec.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe Libreconv do
|
5
|
-
|
6
|
-
before(:all) do
|
7
|
-
@docx_file = file_path("docx.docx")
|
8
|
-
@doc_file = file_path("doc.doc")
|
9
|
-
@pptx_file = file_path("pptx.pptx")
|
10
|
-
@ppt_file = file_path("ppt.ppt")
|
11
|
-
@target_path = "/tmp/libreconv"
|
12
|
-
@url = "http://s3.amazonaws.com/libreconv-test/docx.docx"
|
13
|
-
end
|
14
|
-
|
15
|
-
before(:each) do
|
16
|
-
FileUtils.mkdir_p @target_path
|
17
|
-
end
|
18
|
-
|
19
|
-
after(:each) do
|
20
|
-
FileUtils.rm_rf @target_path
|
21
|
-
end
|
22
|
-
|
23
|
-
describe Libreconv::Converter do
|
24
|
-
describe "#new" do
|
25
|
-
it "should raise error if soffice command does not exists" do
|
26
|
-
expect { Libreconv::Converter.new(@doc_file, "/target", "/Whatever/soffice") }.to raise_error(IOError)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should raise error if source does not exists" do
|
30
|
-
expect { Libreconv::Converter.new(file_path("nonsense.txt"), "/target") }.to raise_error(IOError)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "#convert" do
|
35
|
-
it "should convert a docx do pdf specifying target_file" do
|
36
|
-
target_file = "#{@target_path}/#{File.basename(@doc_file, ".doc")}.pdf"
|
37
|
-
converter = Libreconv::Converter.new(@doc_file, target_file)
|
38
|
-
converter.convert
|
39
|
-
expect(File.file?(target_file)).to eq true
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should convert a doc to pdf" do
|
43
|
-
target_file = "#{@target_path}/#{File.basename(@doc_file, ".doc")}.pdf"
|
44
|
-
converter = Libreconv::Converter.new(@doc_file, @target_path)
|
45
|
-
converter.convert
|
46
|
-
expect(File.file?(target_file)).to eq true
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should convert a docx to pdf" do
|
50
|
-
target_file = "#{@target_path}/#{File.basename(@docx_file, ".docx")}.pdf"
|
51
|
-
converter = Libreconv::Converter.new(@docx_file, @target_path)
|
52
|
-
converter.convert
|
53
|
-
expect(File.file?(target_file)).to eq true
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should convert a pptx to pdf" do
|
57
|
-
target_file = "#{@target_path}/#{File.basename(@pptx_file, ".pptx")}.pdf"
|
58
|
-
converter = Libreconv::Converter.new(@pptx_file, @target_path)
|
59
|
-
converter.convert
|
60
|
-
expect(File.file?(target_file)).to eq true
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should convert a ppt to pdf" do
|
64
|
-
target_file = "#{@target_path}/#{File.basename(@ppt_file, ".ppt")}.pdf"
|
65
|
-
converter = Libreconv::Converter.new(@ppt_file, @target_path)
|
66
|
-
converter.convert
|
67
|
-
expect(File.file?(target_file)).to eq true
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should convert a docx to pdf specifying an URL as source" do
|
71
|
-
target_file = "#{@target_path}/docx.pdf"
|
72
|
-
converter = Libreconv::Converter.new(@url, @target_path)
|
73
|
-
converter.convert
|
74
|
-
expect(File.file?(target_file)).to eq true
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "#soffice_command" do
|
79
|
-
it "should return the user specified command path" do
|
80
|
-
cmd = file_path("soffice") # just faking that the command is present here
|
81
|
-
converter = Libreconv::Converter.new(@doc_file, "/target", cmd)
|
82
|
-
expect(converter.soffice_command).to eq cmd
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should return the command found in path" do
|
86
|
-
cmd = `which soffice`.strip
|
87
|
-
converter = Libreconv::Converter.new(@doc_file, "/target")
|
88
|
-
expect(converter.soffice_command).to eq cmd
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe ".convert" do
|
93
|
-
it "should convert a file to pdf" do
|
94
|
-
target_file = "#{@target_path}/#{File.basename(@doc_file, ".doc")}.pdf"
|
95
|
-
Libreconv.convert(@doc_file, @target_path)
|
96
|
-
expect(File.file?(target_file)).to eq true
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'libreconv'
|
2
|
-
|
3
|
-
def file_path( *paths )
|
4
|
-
File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', *paths))
|
5
|
-
end
|
6
|
-
|
7
|
-
RSpec.configure do |config|
|
8
|
-
config.run_all_when_everything_filtered = true
|
9
|
-
config.filter_run :focus
|
10
|
-
|
11
|
-
config.order = 'random'
|
12
|
-
end
|