libis-format 1.3.3 → 2.0.0

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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +20 -0
  4. data/.travis.yml +70 -0
  5. data/Gemfile +0 -12
  6. data/README.md +2 -2
  7. data/Rakefile +8 -0
  8. data/base/Dockerfile +35 -0
  9. data/base/Dockerfile.alpine +20 -0
  10. data/base/Dockerfile.rvm +56 -0
  11. data/base/rework_path +20 -0
  12. data/bin/{pdf_tool → pdf_copy} +2 -3
  13. data/data/PDFA_def.ps +3 -3
  14. data/data/eciRGB_v2.icc +0 -0
  15. data/data/types.yml +4 -17
  16. data/docker_cfg.yml +1 -0
  17. data/lib/libis/format/cli/convert.rb +4 -4
  18. data/lib/libis/format/cli/prompt_helper.rb +24 -32
  19. data/lib/libis/format/command_line.rb +3 -2
  20. data/lib/libis/format/config.rb +23 -19
  21. data/lib/libis/format/converter/audio_converter.rb +31 -56
  22. data/lib/libis/format/converter/base.rb +36 -16
  23. data/lib/libis/format/converter/chain.rb +32 -52
  24. data/lib/libis/format/converter/fop_pdf_converter.rb +8 -4
  25. data/lib/libis/format/converter/image_assembler.rb +82 -0
  26. data/lib/libis/format/converter/image_converter.rb +40 -153
  27. data/lib/libis/format/converter/image_splitter.rb +80 -0
  28. data/lib/libis/format/converter/image_watermarker.rb +261 -0
  29. data/lib/libis/format/converter/jp2_converter.rb +38 -36
  30. data/lib/libis/format/converter/office_converter.rb +28 -22
  31. data/lib/libis/format/converter/pdf_assembler.rb +66 -0
  32. data/lib/libis/format/converter/pdf_converter.rb +52 -200
  33. data/lib/libis/format/converter/pdf_optimizer.rb +70 -0
  34. data/lib/libis/format/converter/pdf_splitter.rb +65 -0
  35. data/lib/libis/format/converter/pdf_watermarker.rb +110 -0
  36. data/lib/libis/format/converter/repository.rb +13 -7
  37. data/lib/libis/format/converter/spreadsheet_converter.rb +16 -10
  38. data/lib/libis/format/converter/video_converter.rb +58 -47
  39. data/lib/libis/format/converter/xslt_converter.rb +11 -13
  40. data/lib/libis/format/converter.rb +1 -1
  41. data/lib/libis/format/identifier.rb +46 -44
  42. data/lib/libis/format/info.rb +27 -0
  43. data/lib/libis/format/library.rb +147 -0
  44. data/lib/libis/format/tool/droid.rb +30 -29
  45. data/lib/libis/format/tool/extension_identification.rb +26 -24
  46. data/lib/libis/format/tool/{ff_mpeg.rb → ffmpeg.rb} +10 -17
  47. data/lib/libis/format/tool/fido.rb +27 -22
  48. data/lib/libis/format/tool/file_tool.rb +24 -11
  49. data/lib/libis/format/tool/fop_pdf.rb +14 -25
  50. data/lib/libis/format/tool/identification_tool.rb +40 -38
  51. data/lib/libis/format/tool/office_to_pdf.rb +18 -30
  52. data/lib/libis/format/tool/pdf_copy.rb +47 -0
  53. data/lib/libis/format/tool/pdf_merge.rb +19 -25
  54. data/lib/libis/format/tool/pdf_optimizer.rb +19 -22
  55. data/lib/libis/format/tool/pdf_split.rb +33 -6
  56. data/lib/libis/format/tool/pdf_to_pdfa.rb +31 -45
  57. data/lib/libis/format/tool/pdfa_validator.rb +30 -24
  58. data/lib/libis/format/tool/spreadsheet_to_ods.rb +18 -29
  59. data/lib/libis/format/tool.rb +3 -4
  60. data/lib/libis/format/version.rb +1 -3
  61. data/lib/libis/format/yaml_loader.rb +71 -0
  62. data/lib/libis/format.rb +7 -5
  63. data/lib/libis-format.rb +0 -2
  64. data/libis-format.gemspec +18 -24
  65. data/tools/PdfTool.jar +0 -0
  66. data/tools/pdfbox/pdfbox-app-2.0.13.jar +0 -0
  67. data/tools/pdfbox/{preflight-app-3.0.3.jar → preflight-app-2.0.13.jar} +0 -0
  68. metadata +83 -125
  69. data/data/AdobeRGB1998.icc +0 -0
  70. data/lib/libis/format/converter/email_converter.rb +0 -35
  71. data/lib/libis/format/tool/msg_to_pdf.rb +0 -270
  72. data/lib/libis/format/tool/pdf_tool.rb +0 -52
  73. data/lib/libis/format/type_database.rb +0 -156
  74. data/lib/libis/format/type_database_impl.rb +0 -153
  75. data/tools/pdf2pdfa +0 -395
  76. data/tools/pdfbox/pdfbox-app-3.0.3.jar +0 -0
  77. /data/bin/{droid_tool → droid} +0 -0
  78. /data/bin/{fido_tool → fido} +0 -0
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'libis/tools/extend/string'
4
2
  require 'libis/tools/command'
