libis-format 1.0.8 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +2 -0
  4. data/data/AdobeRGB1998.icc +0 -0
  5. data/data/PDFA_def.ps +3 -3
  6. data/lib/libis/format/config.rb +1 -1
  7. data/lib/libis/format/converter/audio_converter.rb +6 -8
  8. data/lib/libis/format/converter/chain.rb +16 -4
  9. data/lib/libis/format/converter/email_converter.rb +2 -4
  10. data/lib/libis/format/converter/fop_pdf_converter.rb +0 -2
  11. data/lib/libis/format/converter/image_converter.rb +5 -3
  12. data/lib/libis/format/converter/jp2_converter.rb +3 -3
  13. data/lib/libis/format/converter/office_converter.rb +1 -3
  14. data/lib/libis/format/converter/pdf_converter.rb +13 -4
  15. data/lib/libis/format/converter/spreadsheet_converter.rb +1 -3
  16. data/lib/libis/format/converter/video_converter.rb +5 -2
  17. data/lib/libis/format/converter/xslt_converter.rb +15 -14
  18. data/lib/libis/format/tool/email_to_pdf.rb +52 -17
  19. data/lib/libis/format/tool/{ffmpeg.rb → ff_mpeg.rb} +10 -1
  20. data/lib/libis/format/tool/fop_pdf.rb +12 -0
  21. data/lib/libis/format/tool/office_to_pdf.rb +10 -1
  22. data/lib/libis/format/tool/pdf_copy.rb +11 -1
  23. data/lib/libis/format/tool/pdf_merge.rb +11 -1
  24. data/lib/libis/format/tool/pdf_optimizer.rb +11 -2
  25. data/lib/libis/format/tool/pdf_split.rb +11 -1
  26. data/lib/libis/format/tool/pdf_to_pdfa.rb +59 -43
  27. data/lib/libis/format/tool/pdfa_validator.rb +28 -35
  28. data/lib/libis/format/tool/spreadsheet_to_ods.rb +10 -1
  29. data/lib/libis/format/tool.rb +1 -1
  30. data/lib/libis/format/version.rb +1 -1
  31. data/libis-format.gemspec +2 -0
  32. data/tools/emailconverter.jar +0 -0
  33. data/tools/pdf2pdfa +395 -0
  34. metadata +20 -4
  35. data/data/eciRGB_v2.icc +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b4de569e2d7055cf0d08602b481e3e7e2eb981a3dfc81968b2ebb19239244ffb
4
- data.tar.gz: 402ec6e4ab234d75e8dadc3bf862398cb81dd7563d7c316279aad82f098ab3e4
3
+ metadata.gz: c8f2304a5f189140ad867cb1d7d9d41f280f796992c84514316b7e584628a64b
4
+ data.tar.gz: ee097826d8e73fa7fa72167b4a3eaebef5992bba8fd78a6e0d454fe552730d6c
5
5
  SHA512:
6
- metadata.gz: 38bb64081e41ca8abe3e43b26610989162f5b6cc9f3f4e0123d524d5519dbb879dd0a1634920ceb78690cd06ee81dc8bfdf8a7cf0e6719832f399c716d8a4c7c
7
- data.tar.gz: 70c249c6b0814614e7408bb9fa7b448af8db3ea54bda3028f7a49ac79987e254b309a53effa3334713e3e853c09942809bb26d2b4ee09e79823ee50c88661c12
6
+ metadata.gz: 9fdb85d3847ba3ed08c96cc409b5e7f2c471d80edf61ab6581b28cb46380e1b48e8c65daf182717dd35cf216d91e50f1680d31a352d9aab557d54f7f3af61dc8
7
+ data.tar.gz: 0d8d4f7c29c0fa5da26a85eb82554796cb1ac18f98e00e3f1e700bd4eb79f647b8311f56e2eb7a46cc1679a2809fc140b1cc702856da1baacafd5127a65ea66f
data/.gitignore CHANGED
@@ -18,3 +18,4 @@ mkmf.log
18
18
  *.pyc
19
19
  tools/pdf/
20
20
  /test*
21
+ .rake_tasks~
data/Gemfile CHANGED
@@ -3,3 +3,5 @@ source 'https://rubygems.org'
3
3
  gem 'coveralls', group: :test, require: false
4
4
 
5
5
  gemspec name: 'libis-format', development_group: :test
6
+
7
+ gem 'standard'
Binary file
data/data/PDFA_def.ps CHANGED
@@ -5,10 +5,10 @@
5
5
  % unless the user modifies the corresponding line below.
