libis-format 1.3.7.2 → 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.
- checksums.yaml +4 -4
- data/.coveralls.yml +2 -0
- data/.gitignore +20 -0
- data/.travis.yml +70 -0
- data/Gemfile +0 -12
- data/README.md +2 -2
- data/Rakefile +8 -0
- data/base/Dockerfile +35 -0
- data/base/Dockerfile.alpine +20 -0
- data/base/Dockerfile.rvm +56 -0
- data/base/rework_path +20 -0
- data/bin/{pdf_tool → pdf_copy} +2 -3
- data/data/PDFA_def.ps +3 -3
- data/data/eciRGB_v2.icc +0 -0
- data/data/types.yml +4 -17
- data/docker_cfg.yml +1 -0
- data/lib/libis/format/cli/convert.rb +4 -4
- data/lib/libis/format/cli/prompt_helper.rb +24 -32
- data/lib/libis/format/command_line.rb +3 -2
- data/lib/libis/format/config.rb +23 -19
- data/lib/libis/format/converter/audio_converter.rb +31 -56
- data/lib/libis/format/converter/base.rb +36 -16
- data/lib/libis/format/converter/chain.rb +32 -62
- data/lib/libis/format/converter/fop_pdf_converter.rb +8 -4
- data/lib/libis/format/converter/image_assembler.rb +82 -0
- data/lib/libis/format/converter/image_converter.rb +45 -248
- data/lib/libis/format/converter/image_splitter.rb +80 -0
- data/lib/libis/format/converter/image_watermarker.rb +261 -0
- data/lib/libis/format/converter/jp2_converter.rb +38 -36
- data/lib/libis/format/converter/office_converter.rb +28 -22
- data/lib/libis/format/converter/pdf_assembler.rb +66 -0
- data/lib/libis/format/converter/pdf_converter.rb +52 -200
- data/lib/libis/format/converter/pdf_optimizer.rb +70 -0
- data/lib/libis/format/converter/pdf_splitter.rb +65 -0
- data/lib/libis/format/converter/pdf_watermarker.rb +110 -0
- data/lib/libis/format/converter/repository.rb +13 -7
- data/lib/libis/format/converter/spreadsheet_converter.rb +16 -10
- data/lib/libis/format/converter/video_converter.rb +73 -109
- data/lib/libis/format/converter/xslt_converter.rb +11 -13
- data/lib/libis/format/converter.rb +1 -1
- data/lib/libis/format/identifier.rb +46 -44
- data/lib/libis/format/info.rb +27 -0
- data/lib/libis/format/library.rb +147 -0
- data/lib/libis/format/tool/droid.rb +30 -29
- data/lib/libis/format/tool/extension_identification.rb +26 -24
- data/lib/libis/format/tool/{ff_mpeg.rb → ffmpeg.rb} +10 -17
- data/lib/libis/format/tool/fido.rb +27 -22
- data/lib/libis/format/tool/file_tool.rb +24 -11
- data/lib/libis/format/tool/fop_pdf.rb +14 -25
- data/lib/libis/format/tool/identification_tool.rb +40 -38
- data/lib/libis/format/tool/office_to_pdf.rb +18 -30
- data/lib/libis/format/tool/pdf_copy.rb +47 -0
- data/lib/libis/format/tool/pdf_merge.rb +19 -25
- data/lib/libis/format/tool/pdf_optimizer.rb +19 -22
- data/lib/libis/format/tool/pdf_split.rb +33 -6
- data/lib/libis/format/tool/pdf_to_pdfa.rb +31 -45
- data/lib/libis/format/tool/pdfa_validator.rb +30 -24
- data/lib/libis/format/tool/spreadsheet_to_ods.rb +18 -29
- data/lib/libis/format/tool.rb +3 -4
- data/lib/libis/format/version.rb +1 -3
- data/lib/libis/format/yaml_loader.rb +71 -0
- data/lib/libis/format.rb +7 -5
- data/lib/libis-format.rb +0 -2
- data/libis-format.gemspec +18 -24
- data/tools/PdfTool.jar +0 -0
- data/tools/pdfbox/pdfbox-app-2.0.13.jar +0 -0
- data/tools/pdfbox/{preflight-app-3.0.3.jar → preflight-app-2.0.13.jar} +0 -0
- metadata +86 -128
- data/data/AdobeRGB1998.icc +0 -0
- data/lib/libis/format/converter/email_converter.rb +0 -36
- data/lib/libis/format/tool/msg_to_pdf.rb +0 -270
- data/lib/libis/format/tool/pdf_tool.rb +0 -52
- data/lib/libis/format/type_database.rb +0 -156
- data/lib/libis/format/type_database_impl.rb +0 -153
- data/tools/pdf2pdfa +0 -395
- data/tools/pdfbox/pdfbox-app-3.0.3.jar +0 -0
- /data/bin/{droid_tool → droid} +0 -0
- /data/bin/{fido_tool → fido} +0 -0
@@ -1,5 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
require_relative 'base'
|
4
2
|
require 'libis/format/identifier'
|
5
3
|
require 'chromaprint'
|
@@ -9,19 +7,24 @@ require 'fileutils'
|
|
9
7
|
module Libis
|
10
8
|
module Format
|
11
9
|
module Converter
|
10
|
+
|
12
11
|
class AudioConverter < Libis::Format::Converter::Base
|
12
|
+
|
13
13
|
def self.input_types
|
14
|
-
|
14
|
+
[:MP3, :FLAC, :AC3, :AAC, :WMA, :ALAC, :WAV, :AIFF, :AMR, :AU, :M4A]
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.output_types(format = nil)
|
18
|
-
return [] unless input_types.include?(format)
|
18
|
+
return [] unless format.nil? || input_types.include?(format)
|
19
|
+
[:MP3, :FLAC, :AC3, :AAC, :WMA, :ALAC, :WAV, :AIFF, :AMR, :AU, :M4A]
|
20
|
+
end
|
19
21
|
|
20
|
-
|
22
|
+
def initialize
|
23
|
+
super
|
21
24
|
end
|
22
25
|
|
23
|
-
def quiet(
|
24
|
-
@flags[:quiet] = !!
|
26
|
+
def quiet(v)
|
27
|
+
@flags[:quiet] = !!v
|
25
28
|
end
|
26
29
|
|
27
30
|
def format(format)
|
@@ -57,70 +60,38 @@ module Libis
|
|
57
60
|
end
|
58
61
|
|
59
62
|
def web_stream(value)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
+
if value
|
64
|
+
@options[:codec] = 'mp3'
|
65
|
+
end
|
63
66
|
end
|
64
67
|
|
65
68
|
def preset(stream, name)
|
66
69
|
(@options[:preset] ||= {})[stream] = name
|
67
70
|
end
|
68
71
|
|
69
|
-
# def encoder(value)
|
70
|
-
# @options[:encoder] = value
|
71
|
-
# end
|
72
|
-
#
|
73
|
-
# def encoder_options(value)
|
74
|
-
# @options[:encoder_options] = value
|
75
|
-
# end
|
76
|
-
|
77
72
|
def convert(source, target, _format, opts = {})
|
78
73
|
super
|
79
74
|
|
80
75
|
FileUtils.mkpath(File.dirname(target))
|
81
76
|
|
82
|
-
|
83
|
-
|
84
|
-
assemble_and_convert(source, target)
|
85
|
-
|
86
|
-
elsif File.directory?(source)
|
87
|
-
|
88
|
-
sources = Dir[File.join(source, '**', '*')].reject { |p| File.directory? p }
|
89
|
-
assemble_and_convert(sources, target)
|
90
|
-
|
91
|
-
else
|
77
|
+
convert_file(source, target)
|
92
78
|
|
93
|
-
convert_file(source, target)
|
94
|
-
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def assemble_and_convert(sources, target)
|
99
|
-
result = {}
|
100
|
-
Tempfile.create(%w[list .txt]) do |f|
|
101
|
-
sources.each { |src| f.puts src }
|
102
|
-
opts[:global] ||= []
|
103
|
-
opts[:global] += %w[-f concat]
|
104
|
-
f.close
|
105
|
-
result = convert_file(f.to_path, target)
|
106
|
-
end
|
107
|
-
result
|
108
79
|
end
|
109
80
|
|
110
81
|
def self.sounds_like(file1, file2, threshold, rate, channels)
|
111
|
-
rate ||=
|
82
|
+
rate ||= 96000
|
112
83
|
channels ||= 2
|
113
84
|
threshold ||= 0.85
|
114
85
|
|
115
|
-
if File.
|
86
|
+
if File.exists?(file1) && File.exists?(file2)
|
116
87
|
# Convert input files into raw 16-bit signed audio (WAV) to process with Chramaprint
|
117
|
-
file1_raw = File.join('', 'tmp',
|
118
|
-
file2_raw = File.join('', 'tmp',
|
88
|
+
file1_raw = File.join('', 'tmp', File.basename(file1) + '.wav')
|
89
|
+
file2_raw = File.join('', 'tmp', File.basename(file2) + '.wav')
|
119
90
|
FileUtils.rm(file1_raw, force: true)
|
120
91
|
FileUtils.rm(file2_raw, force: true)
|
121
92
|
cvt_cmd = Libis::Format::Config[:raw_audio_convert_cmd]
|
122
|
-
|
123
|
-
|
93
|
+
%x"#{cvt_cmd % [file1, file1_raw, rate, channels]}"
|
94
|
+
%x"#{cvt_cmd % [file2, file2_raw, rate, channels]}"
|
124
95
|
file1_audio = File.binread(file1_raw)
|
125
96
|
file2_audio = File.binread(file2_raw)
|
126
97
|
|
@@ -140,33 +111,37 @@ module Libis
|
|
140
111
|
else
|
141
112
|
false
|
142
113
|
end
|
114
|
+
|
143
115
|
rescue Exception => e
|
144
|
-
|
116
|
+
error "Error comparing sound file #{file1} and #{file2}: #{e.message} @ #{e.backtrace.first}"
|
145
117
|
false
|
146
118
|
end
|
147
119
|
|
148
120
|
protected
|
149
121
|
|
150
122
|
def convert_file(source, target)
|
151
|
-
opts = {
|
152
|
-
|
123
|
+
opts = {global: [], input: [], filter: [], output: []}
|
153
124
|
opts[:global] << '-hide_banner'
|
154
125
|
opts[:global] << '-loglevel' << (@options[:quiet] ? 'fatal' : 'warning')
|
155
126
|
opts[:output] << '-vn' # disable input video stream in case it exists
|
156
127
|
opts[:output] << '-codec:a' << @options[:codec] if @options[:codec]
|
157
128
|
opts[:output] << '-map_metadata:g' << '0:g' # Copy global metadata
|
158
129
|
opts[:output] << '-map_metadata:s:a' << '0:s:a' # Copy audio metadata
|
159
|
-
opts[:input] << '-accurate_seek' << (@options[:start].to_i
|
130
|
+
opts[:input] << '-accurate_seek' << (@options[:start].to_i < 0 ? '-sseof' : '-ss') << @options[:start] if @options[:start]
|
160
131
|
opts[:input] << '-t' << @options[:duration] if @options[:duration]
|
161
132
|
opts[:output] << '-q:a' << @options[:quality] if @options[:quality]
|
162
133
|
opts[:output] << '-b:a' << @options[:bit_rate] if @options[:bit_rate]
|
163
134
|
opts[:output] << '-ar' << @options[:sampling_freq] if @options[:sampling_freq]
|
164
135
|
opts[:output] << '-ac' << @options[:channels] if @options[:channels]
|
165
136
|
opts[:output] << '-f' << @options[:format] if @options[:format]
|
166
|
-
|
167
|
-
|
137
|
+
result = Libis::Format::Tool::FFMpeg.run(source, target, opts)
|
138
|
+
info "FFMpeg output: #{result}"
|
139
|
+
result
|
140
|
+
target
|
168
141
|
end
|
142
|
+
|
169
143
|
end
|
144
|
+
|
170
145
|
end
|
171
146
|
end
|
172
|
-
end
|
147
|
+
end
|
@@ -1,16 +1,17 @@
|
|
1
|
-
#
|
1
|
+
# coding: utf-8
|
2
2
|
|
3
3
|
### require 'tools/string'
|
4
4
|
require 'tmpdir'
|
5
5
|
require 'libis/tools/logger'
|
6
6
|
require 'libis/tools/temp_file'
|
7
|
-
require 'libis/format/
|
7
|
+
require 'libis/format/library'
|
8
8
|
|
9
9
|
require_relative 'repository'
|
10
10
|
|
11
11
|
module Libis
|
12
12
|
module Format
|
13
13
|
module Converter
|
14
|
+
|
14
15
|
class Base
|
15
16
|
include Libis::Tools::Logger
|
16
17
|
|
@@ -21,43 +22,58 @@ module Libis
|
|
21
22
|
@flags = {}
|
22
23
|
end
|
23
24
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
def self.category
|
26
|
+
:converter
|
27
|
+
end
|
28
|
+
|
29
|
+
def check_file_exist(file)
|
30
|
+
unless File.exist? file
|
31
|
+
error "Cannot find file '#{file}'."
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
true
|
35
|
+
end
|
36
|
+
|
37
|
+
def convert(source, target, format, opts = {})
|
38
|
+
if source.is_a?(Array)
|
39
|
+
return nil unless source.map { |f| check_file_exist(f) }.reduce(:&)
|
40
|
+
else
|
41
|
+
return nil unless check_file_exist(source)
|
28
42
|
end
|
29
43
|
@options.merge!(opts[:options]) if opts[:options]
|
30
44
|
@flags.merge!(opts[:flags]) if opts[:flags]
|
31
45
|
end
|
32
46
|
|
33
47
|
def self.input_types
|
34
|
-
raise 'Method #input_types needs to be overridden in converter'
|
48
|
+
raise RuntimeError, 'Method #input_types needs to be overridden in converter'
|
35
49
|
end
|
36
50
|
|
37
51
|
def self.output_types(_format = nil)
|
38
|
-
raise 'Method #output_types needs to be overridden in converter'
|
52
|
+
raise RuntimeError, 'Method #output_types needs to be overridden in converter'
|
39
53
|
end
|
40
54
|
|
41
55
|
def using_temp(target, &block)
|
42
56
|
self.class.using_temp(target, &block)
|
43
57
|
end
|
44
58
|
|
45
|
-
def
|
59
|
+
def Base.using_temp(target)
|
46
60
|
tempfile = Tools::TempFile.name("convert-#{File.basename(target, '.*').gsub(/\s/, '_')}", File.extname(target))
|
47
61
|
result = yield tempfile
|
48
62
|
return nil unless result
|
49
|
-
|
50
63
|
FileUtils.move result, target
|
51
64
|
target
|
52
65
|
end
|
53
66
|
|
54
|
-
def
|
67
|
+
def Base.inherited(klass)
|
68
|
+
|
55
69
|
Repository.register klass
|
56
70
|
|
57
71
|
class << self
|
72
|
+
|
58
73
|
def conversions
|
59
|
-
input_types.
|
74
|
+
input_types.inject({}) do |hash, input_type|
|
60
75
|
hash[input_type] = output_types
|
76
|
+
hash
|
61
77
|
end
|
62
78
|
end
|
63
79
|
|
@@ -70,17 +86,17 @@ module Libis
|
|
70
86
|
end
|
71
87
|
|
72
88
|
def input_mimetype?(mimetype)
|
73
|
-
type_id =
|
89
|
+
type_id = Libis::Format::Library.get_field_by(:mimetype, mimetype, :format)
|
74
90
|
input_type? type_id
|
75
91
|
end
|
76
92
|
|
77
93
|
def output_mimetype?(mimetype)
|
78
|
-
type_id =
|
94
|
+
type_id = Libis::Format::Library.get_field_by(:mimetype, mimetype, :format)
|
79
95
|
output_type? type_id
|
80
96
|
end
|
81
97
|
|
82
98
|
def conversion?(input_type, output_type)
|
83
|
-
conversions[input_type]
|
99
|
+
conversions[input_type] and conversions[input_type].any? { |t| t == output_type }
|
84
100
|
end
|
85
101
|
|
86
102
|
def output_for(input_type)
|
@@ -88,11 +104,15 @@ module Libis
|
|
88
104
|
end
|
89
105
|
|
90
106
|
def extension?(extension)
|
91
|
-
!
|
107
|
+
!Libis::Format::Library.get_field_by(:extension, extension, :format).nil?
|
92
108
|
end
|
109
|
+
|
93
110
|
end
|
111
|
+
|
94
112
|
end
|
113
|
+
|
95
114
|
end
|
115
|
+
|
96
116
|
end
|
97
117
|
end
|
98
118
|
end
|
@@ -1,15 +1,16 @@
|
|
1
|
-
#
|
1
|
+
# coding: utf-8
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'deep_dive'
|
5
5
|
|
6
6
|
require 'libis/tools/logger'
|
7
7
|
require 'libis/tools/extend/hash'
|
8
|
-
require 'libis/format/
|
8
|
+
require 'libis/format/library'
|
9
9
|
|
10
10
|
module Libis
|
11
11
|
module Format
|
12
12
|
module Converter
|
13
|
+
|
13
14
|
class Chain
|
14
15
|
include ::Libis::Tools::Logger
|
15
16
|
include DeepDive
|
@@ -25,16 +26,15 @@ module Libis
|
|
25
26
|
# @return [Array[Hash]]
|
26
27
|
def append(converter)
|
27
28
|
return [] unless converter
|
28
|
-
|
29
29
|
valid_chain_nodes(converter).map do |node|
|
30
|
-
ddup.add_chain_node(node)
|
30
|
+
self.ddup.add_chain_node(node)
|
31
31
|
end.compact
|
32
32
|
end
|
33
33
|
|
34
34
|
def closed?
|
35
35
|
!@converter_chain.empty? &&
|
36
|
-
|
37
|
-
|
36
|
+
@converter_chain.first[:input].to_sym == @source_format &&
|
37
|
+
@converter_chain.last[:output].to_sym == @target_format
|
38
38
|
end
|
39
39
|
|
40
40
|
def valid?
|
@@ -49,86 +49,68 @@ module Libis
|
|
49
49
|
@converter_chain.size
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
alias_method :length, :size
|
53
53
|
|
54
54
|
def to_s
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
"#{@source_format}->-#{@converter_chain.map do |node|
|
56
|
+
"#{node[:converter].name.gsub(/^.*::/, '')}#{node[:operations].empty? ? '' :
|
57
|
+
"(#{node[:operations].each do |operation|
|
58
|
+
"#{operation[:method]}:#{operation[:argument]}"
|
59
|
+
end.join(',')})"}->-#{node[:output]}"
|
60
|
+
end.join('->-')}"
|
58
61
|
end
|
59
62
|
|
60
63
|
def convert(src_file, target_file)
|
64
|
+
|
61
65
|
unless valid?
|
62
66
|
error 'Converter chain is not valid'
|
63
67
|
return nil
|
64
68
|
end
|
65
69
|
|
66
70
|
temp_files = []
|
67
|
-
xtra_files = []
|
68
|
-
|
69
|
-
result = { commands: [] }
|
70
71
|
|
71
72
|
# noinspection RubyParenthesesAroundConditionInspection
|
72
|
-
|
73
|
-
|
73
|
+
result = @converter_chain.each_with_index do |node, i|
|
74
|
+
|
74
75
|
target_type = node[:output]
|
75
76
|
converter_class = node[:converter]
|
76
77
|
converter = converter_class.new
|
77
78
|
|
78
|
-
node[:operations]
|
79
|
+
node[:operations].each do |operation|
|
79
80
|
converter.send operation[:method], operation[:argument]
|
80
|
-
end
|
81
|
-
|
82
|
-
debug "Converter: #{converter.inspect}"
|
81
|
+
end if node[:operations]
|
83
82
|
|
84
83
|
target = target_file
|
85
84
|
|
86
85
|
if i < size - 1
|
87
|
-
target += ".temp.#{
|
88
|
-
target += ".#{
|
86
|
+
target += ".temp.#{Libis::Format::Library.get_field(target_type, :extensions).first}"
|
87
|
+
target += ".#{Libis::Format::Library.get_field(target_type, :extensions).first}" while File.exist? target
|
89
88
|
temp_files << target
|
90
89
|
end
|
91
90
|
|
92
91
|
FileUtils.mkdir_p File.dirname(target)
|
93
92
|
|
94
|
-
|
95
|
-
r = converter.convert(src_file, target, target_type)
|
96
|
-
debug "Conversion result: #{r}"
|
93
|
+
src_file = converter.convert(src_file, target, target_type)
|
97
94
|
|
98
|
-
src_file = r[:files].first
|
99
|
-
xtra_files += r[:files][1..]
|
100
95
|
break :failed unless src_file
|
101
96
|
|
102
|
-
result[:commands] << r.merge(converter: converter_class.name)
|
103
|
-
|
104
|
-
:success
|
105
97
|
end
|
106
98
|
|
107
|
-
debug "Final conversion result: #{conversion_success}"
|
108
|
-
|
109
|
-
result[:files] = [src_file] + xtra_files
|
110
|
-
|
111
|
-
debug "Final result: #{result}"
|
112
|
-
|
113
99
|
temp_files.each do |f|
|
114
100
|
FileUtils.rm(f, force: true)
|
115
101
|
end
|
116
102
|
|
117
|
-
|
103
|
+
result == :failed ? nil : target_file
|
104
|
+
|
118
105
|
end
|
119
106
|
|
120
107
|
def valid_chain_nodes(converter)
|
121
|
-
source_format =
|
122
|
-
@converter_chain.last[:output]
|
123
|
-
rescue StandardError
|
124
|
-
@source_format
|
125
|
-
end
|
108
|
+
source_format = @converter_chain.last[:output] rescue @source_format
|
126
109
|
nodes = []
|
127
110
|
if converter.input_types.include? source_format
|
128
111
|
converter.output_types(source_format).each do |format|
|
129
|
-
node = { converter
|
112
|
+
node = {converter: converter, input: source_format, output: format}
|
130
113
|
next if node_exists?(node)
|
131
|
-
|
132
114
|
nodes << node
|
133
115
|
end
|
134
116
|
end
|
@@ -143,7 +125,6 @@ module Libis
|
|
143
125
|
return nil unless node[:output] && node[:converter].output_types(source_format).include?(node[:output])
|
144
126
|
return nil unless node[:converter].input_types.include? source_format
|
145
127
|
return nil if node_exists?(node)
|
146
|
-
|
147
128
|
@converter_chain << node
|
148
129
|
# debug "Chain: #{self}"
|
149
130
|
self
|
@@ -152,16 +133,15 @@ module Libis
|
|
152
133
|
def apply_operations
|
153
134
|
temp_chain = @converter_chain.reverse.ddup
|
154
135
|
applied = true
|
155
|
-
operations = @operations
|
136
|
+
operations = @operations && @operations.ddup || {}
|
156
137
|
while (operation = operations.shift)
|
157
138
|
method = operation.first.to_s.to_sym
|
158
|
-
applied &&= temp_chain.each do |node|
|
139
|
+
applied &&= :found == temp_chain.each do |node|
|
159
140
|
next unless node[:converter].instance_methods.include?(method)
|
160
|
-
|
161
141
|
node[:operations] ||= []
|
162
|
-
node[:operations] << { method
|
142
|
+
node[:operations] << {method: method, argument: operation.last}
|
163
143
|
break :found
|
164
|
-
end
|
144
|
+
end
|
165
145
|
end
|
166
146
|
if applied && operations.empty?
|
167
147
|
@converter_chain = temp_chain.reverse
|
@@ -171,27 +151,17 @@ module Libis
|
|
171
151
|
false
|
172
152
|
end
|
173
153
|
|
174
|
-
private
|
175
154
|
|
176
|
-
|
177
|
-
result = node[:converter].name.gsub(/^.*::/, '').to_s
|
178
|
-
unless node[:operations].empty?
|
179
|
-
result << '('
|
180
|
-
result << node[:operations].map do |operation|
|
181
|
-
"#{operation[:method]}:#{operation[:argument]}"
|
182
|
-
end.join(',')
|
183
|
-
result << ')'
|
184
|
-
end
|
185
|
-
result << '->-'
|
186
|
-
result << node[:output].to_s
|
187
|
-
end
|
155
|
+
private
|
188
156
|
|
189
157
|
def node_exists?(node)
|
190
158
|
@converter_chain.detect do |n|
|
191
159
|
n[:converter] == node[:converter] && n[:input] == node[:input] && n[:output] == node[:output]
|
192
160
|
end
|
193
161
|
end
|
162
|
+
|
194
163
|
end
|
164
|
+
|
195
165
|
end
|
196
166
|
end
|
197
167
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
require 'nokogiri'
|
4
2
|
|
5
3
|
require_relative 'base'
|
@@ -9,14 +7,15 @@ require 'libis/format/tool/fop_pdf'
|
|
9
7
|
module Libis
|
10
8
|
module Format
|
11
9
|
module Converter
|
10
|
+
|
12
11
|
class FopPdfConverter < Libis::Format::Converter::Base
|
12
|
+
|
13
13
|
def self.input_types
|
14
14
|
[:XML]
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.output_types(format = nil)
|
18
|
-
return []
|
19
|
-
|
18
|
+
return [] unless input_types.include?(format) if format
|
20
19
|
[:PDF]
|
21
20
|
end
|
22
21
|
|
@@ -31,8 +30,13 @@ module Libis
|
|
31
30
|
FileUtils.mkpath(File.dirname(target))
|
32
31
|
|
33
32
|
Libis::Format::Tool::FopPdf.run(source, target)
|
33
|
+
|
34
|
+
target
|
35
|
+
|
34
36
|
end
|
37
|
+
|
35
38
|
end
|
39
|
+
|
36
40
|
end
|
37
41
|
end
|
38
42
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
require 'libis/format/identifier'
|
5
|
+
|
6
|
+
require 'mini_magick'
|
7
|
+
|
8
|
+
MiniMagick.logger.level = ::Logger::UNKNOWN
|
9
|
+
|
10
|
+
MiniMagick.configure do |config|
|
11
|
+
# config.cli = :graphicsmagick
|
12
|
+
config.validate_on_create = false
|
13
|
+
config.validate_on_write = false
|
14
|
+
config.whiny = false
|
15
|
+
end
|
16
|
+
|
17
|
+
module Libis
|
18
|
+
module Format
|
19
|
+
module Converter
|
20
|
+
|
21
|
+
# noinspection RubyTooManyInstanceVariablesInspection,DuplicatedCode
|
22
|
+
class ImageAssembler < Libis::Format::Converter::Base
|
23
|
+
|
24
|
+
def self.input_types
|
25
|
+
[:TIFF, :JPG, :PNG, :BMP, :GIF, :PDF, :JP2]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.output_types(format = nil)
|
29
|
+
return [] unless input_types.include?(format) if format
|
30
|
+
[:PDF, :TIFF, :GIF, :PBM, :PGM, :PPM]
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.category
|
34
|
+
:assembler
|
35
|
+
end
|
36
|
+
|
37
|
+
def image_assemble(_)
|
38
|
+
#force usage of this converter
|
39
|
+
end
|
40
|
+
|
41
|
+
def quiet(v)
|
42
|
+
@quiet = !!v
|
43
|
+
end
|
44
|
+
|
45
|
+
def convert(source, target, format, opts = {})
|
46
|
+
super
|
47
|
+
|
48
|
+
FileUtils.mkpath(File.dirname(target))
|
49
|
+
|
50
|
+
if source.is_a? Array
|
51
|
+
assemble(source, target, format)
|
52
|
+
elsif File.directory?(source)
|
53
|
+
source_list = Dir[File.join(source, '**', '*')].reject {|p| File.directory? p}
|
54
|
+
assemble(source_list, target, format)
|
55
|
+
else
|
56
|
+
image = MiniMagick::Image.open(source) {|b| b.quiet}
|
57
|
+
if image.pages.size > 1
|
58
|
+
assemble(image.pages.map {|page| page.path}, target, format)
|
59
|
+
else
|
60
|
+
assemble([source], target, format)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
target
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def assemble(sources, target, format)
|
71
|
+
MiniMagick::Tool::Convert.new do |b|
|
72
|
+
sources.each {|source| b << source}
|
73
|
+
convert.format(format)
|
74
|
+
b << target
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|