5
3
 
@@ -11,33 +9,36 @@ require_relative 'identification_tool'
11
9
  module Libis
12
10
  module Format
13
11
  module Tool
12
+
14
13
  class Fido < Libis::Format::Tool::IdentificationTool
14
+
15
15
  def self.add_formats(formats_file)
16
- instance.formats << formats_file unless instance.formats.include?(formats_file)
16
+ self.instance.formats << formats_file unless self.instance.formats.include?(formats_file)
17
17
  end
18
18
 
19
19
  def self.del_formats(formats_file)
20
- instance.formats.delete(formats_file)
20
+ self.instance.formats.delete(formats_file)
21
21
  end
22
22
 
23
23
  attr_reader :formats
24
24
 
25
- def run_list(filelist, **options)
25
+ def run_list(filelist, options = {})
26
26
  create_list_file(filelist) do |list_file|
27
- output = runner(nil, '-input', list_file.escape_for_string, **options)
27
+ output = runner(nil, '-input', list_file.escape_for_string, options)
28
28
  process_output(output)
29
29
  end
30
30
  end
31
31
 
32
- def run_dir(dir, recursive = true, **options)
32
+ def run_dir(dir, recursive = true, options = {})
33
33
  args = []
34
34
  args << '-recurse' if recursive
35
- output = runner(dir, *args, **options)
35
+ args << options
36
+ output = runner(dir, *args)
36
37
  process_output(output)
37
38
  end
38
39
 
39
- def run(file, **options)
40
- output = runner(file, **options)
40
+ def run(file, options = {})
41
+ output = runner(file, options)
41
42
  process_output(output)
42
43
  end
43
44
 
@@ -52,9 +53,11 @@ module Libis
52
53
 
53
54
  attr_writer :formats
54
55
 
55
- def runner(filename, *args, **options)
56
- # Load custom format definitions if present
57
- args << '-loadformats' << formats.join(',').to_s unless formats.empty?
56
+ def runner(filename, *args)
57
+ options = {}
58
+ options = args.pop if args.last.is_a?(Hash)
59
+ # Load custome format definitions if present
60
+ args << '-loadformats' << "#{formats.join(',')}" unless formats.empty?
58
61
 
59
62
  # Workaround for Fido performance bug
60
63
  args << '-bufsize' << (options[:bufsize] || 1000).to_s
@@ -65,7 +68,7 @@ module Libis
65
68
  args << '-nocontainer' if options[:nocontainer]
66
69
 
67
70
  # Add filename to argument list (optional)
68
- args << filename.escape_for_string.to_s if filename
71
+ args << "#{filename.escape_for_string}" if filename
69
72
 
70
73
  # No header output
71
74
  args << '-q'