6
6
 
7
7
  % Define entries in the document Info dictionary :
8
- /ICCProfile ([** Fill in ICC profile location **])
8
+ /ICCProfile ([**ICC profile**])
9
9
  def
10
10
 
11
- [ /Title (Title)
11
+ [ [**METADATA**]
12
12
  /DOCINFO pdfmark
13
13
 
14
14
  % Define an ICC profile :
@@ -35,6 +35,6 @@ def
35
35
  /Type /OutputIntent % Must be so (the standard requires).
36
36
  /S /GTS_PDFA1 % Must be so (the standard requires).
37
37
  /DestOutputProfile {icc_PDFA} % Must be so (see above).
38
- /OutputConditionIdentifier ([** Fill in ICC reference name **])
38
+ /OutputConditionIdentifier ([**ICC reference**])
39
39
  >> /PUT pdfmark
40
40
  [{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
@@ -12,7 +12,6 @@ module Libis
12
12
  Config[:java_cmd] = 'java'
13
13
  Config[:j2k_cmd] = 'j2kdriver'
14
14
  Config[:soffice_cmd] = 'soffice'
15
- Config[:emai2pdf_cmd] = 'convert_email'
16
15
  Config[:ghostscript_cmd] = 'gs'
17
16
  Config[:droid_cmd] = '/opt/droid/droid.sh'
18
17
  Config[:droid_temp_path] = '/tmp'
@@ -22,6 +21,7 @@ module Libis
22
21
  Config[:fido_formats] = [(File.join(Libis::Format::DATA_DIR, 'lias_formats.xml'))]
23
22
  Config[:pdf_tool] = File.join(Libis::Format::TOOL_DIR, 'PdfTool.jar')
24
23
  Config[:preflight_jar] = File.join(Libis::Format::TOOL_DIR, 'pdfbox', 'preflight-app-2.0.13.jar')
24
+ Config[:email2pdf_jar] = File.join(Libis::Format::TOOL_DIR, 'emailconverter.jar')
25
25
  # noinspection RubyStringKeysInHashInspection
26
26
  Config[:xml_validations] = [['archive/ead', File.join(Libis::Format::DATA_DIR, 'ead.xsd')]]
27
27
  Config[:type_database] = File.join(Libis::Format::DATA_DIR, 'types.yml')
@@ -97,19 +97,18 @@ module Libis
97
97
 
98
98
  end
99
99
 
100
- target
101
-
102
100
  end
103
101
 
104
102
  def assemble_and_convert(sources, target)
103
+ result = {}
105
104
  Tempfile.create(%w(list .txt)) do |f|
106
105
  sources.each {|src| f.puts src}
107
106
  opts[:global] ||= []
108
107
  opts[:global] += %w(-f concat)
109
108
  f.close
110
- target = convert_file(f.to_path, target)
109
+ result = convert_file(f.to_path, target)
111
110
  end
112
- target
111
+ result
113
112
  end
114
113
 
115
114
  def self.sounds_like(file1, file2, threshold, rate, channels)
@@ -155,6 +154,7 @@ module Libis
155
154
 
156
155
  def convert_file(source, target)
157
156
  opts = {global: [], input: [], filter: [], output: []}
157
+
158
158
  opts[:global] << '-hide_banner'
159
159
  opts[:global] << '-loglevel' << (@options[:quiet] ? 'fatal' : 'warning')
160
160
  opts[:output] << '-vn' # disable input video stream in case it exists
@@ -168,10 +168,8 @@ module Libis
168
168
  opts[:output] << '-ar' << @options[:sampling_freq] if @options[:sampling_freq]
169
169
  opts[:output] << '-ac' << @options[:channels] if @options[:channels]
170
170
  opts[:output] << '-f' << @options[:format] if @options[:format]
171
- result = Libis::Format::Tool::FFMpeg.run(source, target, opts)
172
- info "FFMpeg output: #{result}"
173
- result
174
- target
171
+
172
+ Libis::Format::Tool::FFMpeg.run(source, target, opts)
175
173
  end
176
174
 
177
175
  end
@@ -68,14 +68,18 @@ module Libis
68
68
  end
69
69
 
70
70
  temp_files = []
71
+ xtra_files = []
72
+
73
+ result = { commands: [] }
71
74
 
72
75
  # noinspection RubyParenthesesAroundConditionInspection
73
- result = @converter_chain.each_with_index do |node, i|
76
+ conversion_success = converter_chain.each_with_index do |node, i|
74
77
 
75
78
  target_type = node[:output]
76
79
  converter_class = node[:converter]
77
80
  converter = converter_class.new
78
81
 
82
+
79
83
  node[:operations].each do |operation|
80
84
  converter.send operation[:method], operation[:argument]
81
85
  end if node[:operations]
@@ -90,17 +94,25 @@ module Libis
90
94
 
91
95
  FileUtils.mkdir_p File.dirname(target)
92
96
 
93
- src_file = converter.convert(src_file, target, target_type)
97
+ r = converter.convert(src_file, target, target_type)
98
+
99
+ src_file = r[:files].first
100
+ xtra_files += r[:files][1..]
101
+ break :failed unless src_file1
94
102
 
95
- break :failed unless src_file
103
+ result[:commands] << r.merge(converter: converter_class.name)
104
+
105
+ :success
96
106
 
97
107
  end
98
108
 
109
+ result[:files] = [src_file] + xtra_files
110
+
99
111
  temp_files.each do |f|
100
112
  FileUtils.rm(f, force: true)
101
113
  end
102
114
 
103
- result == :failed ? nil : target_file
115
+ conversion_success == :failed ? nil : result
104
116
 
105
117
  end
106
118
 
@@ -4,6 +4,7 @@ require_relative 'base'
4
4
 
5
5
  require 'libis/format/tool/email_to_pdf'
6
6
  require 'libis/format/type_database'
7
+ require 'rexml/document'
7
8
 
8
9
  module Libis
9
10
  module Format
@@ -27,10 +28,7 @@ module Libis
27
28
  def convert(source, target, format, opts = {})
28
29
  super
29
30
 
30
- return nil unless Format::Tool::EmailToPdf.run(source, target)
31
-
32
- target
33
-
31
+ Format::Tool::EmailToPdf.run(source, target)
34
32
  end
35
33
 
36
34
  end
@@ -31,8 +31,6 @@ module Libis
31
31
 
32
32
  Libis::Format::Tool::FopPdf.run(source, target)
33
33
 
34
- target
35
-
36
34
  end
37
35
 
38
36
  end
@@ -180,9 +180,11 @@ module Libis
180
180
  convert_image(source, target, format)
181
181
  end
182
182
  end
183
-
184
- target
185
-
183
+
184
+ {
185
+ files: [target],
186
+ converter: self.class.name
187
+ }
186
188
  end
187
189
 
188
190
  def assemble_and_convert(sources, target, format)
@@ -90,16 +90,16 @@ module Libis
90
90
  end
91
91
 
92
92
 
93
- Libis::Tools::Command.run(
93
+ result = Libis::Tools::Command.run(
94
94
  Libis::Format::Config[:j2k_cmd],
95
95
  '--input-file-name', source,
96
96
  '--set-output-type', 'JP2',
97
97
  *options,
98
98
  '--output-file-name', target,
99
-
100
99
  )
101
100
 
102
- target
101
+ result.merge(files: [target], converter: self.class.name)
102
+
103
103
  end
104
104
  end
105
105
  end
@@ -43,9 +43,7 @@ module Libis
43
43
  def convert(source, target, format, opts = {})
44
44
  super
45
45
 
46
- return nil unless Format::Tool::OfficeToPdf.run(source, target)
47
-
48
- target
46
+ Format::Tool::OfficeToPdf.run(source, target)
49
47
 
50
48
  end
51
49
 
@@ -5,6 +5,7 @@ require_relative 'base'
5
5
  require 'libis/tools/extend/hash'
6
6
  require 'libis/format/tool/pdf_copy'
7
7
  require 'libis/format/tool/pdf_to_pdfa'
8
+ require 'libis/format/tool/pdfa_validator'
8
9
  require 'libis/format/tool/pdf_optimizer'
9
10
 
10
11
  module Libis
@@ -119,7 +120,10 @@ module Libis
119
120
  result = pdf_to_pdfa(source, target)
120
121
  end
121
122
 
122
- result
123
+ {
124
+ files: [result],
125
+ converter: self.class.name
126
+ }
123
127
 
124
128
  end
125
129
 
@@ -160,11 +164,16 @@ module Libis
160
164
 
161
165
  using_temp(target) do |tmpname|
162
166
  result = Libis::Format::Tool::PdfToPdfa.run source, tmpname
163
- if result[:status] != 0
164
- error("Pdf/A conversion encountered errors:\n%s", result[:err].join("\n"))
167
+
168
+ if result[:command][:status] != 0
169
+ error("Pdf/A conversion encountered errors:\n%s", (result[:command][:out] + result[:command][:err]).join("\n"))
165
170
  next nil
166
171
  else
167
- warn("Pdf/A conversion warnings:\n%s", result[:err].join("\n")) unless result[:err].empty?
172
+ r = Libis::Format::Tool::PdfaValidator.run tmpname
173
+ if r[:status] != 0
174
+ error "Pdf/A file failed to validate with following errors:\n%s", (r[:err] || r[:out] || []).join("\n")
175
+ next nil
176
+ end
168
177
  end
169
178
  tmpname
170
179
  end
@@ -31,9 +31,7 @@ module Libis
31
31
  def convert(source, target, format, opts = {})
32
32
  super
33
33
 
34
- return nil unless Format::Tool::SpreadsheetToOds.run(source, target)
35
-
36
- target
34
+ Format::Tool::SpreadsheetToOds.run(source, target)
37
35
 
38
36
  end
39
37
 
@@ -1,5 +1,5 @@
1
1
  require_relative 'base'
2
- require 'libis/format/tool/ffmpeg'
2
+ require 'libis/format/tool/ff_mpeg'
3
3
 
4
4
  require 'fileutils'
5
5
 
@@ -179,7 +179,10 @@ module Libis
179
179
 
180
180
  end
181
181
 
182
- target
182
+ {
183
+ files: [target],
184
+ converter: self.class.name
185
+ }
183
186
 
184
187
  end
185
188
 
@@ -1,17 +1,17 @@
1
- require_relative 'base'
1
+ require_relative "base"
2
2
 
3
3
  module Libis
4
4
  module Format
5
5
  module Converter
6
-
7
6
  class XsltConverter < Libis::Format::Converter::Base
8
-
9
7
  def self.input_types
10
8
  [:XML]
11
9
  end
12
10
 
13
11
  def self.output_types(format = nil)
14
- return [] unless input_types.include?(format) if format
12
+ if format
13
+ return [] unless input_types.include?(format)
14
+ end
15
15
  [:XML, :HTML, :TXT]
16
16
  end
17
17
 
@@ -28,20 +28,20 @@ module Libis
28
28
  end
29
29
 
30
30
  unless @options[:xsl_file]
31
- error 'No xsl_file supplied'
31
+ error "No xsl_file supplied"
32
32
  return nil
33
33
  end
34
34
 
35
35
  FileUtils.mkpath(File.dirname(target))
36
36
 
37
37
  if RUBY_PLATFORM == "java"
38
- require 'saxon-xslt'
38
+ require "saxon-xslt"
39
39
  xsl = Saxon.XSLT(File.open(@options[:xsl_file]))
40
40
  xml = Saxon.XML(File.open(source))
41
41
  result = xsl.transform(xml)
42
- File.open(target, 'w') {|f| f.write(result.to_s)}
42
+ File.write(target, result.to_s)
43
43
  else
44
- require 'nokogiri'
44
+ require "nokogiri"
45
45
 
46
46
  doc = nil
47
47
  begin
@@ -65,7 +65,7 @@ module Libis
65
65
  xsl = nil
66
66
 
67
67
  begin
68
- fp = File.open(file, 'r')
68
+ fp = File.open(file, "r")
69
69
  xsl = Nokogiri::XSLT(fp) do |config|
70
70
  config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NOBLANKS
71
71
  end
@@ -80,7 +80,7 @@ module Libis
80
80
 
81
81
  begin
82
82
  target_xml = xsl.transform(doc)
83
- fp = File.open(target, 'w')
83
+ fp = File.open(target, "w")
84
84
  fp.write(target_xml)
85
85
  rescue Exception => e
86
86
  error "Error transforming '#{source}' with '#{file}': #{e.message} @ #{e.backtrace[0]}"
@@ -89,13 +89,14 @@ module Libis
89
89
  fp.close unless fp.nil? or fp.closed?
90
90
  end
91
91
 
92
- target
93
- end
92
+ {
93
+ command: {status: 0},
94
+ files: [target]
95
+ }
94
96
 
97
+ end
95
98
  end
96
-
97
99
  end
98
-
99
100
  end
100
101
  end
101
102
  end
@@ -1,40 +1,75 @@
1
- require 'fileutils'
1
+ require "fileutils"
2
2
 
3
- require 'libis/tools/extend/string'
4
- require 'libis/tools/logger'
5
- require 'libis/tools/command'
3
+ require "libis/tools/extend/string"
4
+ require "libis/tools/logger"
5
+ require "libis/tools/command"
6
6
 
7
- require 'libis/format/config'
7
+ require "libis/format/config"
8
+ require "rexml/document"
8
9
 
9
10
  module Libis
10
11
  module Format
11
12
  module Tool
12
-
13
13
  class EmailToPdf
14
14
  include ::Libis::Tools::Logger
15
15
 
16
+ def self.installed?
17
+ result = Libis::Tools::Command.run(Libis::Format::Config[:email2pdf_cmd], "-v")
18
+ result[:status] == 0
19
+ end
20
+
16
21
  def self.run(source, target, options = {})
17
- self.new.run source, target, options
22
+ new.run source, target, options
18
23
  end
19
24
 
20
25
  def run(source, target, _ = {})
21
26
  timeout = Libis::Format::Config[:timeouts][:email2pdf] || 120
22
27
  result = Libis::Tools::Command.run(
23
- Libis::Format::Config[:email2pdf_cmd],
24
- source,
25
- target,
26
- timeout: timeout,
27
- kill_after: timeout * 2
28
+ Libis::Format::Config[:java_cmd],
29
+ "-Duser.timezone=Europe/Brussels", "-Duser.language=nl", "-Duser.country=BE",
30
+ "-jar", Libis::Format::Config[:email2pdf_jar],
31
+ "-e", "-hd", "-a",
32
+ "-o", target,
33
+ source,
34
+ timeout: timeout,
35
+ kill_after: timeout * 2
28
36
  )
29
37
 
30
- raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
31
- warn "EmailToPdf conversion messages: \n\t#{result[:out].join("\n\t")}" unless result[:err].empty?
32
- raise RuntimeError, "#{self.class} failed to generate target file #{target}" unless File.exist?(target)
38
+ warn "EmailToPdf conversion messages: \n\t#{result[:err].join("\n\t")}" unless result[:err].empty?
39
+
40
+ raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
41
+ raise "#{self.class} failed to generate target file #{target}" unless File.exist?(target)
42
+ raise "#{self.class} command failed with status code #{result[:status]}" unless result[:status] == 0
43
+
44
+ base_path = File.join(File.dirname(target), File.basename(target, ".*"))
45
+ headers_file = "#{base_path}.headers.xml"
46
+ headers = read_header(headers_file)
33
47
 
34
- nil
48
+ {
49
+ command: result,
50
+ files: [target, headers_file] + headers[:attachments].map { |a| File.join("#{base_path}-attachments", a) },
51
+ headers: headers
52
+ }
35
53
  end
36
- end
37
54
 
55
+ private
56
+
57
+ def read_header(headers_file)
58
+ headers = {}
59
+ return headers unless File.exist?(headers_file)
60
+ doc = REXML::Document.new(File.new(headers_file))
61
+ root = doc.root
62
+ root.children.each do |element|
63
+ case element.name
64
+ when "attachments"
65
+ headers[:attachments] = element.elements.map { |e| e.text }
66
+ else
67
+ headers[element.name.to_sym] = element.text
68
+ end
69
+ end
70
+ headers
71
+ end
72
+ end
38
73
  end
39
74
  end
40
75
  end
@@ -13,6 +13,11 @@ module Libis
13
13
  include Singleton
14
14
  include ::Libis::Tools::Logger
15
15
 
16
+ def self.installed?
17
+ result = Libis::Tools::Command.run(Libis::Format::Config[:ffmpeg_cmd], "-h")
18
+ result[:status] == 0
19
+ end
20
+
16
21
  def self.run(source, target, options = {})
17
22
  self.instance.run source, target, options
18
23
  end
@@ -38,7 +43,11 @@ module Libis
38
43
 
39
44
  warn "FFMpeg warnings: #{(result[:err] + result[:out]).join("\n")}" unless result[:err].empty?
40
45
 
41
- result[:out]
46
+ {
47
+ command: result,
48
+ files: [ target ]
49
+ }
50
+
42
51
  end
43
52
 
44
53
  end
@@ -13,6 +13,12 @@ module Libis
13
13
  class FopPdf
14
14
  include ::Libis::Tools::Logger
15
15
 
16
+ def self.installed?
17
+ result = Libis::Tools::Command.run(Libis::Format::Config[:java_cmd], "-version")
18
+ return false unless result[:status] == 0
19
+ File.exist?(Libis::Format::Config[:fop_jar])
20
+ end
21
+
16
22
  def self.run(xml, target, options = [])
17
23
  self.new.run xml, target, options
18
24
  end
@@ -27,6 +33,7 @@ module Libis
27
33
  result = Libis::Tools::Command.run(
28
34
  Libis::Format::Config[:java_cmd],
29
35
  "-Dfop.home=#{File.dirname(Libis::Format::Config[:fop_jar])}",
36
+ '-Djava.awt.headless=true',
30
37
  '-jar', Libis::Format::Config[:fop_jar],
31
38
  '-fo', xml,
32
39
  '-pdf', target,
@@ -37,6 +44,11 @@ module Libis
37
44
  raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
38
45
  raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0
39
46
 
47
+ {
48
+ command: result,
49
+ files: [ target ]
50
+ }
51
+
40
52
  end
41
53
  end
42
54
 
@@ -13,6 +13,11 @@ module Libis
13
13
  class OfficeToPdf
14
14
  include ::Libis::Tools::Logger
15
15
 
16
+ def self.installed?
17
+ result = Libis::Tools::Command.run(Libis::Format::Config[:soffice_cmd], "--version")
18
+ result[:status] == 0
19
+ end
20
+
16
21
  def self.run(source, target, options = {})
17
22
  self.new.run source, target, options
18
23
  end
@@ -47,10 +52,14 @@ module Libis
47
52
 
48
53
  FileUtils.copy tgt_file, target, preserve: true
49
54
 
55
+ {
56
+ command: result,
57
+ files: [ target ]
58
+ }
59
+
50
60
  ensure
51
61
  FileUtils.rmtree workdir rescue nil
52
62
 
53
- result[:out]
54
63
  end
55
64
  end
56
65
 
@@ -13,6 +13,12 @@ module Libis
13
13
  class PdfCopy
14
14
  include ::Libis::Tools::Logger
15
15
 
16
+ def self.installed?
17
+ result = Libis::Tools::Command.run(Libis::Format::Config[:java_cmd], "-version")
18
+ return false unless result[:status] == 0
19
+ File.exist?(Libis::Format::Config[:pdf_tool])
20
+ end
21
+
16
22
  def self.run(source, target, options = [])
17
23
  self.new.run source, target, options
18
24
  end
@@ -38,7 +44,11 @@ module Libis
38
44
  raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
39
45
  raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
40
46
 
41
- result
47
+ {
48
+ command: result,
49
+ files: [ target ]
50
+ }
51
+
42
52
  end
43
53
  end
44
54
 
@@ -13,6 +13,12 @@ module Libis
13
13
  class PdfMerge
14
14
  include ::Libis::Tools::Logger
15
15
 
16
+ def self.installed?
17
+ result = Libis::Tools::Command.run(Libis::Format::Config[:java_cmd], "-version")
18
+ return false unless result[:status] == 0
19
+ File.exist?(Libis::Format::Config[:pdf_tool])
20
+ end
21
+
16
22
  def self.run(source, target, options = [])
17
23
  self.new.run source, target, options
18
24
  end
@@ -39,7 +45,11 @@ module Libis
39
45
  raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
40
46
  raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
41
47
 
42
- result
48
+ {
49
+ command: result,
50
+ files: [ target ]
51
+ }
52
+
43
53
  end
44
54
  end
45
55
 
@@ -13,6 +13,11 @@ module Libis
13
13
  class PdfOptimizer
14
14
  include ::Libis::Tools::Logger
15
15
 
16
+ def self.installed?
17
+ result = Libis::Tools::Command.run(Libis::Format::Config[:ghostscript_cmd], "--version")
18
+ result[:status] == 0
19
+ end
20
+
16
21
  def self.run(source, target, quality)
17
22
  self.new.run source, target, quality
18
23
  end
@@ -21,7 +26,7 @@ module Libis
21
26
 
22
27
  timeout = Libis::Format::Config[:timeouts][:pdf_optimizer]
23
28
  result = Libis::Tools::Command.run(
24
- 'gs',
29
+ Libis::Format::Config[:ghostscript_cmd],
25
30
  '-sDEVICE=pdfwrite',
26
31
  '-dCompatibilityLevel=1.4',
27
32
  "-dPDFSETTINGS=/#{quality}",
@@ -36,7 +41,11 @@ module Libis
36
41
  raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
37
42
  raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0
38
43
 
39
- result
44
+ {
45
+ command: result,
46
+ files: [ target ]
47
+ }
48
+
40
49
  end
41
50
  end
42
51