@@ -73,20 +76,20 @@ module Libis
73
76
  # Run command and capture results
74
77
  timeout = Libis::Format::Config[:timeouts][:fido]
75
78
  result = ::Libis::Tools::Command.run(
76
- Libis::Format::Config[:fido_cmd], *args,
77
- timeout:,
78
- kill_after: timeout * 2
79
+ Libis::Format::Config[:fido_cmd], *args,
80
+ timeout: timeout,
81
+ kill_after: timeout * 2
79
82
  )
80
83
 
81
84
  # Log warning if needed
82
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
83
- raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status])&.zero? && result[:err].empty?
85
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
86
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
84
87
 
85
88
  # Parse output (CSV) text into array and return result
86
- keys = %i[status time puid format_name format_version filesize filepath mimetype matchtype]
89
+ keys = [:status, :time, :puid, :format_name, :format_version, :filesize, :filepath, :mimetype, :matchtype]
87
90
  data = CSV.parse(result[:out].join("\n"))
88
- .map { |a| Hash[keys.zip(a)] }
89
- .select { |a| a[:status] == 'OK' }
91
+ .map {|a| Hash[keys.zip(a)]}
92
+ .select {|a| a[:status] == 'OK'}
90
93
  data.each do |r|
91
94
  r.delete(:time)
92
95
  r.delete(:status)
@@ -94,7 +97,9 @@ module Libis
94
97
  r[:tool] = :fido
95
98
  end
96
99
  end
100
+
97
101
  end
102
+
98
103
  end
99
104
  end
100
105
  end
@@ -1,38 +1,49 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'identification_tool'
4
2
 
5
3
  module Libis
6
4
  module Format
7
5
  module Tool
6
+
8
7
  class FileTool < Libis::Format::Tool::IdentificationTool
9
- def run_list(filelist, **_options)
8
+
9
+ def run_list(filelist, _options = {})
10
+
10
11
  create_list_file(filelist) do |list_file|
12
+
11
13
  output = runner(nil, '--files-from', list_file)
12
14
 
13
15
  process_output(output)
16
+
14
17
  end
18
+
15
19
  end
16
20
 
17
- def run_dir(dir, recursive = true, **_options)
21
+ def run_dir(dir, recursive = true, _options = {})
22
+
18
23
  filelist = find_files(dir, recursive)
19
24
 
20
25
  create_list_file(filelist) do |list_file|
26
+
21
27
  output = runner(nil, '--files-from', list_file)
22
28
 
23
29
  process_output(output)
30
+
24
31
  end
32
+
25
33
  end
26
34
 
27
- def run(file, **_options)
35
+ def run(file, _options = {})
36
+
28
37
  output = runner(file)
29
38
 
30
39
  process_output(output)
40
+
31
41
  end
32
42
 
33
43
  protected
34
44
 
35
45
  def runner(filename, *args)
46
+
36
47
  # Create new argument list
37
48
  opts = []
38
49
 
@@ -50,21 +61,23 @@ module Libis
50
61
  # Run the UNIX file command and capture the results
51
62
  timeout = Libis::Format::Config[:timeouts][:file_tool]
52
63
  result = ::Libis::Tools::Command.run(
53
- 'file', *opts,
54
- timeout:,
55
- kill_after: timeout * 2
64
+ 'file', *opts,
65
+ timeout: timeout,
66
+ kill_after: timeout * 2
56
67
  )
57
68
 
58
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
59
- raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status]).zero? && result[:err].empty?
69
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
70
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
60
71
 
61
72
  # Parse output text into array and return result
62
73
  result[:out].map do |line|
63
74
  r = line.split(/:\s+/)
64
- { filepath: r[0], mimetype: r[1], matchtype: 'magic', tool: :file }
75
+ {filepath: r[0], mimetype: r[1], matchtype: 'magic', tool: :file}
65
76
  end
66
77
  end
78
+
67
79
  end
80
+
68
81
  end
69
82
  end
70
83
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'os'
4
2
 
5
3
  require 'libis/tools/extend/string'
@@ -11,46 +9,37 @@ require 'libis/format/config'
11
9
  module Libis
12
10
  module Format
13
11
  module Tool
12
+
14
13
  class FopPdf
15
14
  include ::Libis::Tools::Logger
16
15
 
17
- def self.installed?
18
- result = Libis::Tools::Command.run(Libis::Format::Config[:java_cmd], '-version')
19
- return false unless (result[:status]).zero?
20
-
21
- File.exist?(Libis::Format::Config[:fop_jar])
16
+ def self.run(xml, target, options = [])
17
+ self.new.run xml, target, options
22
18
  end
23
19
 
24
- def self.run(xml, target)
25
- new.run xml, target
26
- end
20
+ def run(xml, target, options = [])
27
21
 
28
- def run(xml, target)
29
22
  if OS.java?
30
23
  # TODO: import library and execute in current VM. For now do exactly as in MRI.
31
24
  end
32
25
 
33
26
  timeout = Libis::Format::Config[:timeouts][:fop]
34
27
  result = Libis::Tools::Command.run(
35
- Libis::Format::Config[:java_cmd],
36
- "-Dfop.home=#{File.dirname(Libis::Format::Config[:fop_jar])}",
37
- '-Djava.awt.headless=true',
38
- '-jar', Libis::Format::Config[:fop_jar],
39
- '-fo', xml,
40
- '-pdf', target,
41
- timeout:,
42
- kill_after: timeout * 2
28
+ Libis::Format::Config[:java_cmd],
29
+ "-Dfop.home=#{File.dirname(Libis::Format::Config[:fop_jar])}",
30
+ '-jar', Libis::Format::Config[:fop_jar],
31
+ '-fo', xml,
32
+ '-pdf', target,
33
+ timeout: timeout,
34
+ kill_after: timeout * 2
43
35
  )
44
36
 
45
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
46
- raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status]).zero?
37
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
38
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0
47
39
 
48
- {
49
- command: result,
50
- files: [target]
51
- }
52
40
  end
53
41
  end
42
+
54
43
  end
55
44
  end
56
45
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'csv'
4
2
  require 'tmpdir'
5
3
 
@@ -9,46 +7,47 @@ require 'libis/tools/logger'
9
7
  require 'libis/tools/command'
10
8
 
11
9
  require 'libis/format/config'
12
- require 'libis/format/type_database'
10
+ require 'libis/format/library'
13
11
 
14
12
  module Libis
15
13
  module Format
16
14
  module Tool
17
- class IdentificationTool
15
+
16
+ class IdentificationTool
18
17
  include Singleton
19
18
  include ::Libis::Tools::Logger
20
19
 
21
20
  def self.bad_mimetype(mimetype)
22
- instance.bad_mimetype(mimetype)
21
+ self.instance.bad_mimetype(mimetype)
23
22
  end
24
23
 
25
- def self.run(file, recursive = false, **options)
24
+ def self.run(file, recursive = false, options = {})
25
+ options ||= {}
26
26
  if file.is_a?(Array)
27
- return run_list file, **options
28
- elsif file.is_a?(String) && File.exist?(file) && File.readable?(file)
27
+ return run_list file, options
28
+ elsif file.is_a?(String) && File.exists?(file) && File.readable?(file)
29
29
  if File.directory?(file)
30
- return run_dir(file, recursive, **options)
30
+ return run_dir(file, recursive, options)
31
31
  elsif File.file?(file)
32
- return instance.run(file, **options)
32
+ return self.instance.run(file, options)
33
33
  end
34
34
  end
35
-
36
35
  raise ArgumentError,
37
36
  'IdentificationTool: file argument should be a path to an existing file or directory or a list of those'
38
37
  end
39
38
 
40
- def self.run_dir(file, recursive = true, **options)
41
- instance.run_dir file, recursive, **options
39
+ def self.run_dir(file, recursive = true, options = {})
40
+ self.instance.run_dir file, recursive, options
42
41
  end
43
42
 
44
- def self.run_list(filelist, **options)
45
- instance.run_list filelist, **options
43
+ def self.run_list(filelist , options = {})
44
+ self.instance.run_list filelist, options
46
45
  end
47
46
 
48
47
  protected
49
48
 
50
49
  def create_list_file(filelist)
51
- list_file = Tempfile.new(%w[file .list])
50
+ list_file = Tempfile.new(%w'file .list')
52
51
  filelist.each do |fname|
53
52
  list_file.write "#{fname}\n"
54
53
  end
@@ -84,22 +83,23 @@ module Libis
84
83
  # { mimetype: <mimetype>, puid: <puid>, matchtype: <matchtype>, score: <score>, ...}
85
84
  #
86
85
  def process_output(output)
87
- output.each_with_object({}) do |x, results|
86
+ output.reduce({}) do |results, x|
88
87
  filepath = File.absolute_path(x.delete(:filepath)).freeze
89
88
  results[filepath] ||= []
90
89
  results[filepath] << annotate(x)
90
+ results
91
91
  end
92
92
  end
93
93
 
94
94
  # Enhance the output with mimetype and score
95
95
  def annotate(result)
96
96
  # Enhance result with mimetype if needed
97
- bad_mimetypes.include?(result[:mimetype]) &&
98
- !bad_puids.include?(result[:puid]) &&
97
+ if bad_mimetypes.include?(result[:mimetype]) && !bad_puids.include?(result[:puid])
99
98
  result[:mimetype] = get_mimetype(result[:puid])
99
+ end
100
100
 
101
101
  # Normalize the mimetype
102
- Libis::Format::TypeDatabase.normalize(result, PUID: :puid, MIME: :mimetype)
102
+ Libis::Format::Library.normalize(result)
103
103
 
104
104
  # Default score is 5
105
105
  result[:score] = 5
@@ -108,54 +108,55 @@ module Libis
108
108
  result[:score] = 1 if bad_mimetypes.include? result[:mimetype]
109
109
 
110
110
  # freeze all strings
111
- result.each { |_, v| v.freeze if v.is_a?(String) }
111
+ result.each {|_, v| v.freeze if v.is_a?(String)}
112
112
 
113
113
  # Adapt score based on matchtype
114
114
  result[:matchtype] = result[:matchtype].to_s.downcase
115
115
  case result[:matchtype]
116
116
 
117
117
  # Signature match increases score with 2
118
- when 'signature'
119
- result[:score] += 2
120
- # typeinfo = ::Libis::Format::TypeDatabase.puid_typeinfo(result[:puid])
118
+ when 'signature'
119
+ result[:score] += 2
120
+ # typeinfo = ::Libis::Format::Library.get_info_by(:puid, result[:puid])
121
121
  # ext = File.extname(result[:filename])
122
122
  # result[:score] += 1 if typeinfo and typeinfo[:EXTENSIONS].include?(ext)
123
123
 
124
124
  # Container match increases score with 4
125
- when 'container'
126
- result[:score] += 4
127
- # typeinfo = ::Libis::Format::TypeDatabase.puid_typeinfo(result[:puid])
125
+ when 'container'
126
+ result[:score] += 4
127
+ # typeinfo = ::Libis::Format::Library.get_info_by(:puid, result[:puid])
128
128
  # ext = File.extname(result[:filename])
129
129
  # result[:score] += 1 if typeinfo and typeinfo[:EXTENSIONS].include?(ext)
130
130
 
131
131
  # Extension match is the weakest identification; score is lowered by 2 points
132
- when 'extension'
133
- result[:score] -= 2
132
+ when 'extension'
133
+ result[:score] -= 2
134
134
 
135
135
  # Magic code (file tool) is to be trused even less
136
- when 'magic'
137
- result[:score] -= 3
136
+ when 'magic'
137
+ result[:score] -= 3
138
138
 
139
+ # Or no change otherwise
140
+ else
141
+ # do nothing
139
142
  end
140
143
 
141
144
  # Detecting a zip file should decrease the score as it may hide one of the many zip-based formats (e.g. epub,
142
145
  # Office OpenXML, OpenDocument, jar, maff, svx)
143
- result[:score] -= 2 if result[:mimetype] == 'application/zip'
146
+ if result[:mimetype] == 'application/zip'
147
+ result[:score] -= 2
148
+ end
144
149
 
145
150
  # Return result enhanced with mimetype and score fields
146
151
  result
147
152
  end
148
153
 
149
154
  def get_mimetype(puid)
150
- ::Libis::Format::TypeDatabase.puid_typeinfo(puid)[:MIME].first
151
- rescue StandardError
152
- nil
155
+ ::Libis::Format::Library.get_field_by(:puid, puid, :mimetype) rescue nil
153
156
  end
154
157
 
155
158
  def get_puid(mimetype)
156
- ::Libis::Format::TypeDatabase.mime_infos(mimetype).first[:PUID].first
157
- rescue StandardError
158
- nil
159
+ ::Libis::Format::Library.get_field_by(:mimetype, mimetype, :puid) rescue nil
159
160
  end
160
161
 
161
162
  attr_accessor :bad_mimetypes, :bad_puids
@@ -169,6 +170,7 @@ module Libis
169
170
  @bad_mimetypes << mimetype
170
171
  end
171
172
  end
173
+
172
174
  end
173
175
  end
174
176
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'fileutils'
4
2
 
5
3
  require 'libis/tools/extend/string'
@@ -11,61 +9,51 @@ require 'libis/format/config'
11
9
  module Libis
12
10
  module Format
13
11
  module Tool
12
+
14
13
  class OfficeToPdf
15
14
  include ::Libis::Tools::Logger
16
15
 
17
- def self.installed?
18
- result = Libis::Tools::Command.run(Libis::Format::Config[:soffice_cmd], '--version')
19
- (result[:status]).zero?
20
- end
21
-
22
- def self.run(source, target, **options)
23
- new.run source, target, **options
16
+ def self.run(source, target, options = {})
17
+ self.new.run source, target, options
24
18
  end
25
19
 
26
- def run(source, target, **options)
20
+ def run(source, target, options = {})
27
21
  workdir = '/...'
28
22
  workdir = Dir.tmpdir unless Dir.exist? workdir
29
23
 
30
- workdir = File.join(workdir, rand(1_000_000).to_s)
24
+ workdir = File.join(workdir, rand(1000000).to_s)
31
25
  FileUtils.mkpath(workdir)
32
26
 
33
27
  src_file = File.join(workdir, File.basename(source))
34
28
  FileUtils.symlink source, src_file
35
29
 
36
- tgt_file = File.join(workdir, "#{File.basename(source, '.*')}.pdf")
30
+ tgt_file = File.join(workdir, File.basename(source, '.*') + '.pdf')
37
31
 
38
32
  export_filter = options[:export_filter] || 'pdf'
39
33
 
40
34
  timeout = Libis::Format::Config[:timeouts][:office_to_pdf]
41
35
  result = Libis::Tools::Command.run(
42
- Libis::Format::Config[:soffice_cmd], '--headless',
43
- "-env:UserInstallation=file://#{workdir}",
44
- '--convert-to', export_filter,
45
- '--outdir', workdir, src_file,
46
- timeout:,
47
- kill_after: timeout * 2
36
+ Libis::Format::Config[:soffice_cmd], '--headless',
37
+ "-env:UserInstallation=file://#{workdir}",
38
+ '--convert-to', export_filter,
39
+ '--outdir', workdir, src_file,
40
+ timeout: timeout,
41
+ kill_after: timeout * 2
48
42
  )
49
43
 
50
- raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
51
-
44
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
52
45
  warn "OfficeToPdf conversion messages: \n\t#{result[:err].join("\n\t")}" unless result[:err].empty?
53
- raise "#{self.class} failed to generate target file #{tgt_file}" unless File.exist?(tgt_file)
46
+ raise RuntimeError, "#{self.class} failed to generate target file #{tgt_file}" unless File.exist?(tgt_file)
54
47
 
55
48
  FileUtils.copy tgt_file, target, preserve: true
56
49
 
57
- {
58
- command: result,
59
- files: [target]
60
- }
61
50
  ensure
62
- begin
63
- FileUtils.rmtree workdir
64
- rescue StandardError
65
- nil
66
- end
51
+ FileUtils.rmtree workdir rescue nil
52
+
53
+ result[:out]
67
54
  end
68
55
  end
56
+
69
57
  end
70
58
  end
71
59
  end
@@ -0,0 +1,47 @@
1
+ require 'os'
2
+
3
+ require 'libis/tools/extend/string'
4
+ require 'libis/tools/logger'
5
+ require 'libis/tools/command'
6
+
7
+ require 'libis/format/config'
8
+
9
+ module Libis
10
+ module Format
11
+ module Tool
12
+
13
+ class PdfCopy
14
+ include ::Libis::Tools::Logger
15
+
16
+ def self.run(source, target, options = [])
17
+ self.new.run source, target, options
18
+ end
19
+
20
+ def run(source, target, options = [])
21
+
22
+ if OS.java?
23
+ # TODO: import library and execute in current VM. For now do exactly as in MRI.
24
+ end
25
+
26
+ timeout = Libis::Format::Config[:timeouts][:pdf_copy]
27
+ result = Libis::Tools::Command.run(
28
+ Libis::Format::Config[:java_cmd],
29
+ '-cp', Libis::Format::Config[:pdf_tool],
30
+ 'CopyPdf',
31
+ '--file_input', source,
32
+ '--file_output', target,
33
+ *options,
34
+ timeout: timeout,
35
+ kill_after: timeout * 2
36
+ )
37
+
38
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
39
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
40
+
41
+ result
42
+ end
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'os'
4
2
 
5
3
  require 'libis/tools/extend/string'
@@ -11,44 +9,40 @@ require 'libis/format/config'
11
9
  module Libis
12
10
  module Format
13
11
  module Tool
12
+
14
13
  class PdfMerge
15
14
  include ::Libis::Tools::Logger
16
15
 
17
- def self.installed?
18
- result = Libis::Tools::Command.run(Libis::Format::Config[:java_cmd], '-version')
19
- return false unless (result[:status]).zero?
20
-
21
- File.exist?(Libis::Format::Config[:pdf_tool])
22
- end
23
-
24
- def self.run(source, target, *options)
25
- new.run source, target, options
16
+ def self.run(source, target, options = [])
17
+ self.new.run source, target, options
26
18
  end
27
19
 
28
- def run(source, target, *options)
20
+ def run(source, target, options = [])
29
21
  source = [source] unless source.is_a?(Array)
30
22
 
31
23
  if OS.java?
32
24
  # TODO: import library and execute in current VM. For now do exactly as in MRI.
33
25
  end
34
26
 
35
- timeout = Libis::Format::Config[:timeouts][:pdf_tool]
36
- args = [
37
- Libis::Format::Config[:java_cmd],
38
- '-jar', Libis::Format::Config[:pdf_tool],
39
- 'merge',
40
- '-o', target,
41
- options,
42
- source
43
- ].flatten
44
-
45
- result = Libis::Tools::Command.run(*args, timeout: , kill_after: timeout * 2)
46
-
47
- result[:err] << "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
27
+ timeout = Libis::Format::Config[:timeouts][:pdf_merge]
28
+ result = Libis::Tools::Command.run(
29
+ Libis::Format::Config[:java_cmd],
30
+ '-cp', Libis::Format::Config[:pdf_tool],
31
+ 'MergePdf',
32
+ '--file_output', target,
33
+ *options,
34
+ *source,
35
+ timeout: timeout,
36
+ kill_after: timeout * 2
37
+ )
38
+
39
+ raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
40
+ raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
48
41
 
49
42
  result
50
43
  end
51
44
  end
45
+
52
46
  end
53
47
  end
54
48
  end