libis-format 0.9.49 → 0.9.50
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/libis/format/config.rb +15 -0
- data/lib/libis/format/converter/xslt_converter.rb +50 -42
- data/lib/libis/format/tool/droid.rb +21 -5
- data/lib/libis/format/tool/ffmpeg.rb +10 -5
- data/lib/libis/format/tool/fido.rb +10 -4
- data/lib/libis/format/tool/file_tool.rb +9 -4
- data/lib/libis/format/tool/fop_pdf.rb +8 -2
- data/lib/libis/format/tool/office_to_pdf.rb +9 -6
- data/lib/libis/format/tool/pdf_copy.rb +8 -2
- data/lib/libis/format/tool/pdf_merge.rb +7 -1
- data/lib/libis/format/tool/pdf_optimizer.rb +8 -2
- data/lib/libis/format/tool/pdf_split.rb +8 -2
- data/lib/libis/format/tool/pdf_to_pdfa.rb +7 -1
- data/lib/libis/format/tool/pdfa_validator.rb +13 -2
- data/lib/libis/format/version.rb +1 -1
- data/libis-format.gemspec +5 -0
- data/spec/converter_fop_spec.rb +9 -10
- data/spec/converter_repository_spec.rb +5 -1
- data/spec/data/xml/ead2fo_pdf.xsl +6 -6
- data/spec/data/xml/header_nolink_pdf.xsl +2 -2
- data/spec/data/xml/scope_eadToHTML.xsl +1 -1
- data/spec/data/xml/scope_xmlToEAD_dom.xsl +167 -165
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 495a17a421b0c23121d7e38feb91755b0dbfdfd0
|
4
|
+
data.tar.gz: e6b9687dca16d98c3e1c67dc6d89f90e20989acc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6c5fb037d0d5de37a0020d043401335db1874045f945981cab6c5edf9b4bb2cad212cde590dbdfa210740683301f0e5e9e17af838d01a05d42a499736825e81
|
7
|
+
data.tar.gz: dd65ca5bc986263ac03be6812bdab42a939746bc5c23182d92123a66c44d4e2f0cda0b6a80b07caaf027a5f523ec4d46e7ad826ab9500cec72820a54deffc0ac
|
data/lib/libis/format/config.rb
CHANGED
@@ -24,6 +24,21 @@ module Libis
|
|
24
24
|
Config[:type_database] = File.join(Libis::Format::DATA_DIR, 'types.yml')
|
25
25
|
Config[:raw_audio_convert_cmd] = 'sox %s -e signed -b 16 -t wav %s rate %d channels %d'
|
26
26
|
Config[:watermark_font] = '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf'
|
27
|
+
Config[:timeouts] = {
|
28
|
+
droid: 5 * 60,
|
29
|
+
ffmpeg: 5 * 60,
|
30
|
+
fido: 5 * 60,
|
31
|
+
file_tool: 5 * 60,
|
32
|
+
fop: 5 * 60,
|
33
|
+
identification_tool: 5 * 60,
|
34
|
+
office_to_pdf: 5 * 60,
|
35
|
+
pdf_copy: 5 * 60,
|
36
|
+
pdf_merge: 5 * 60,
|
37
|
+
pdf_optimizer: 5 * 60,
|
38
|
+
pdf_split: 5 * 60,
|
39
|
+
pdf_to_pdfa: 5 * 60,
|
40
|
+
pdfa_validator: 5 * 60,
|
41
|
+
}
|
27
42
|
|
28
43
|
end
|
29
44
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
1
|
require_relative 'base'
|
4
2
|
|
5
3
|
module Libis
|
@@ -29,61 +27,71 @@ module Libis
|
|
29
27
|
return nil
|
30
28
|
end
|
31
29
|
|
32
|
-
doc = nil
|
33
|
-
begin
|
34
|
-
doc = Nokogiri::XML(File.read(source)) do |config|
|
35
|
-
config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NOBLANKS
|
36
|
-
end
|
37
|
-
rescue Nokogiri::XML::SyntaxError => e
|
38
|
-
if e.fatal? || e.error?
|
39
|
-
error "Error parsing XML input '#{source}': #{e.messsage} @ #{e.backtrace[0]}"
|
40
|
-
return nil
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
30
|
unless @options[:xsl_file]
|
45
31
|
error 'No xsl_file supplied'
|
46
32
|
return nil
|
47
33
|
end
|
48
34
|
|
49
|
-
|
35
|
+
FileUtils.mkpath(File.dirname(target))
|
50
36
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
37
|
+
if RUBY_PLATFORM == "java"
|
38
|
+
require 'saxon-xslt'
|
39
|
+
xsl = Saxon.XSLT(File.open(@options[:xsl_file]))
|
40
|
+
xml = Saxon.XML(File.open(source))
|
41
|
+
result = xsl.transform(xml)
|
42
|
+
File.open(target, 'w') {|f| f.write(result.to_s)}
|
43
|
+
else
|
44
|
+
require 'nokogiri'
|
45
|
+
|
46
|
+
doc = nil
|
47
|
+
begin
|
48
|
+
doc = Nokogiri::XML(File.read(source)) do |config|
|
49
|
+
config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NOBLANKS
|
50
|
+
end
|
51
|
+
rescue Nokogiri::XML::SyntaxError => e
|
52
|
+
if e.fatal? || e.error?
|
53
|
+
error "Error parsing XML input '#{source}': #{e.messsage} @ #{e.backtrace[0]}"
|
54
|
+
return nil
|
55
|
+
end
|
56
|
+
end
|
55
57
|
|
56
|
-
|
58
|
+
file = @options[:xsl_file]
|
57
59
|
|
58
|
-
|
60
|
+
unless File.file?(file) && File.exist?(file) && File.readable?(file)
|
61
|
+
error "XSL file '#{@options[:xsl_file]}' does not exist or is not readable"
|
62
|
+
return nil
|
63
|
+
end
|
59
64
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
xsl = nil
|
66
|
+
|
67
|
+
begin
|
68
|
+
fp = File.open(file, 'r')
|
69
|
+
xsl = Nokogiri::XSLT(fp) do |config|
|
70
|
+
config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NOBLANKS
|
71
|
+
end
|
72
|
+
rescue Nokogiri::XML::SyntaxError => e
|
73
|
+
if e.fatal? || e.error?
|
74
|
+
error "Error parsing XSL input '#{file}': #{e.message} @ #{e.backtrace[0]}"
|
75
|
+
return nil
|
76
|
+
end
|
77
|
+
ensure
|
78
|
+
fp.close
|
64
79
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
80
|
+
|
81
|
+
begin
|
82
|
+
target_xml = xsl.transform(doc)
|
83
|
+
fp = File.open(target, 'w')
|
84
|
+
fp.write(target_xml)
|
85
|
+
rescue Exception => e
|
86
|
+
error "Error transforming '#{source}' with '#{file}': #{e.message} @ #{e.backtrace[0]}"
|
68
87
|
return nil
|
88
|
+
ensure
|
89
|
+
fp.close unless fp.nil? or fp.closed?
|
69
90
|
end
|
70
|
-
ensure
|
71
|
-
fp.close
|
72
|
-
end
|
73
91
|
|
74
|
-
|
75
|
-
target_xml = xsl.transform(doc)
|
76
|
-
fp = File.open(target, 'w')
|
77
|
-
fp.write(target_xml)
|
78
|
-
rescue Exception => e
|
79
|
-
error "Error transforming '#{source}' with '#{file}': #{e.message} @ #{e.backtrace[0]}"
|
80
|
-
return nil
|
81
|
-
ensure
|
82
|
-
fp.close
|
92
|
+
target
|
83
93
|
end
|
84
94
|
|
85
|
-
target
|
86
|
-
|
87
95
|
end
|
88
96
|
|
89
97
|
end
|
@@ -74,8 +74,16 @@ module Libis
|
|
74
74
|
'-p', profile,
|
75
75
|
'-q'
|
76
76
|
]
|
77
|
-
|
78
|
-
|
77
|
+
timeout = Libis::Format::Config[:timeouts][:droid]
|
78
|
+
result = Libis::Tools::Command.run(
|
79
|
+
Libis::Format::Config[:droid_path], *args,
|
80
|
+
timeout: timeout,
|
81
|
+
kill_after: timeout * 2
|
82
|
+
)
|
83
|
+
result[:err].select! {|x| x =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} ERROR /}
|
84
|
+
raise RuntimeError, "#{self.class} report took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
85
|
+
raise RuntimeError, "#{self.class} report errors: #{result[:err].join("\n")}" unless result[:err].empty?
|
86
|
+
|
79
87
|
File.delete profile
|
80
88
|
end
|
81
89
|
|
@@ -83,10 +91,18 @@ module Libis
|
|
83
91
|
args = []
|
84
92
|
files = (file_or_list.is_a?(Array)) ? file_or_list.map(&:escape_for_string) : [file_or_list.escape_for_string]
|
85
93
|
files.each {|file| args << '-a' << file}
|
86
|
-
args << '-
|
94
|
+
args << '-q'
|
95
|
+
args << '-p' << profile
|
87
96
|
args << '-R' if recursive
|
88
|
-
|
89
|
-
|
97
|
+
timeout = Libis::Format::Config[:timeouts][:droid]
|
98
|
+
result = Libis::Tools::Command.run(
|
99
|
+
Libis::Format::Config[:droid_path], *args,
|
100
|
+
timeout: timeout,
|
101
|
+
kill_after: timeout * 2
|
102
|
+
)
|
103
|
+
result[:err].select! {|x| x =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} ERROR /}
|
104
|
+
raise RuntimeError, "#{self.class} profile took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
105
|
+
raise RuntimeError, "#{self.class} profile errors: #{result[:err].join("\n")}" unless result[:err].empty?
|
90
106
|
end
|
91
107
|
|
92
108
|
def profile_file_name
|
@@ -25,12 +25,17 @@ module Libis
|
|
25
25
|
opts += options[:filter] unless options[:filter].empty?
|
26
26
|
opts += options[:output] unless options[:output].empty?
|
27
27
|
opts << target
|
28
|
-
result = Libis::Tools::Command.run(Libis::Format::Config[:ffmpeg_path], *opts)
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
timeout = Libis::Format::Config[:timeouts][:ffmpeg]
|
30
|
+
result = Libis::Tools::Command.run(
|
31
|
+
Libis::Format::Config[:ffmpeg_path], *opts,
|
32
|
+
timeout: timeout,
|
33
|
+
kill_after: timeout * 2
|
34
|
+
)
|
35
|
+
|
36
|
+
raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
37
|
+
raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0
|
38
|
+
|
34
39
|
warn "FFMpeg warnings: #{(result[:err] + result[:out]).join("\n")}" unless result[:err].empty?
|
35
40
|
|
36
41
|
result[:out]
|
@@ -74,17 +74,23 @@ module Libis
|
|
74
74
|
args << '-q'
|
75
75
|
|
76
76
|
# Run command and capture results
|
77
|
-
|
77
|
+
timeout = Libis::Format::Config[:timeouts][:fido]
|
78
|
+
result = ::Libis::Tools::Command.run(
|
79
|
+
Libis::Format::Config[:fido_path], *args,
|
80
|
+
timeout: timeout,
|
81
|
+
kill_after: timeout * 2
|
82
|
+
)
|
78
83
|
|
79
84
|
# Log warning if needed
|
80
|
-
raise RuntimeError, "
|
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?
|
81
87
|
|
82
88
|
# Parse output (CSV) text into array and return result
|
83
89
|
keys = [:status, :time, :puid, :format_name, :format_version, :filesize, :filepath, :mimetype, :matchtype]
|
84
|
-
|
90
|
+
data = CSV.parse(result[:out].join("\n"))
|
85
91
|
.map {|a| Hash[keys.zip(a)]}
|
86
92
|
.select {|a| a[:status] == 'OK'}
|
87
|
-
|
93
|
+
data.each do |r|
|
88
94
|
r.delete(:time)
|
89
95
|
r.delete(:status)
|
90
96
|
r.delete(:filesize)
|
@@ -59,13 +59,18 @@ module Libis
|
|
59
59
|
opts << filename.escape_for_string if filename
|
60
60
|
|
61
61
|
# Run the UNIX file command and capture the results
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
timeout = Libis::Format::Config[:timeouts][:file_tool]
|
63
|
+
result = ::Libis::Tools::Command.run(
|
64
|
+
'file', *opts,
|
65
|
+
timeout: timeout,
|
66
|
+
kill_after: timeout * 2
|
67
|
+
)
|
65
68
|
|
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?
|
66
71
|
|
67
72
|
# Parse output text into array and return result
|
68
|
-
|
73
|
+
result[:out].map do |line|
|
69
74
|
r = line.split(/:\s+/)
|
70
75
|
{filepath: r[0], mimetype: r[1], matchtype: 'magic', tool: :file}
|
71
76
|
end
|
@@ -23,14 +23,20 @@ module Libis
|
|
23
23
|
# TODO: import library and execute in current VM. For now do exactly as in MRI.
|
24
24
|
end
|
25
25
|
|
26
|
-
Libis::
|
26
|
+
timeout = Libis::Format::Config[:timeouts][:fop]
|
27
|
+
result = Libis::Tools::Command.run(
|
27
28
|
Libis::Format::Config[:java_path],
|
28
29
|
"-Dfop.home=#{File.dirname(Libis::Format::Config[:fop_jar])}",
|
29
30
|
'-jar', Libis::Format::Config[:fop_jar],
|
30
31
|
'-fo', xml,
|
31
|
-
'-pdf', target
|
32
|
+
'-pdf', target,
|
33
|
+
timeout: timeout,
|
34
|
+
kill_after: timeout * 2
|
32
35
|
)
|
33
36
|
|
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
|
39
|
+
|
34
40
|
end
|
35
41
|
end
|
36
42
|
|
@@ -31,19 +31,22 @@ module Libis
|
|
31
31
|
|
32
32
|
export_filter = options[:export_filter] || 'pdf'
|
33
33
|
|
34
|
+
timeout = Libis::Format::Config[:timeouts][:office_to_pdf]
|
34
35
|
result = Libis::Tools::Command.run(
|
35
36
|
Libis::Format::Config[:soffice_path], '--headless',
|
36
37
|
'--convert-to', export_filter,
|
37
|
-
'--outdir', workdir, src_file
|
38
|
+
'--outdir', workdir, src_file,
|
39
|
+
timeout: timeout,
|
40
|
+
kill_after: timeout * 2
|
38
41
|
)
|
39
42
|
|
40
|
-
|
41
|
-
|
42
|
-
return false
|
43
|
-
end
|
43
|
+
raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
44
|
+
raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
|
44
45
|
|
45
46
|
FileUtils.copy tgt_file, target, preserve: true
|
46
|
-
|
47
|
+
|
48
|
+
ensure
|
49
|
+
FileUtils.rmtree workdir rescue nil
|
47
50
|
|
48
51
|
result[:out]
|
49
52
|
end
|
@@ -23,15 +23,21 @@ module Libis
|
|
23
23
|
# TODO: import library and execute in current VM. For now do exactly as in MRI.
|
24
24
|
end
|
25
25
|
|
26
|
-
Libis::
|
26
|
+
timeout = Libis::Format::Config[:timeouts][:pdf_copy]
|
27
|
+
result = Libis::Tools::Command.run(
|
27
28
|
Libis::Format::Config[:java_path],
|
28
29
|
'-cp', Libis::Format::Config[:pdf_tool],
|
29
30
|
'CopyPdf',
|
30
31
|
'--file_input', source,
|
31
32
|
'--file_output', target,
|
32
|
-
*options
|
33
|
+
*options,
|
34
|
+
timeout: timeout,
|
35
|
+
kill_after: timeout * 2
|
33
36
|
)
|
34
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
|
+
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
@@ -24,15 +24,21 @@ module Libis
|
|
24
24
|
# TODO: import library and execute in current VM. For now do exactly as in MRI.
|
25
25
|
end
|
26
26
|
|
27
|
-
Libis::
|
27
|
+
timeout = Libis::Format::Config[:timeouts][:pdf_merge]
|
28
|
+
result = Libis::Tools::Command.run(
|
28
29
|
Libis::Format::Config[:java_path],
|
29
30
|
'-cp', Libis::Format::Config[:pdf_tool],
|
30
31
|
'MergePdf',
|
31
32
|
'--file_output', target,
|
32
33
|
*options,
|
33
34
|
*source,
|
35
|
+
timeout: timeout,
|
36
|
+
kill_after: timeout * 2
|
34
37
|
)
|
35
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?
|
41
|
+
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
@@ -19,7 +19,8 @@ module Libis
|
|
19
19
|
|
20
20
|
def run(source, target, quality)
|
21
21
|
|
22
|
-
Libis::
|
22
|
+
timeout = Libis::Format::Config[:timeouts][:pdf_optimizer]
|
23
|
+
result = Libis::Tools::Command.run(
|
23
24
|
'gs',
|
24
25
|
'-sDEVICE=pdfwrite',
|
25
26
|
'-dCompatibilityLevel=1.4',
|
@@ -27,9 +28,14 @@ module Libis
|
|
27
28
|
'-dNOPAUSE',
|
28
29
|
'-dBATCH',
|
29
30
|
"-sOutputFile=#{target}",
|
30
|
-
"#{source}"
|
31
|
+
"#{source}",
|
32
|
+
timeout: timeout,
|
33
|
+
kill_after: timeout * 2
|
31
34
|
)
|
32
35
|
|
36
|
+
raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
37
|
+
raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
|
38
|
+
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
@@ -23,15 +23,21 @@ module Libis
|
|
23
23
|
# TODO: import library and execute in current VM. For now do exactly as in MRI.
|
24
24
|
end
|
25
25
|
|
26
|
-
Libis::
|
26
|
+
timeout = Libis::Format::Config[:timeouts][:pdf_split]
|
27
|
+
result = Libis::Tools::Command.run(
|
27
28
|
Libis::Format::Config[:java_path],
|
28
29
|
'-cp', Libis::Format::Config[:pdf_tool],
|
29
30
|
'SplitPdf',
|
30
31
|
'--file_input', source,
|
31
32
|
'--file_output', target,
|
32
|
-
*options
|
33
|
+
*options,
|
34
|
+
timeout: timeout,
|
35
|
+
kill_after: timeout * 2
|
33
36
|
)
|
34
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
|
+
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
@@ -37,6 +37,7 @@ module Libis
|
|
37
37
|
gsub('[** Fill in ICC reference name **]', icc_info[:icc_ref])
|
38
38
|
end
|
39
39
|
|
40
|
+
timeout = Libis::Format::Config[:timeouts][:pdf_to_pdfa]
|
40
41
|
result = Libis::Tools::Command.run(
|
41
42
|
Libis::Format::Config[:ghostscript_path],
|
42
43
|
'-dBATCH', '-dNOPAUSE', '-dNOOUTERSAVE',
|
@@ -46,9 +47,14 @@ module Libis
|
|
46
47
|
"-sOutputICCProfile=#{icc_file}",
|
47
48
|
'-o', File.absolute_path(target),
|
48
49
|
def_filename,
|
49
|
-
source
|
50
|
+
source,
|
51
|
+
timeout: timeout,
|
52
|
+
kill_after: timeout * 2
|
50
53
|
)
|
51
54
|
|
55
|
+
raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
56
|
+
raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
|
57
|
+
|
52
58
|
FileUtils.rm [icc_file, def_filename].compact, force: true
|
53
59
|
|
54
60
|
unless Format::Tool::PdfaValidator.run(target)
|
@@ -21,6 +21,7 @@ module Libis
|
|
21
21
|
|
22
22
|
src_file = File.absolute_path(source)
|
23
23
|
|
24
|
+
timeout = Libis::Format::Config[:timeouts][:pdfa_validator]
|
24
25
|
if (pdfa = Libis::Format::Config[:pdfa_path])
|
25
26
|
# Keep it clean: tool generates fontconfig/ cache dir in current working dir
|
26
27
|
previous_wd = Dir.getwd
|
@@ -31,9 +32,14 @@ module Libis
|
|
31
32
|
'--noxml',
|
32
33
|
'--level', 'B',
|
33
34
|
'--verb', '0',
|
34
|
-
src_file
|
35
|
+
src_file,
|
36
|
+
timeout: timeout,
|
37
|
+
kill_after: timeout * 2
|
35
38
|
)
|
36
39
|
|
40
|
+
raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
41
|
+
raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?
|
42
|
+
|
37
43
|
Dir.chdir(previous_wd)
|
38
44
|
|
39
45
|
unless result[:out].any? {|line| line =~ /^VLD-\[PASS\]/}
|
@@ -46,8 +52,13 @@ module Libis
|
|
46
52
|
result = Libis::Tools::Command.run(
|
47
53
|
Libis::Format::Config[:java_path],
|
48
54
|
'-jar', jar,
|
49
|
-
src_file
|
55
|
+
src_file,
|
56
|
+
timeout: timeout,
|
57
|
+
kill_after: timeout * 2
|
50
58
|
)
|
59
|
+
raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
|
60
|
+
raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:err].empty?
|
61
|
+
|
51
62
|
unless result[:status] == 0
|
52
63
|
warn "Validator failed to validate the PDF file '%s' against PDF/A-1B constraints:\n%s", source,
|
53
64
|
result[:out].join("\n")
|
data/lib/libis/format/version.rb
CHANGED
data/libis-format.gemspec
CHANGED
@@ -27,6 +27,11 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
28
28
|
spec.add_development_dependency 'awesome_print'
|
29
29
|
spec.add_development_dependency 'equivalent-xml', '~> 0.5'
|
30
|
+
if spec.platform == Gem::Platform::JAVA
|
31
|
+
spec.add_development_dependency 'saxon-xslt'
|
32
|
+
else
|
33
|
+
spec.add_development_dependency 'nokogiri'
|
34
|
+
end
|
30
35
|
|
31
36
|
spec.add_runtime_dependency 'libis-tools', '~> 0.9.57'
|
32
37
|
spec.add_runtime_dependency 'os', '= 0.9.6'
|
data/spec/converter_fop_spec.rb
CHANGED
@@ -21,16 +21,15 @@ describe 'Converters' do
|
|
21
21
|
let(:data_dir) {File.join(file_dir, 'data', 'xml')}
|
22
22
|
|
23
23
|
it 'converts XML-FO to PDF' do
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
# expect(tgt.root).to be_equivalent_to(cmp.root).respecting_element_order
|
24
|
+
if File.exist?(Libis::Format::Config[:fop_jar])
|
25
|
+
src_file = File.join data_dir, '134476_fo.XML'
|
26
|
+
tgt_file = File.join '', 'tmp', '134476_ead.pdf'
|
27
|
+
cmp_file = File.join data_dir, '134476_ead.pdf'
|
28
|
+
FileUtils.remove tgt_file, force: true
|
29
|
+
FileUtils.mkdir_p File.dirname(tgt_file)
|
30
|
+
result = converter.convert src_file, tgt_file, :PDF
|
31
|
+
expect(result).to eq tgt_file
|
32
|
+
end
|
34
33
|
end
|
35
34
|
|
36
35
|
end
|
@@ -13,7 +13,7 @@ describe 'Converters' do
|
|
13
13
|
context 'Repository' do
|
14
14
|
|
15
15
|
it 'loads all converters' do
|
16
|
-
expect(repository.get_converters.size).to eq
|
16
|
+
expect(repository.get_converters.size).to eq 8
|
17
17
|
# noinspection RubyResolve
|
18
18
|
expect(repository.get_converters.map(&:to_s)).to include 'Libis::Format::Converter::ImageConverter'
|
19
19
|
# noinspection RubyResolve
|
@@ -26,6 +26,10 @@ describe 'Converters' do
|
|
26
26
|
expect(repository.get_converters.map(&:to_s)).to include 'Libis::Format::Converter::AudioConverter'
|
27
27
|
# noinspection RubyResolve
|
28
28
|
expect(repository.get_converters.map(&:to_s)).to include 'Libis::Format::Converter::VideoConverter'
|
29
|
+
# noinspection RubyResolve
|
30
|
+
expect(repository.get_converters.map(&:to_s)).to include 'Libis::Format::Converter::XsltConverter'
|
31
|
+
# noinspection RubyResolve
|
32
|
+
expect(repository.get_converters.map(&:to_s)).to include 'Libis::Format::Converter::FopPdfConverter'
|
29
33
|
end
|
30
34
|
|
31
35
|
it 'creates simple converter chain' do
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<?xml version="1.0" encoding="windows-1252"?>
|
2
|
-
<xsl:stylesheet version="
|
2
|
+
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
|
3
3
|
<xsl:strip-space elements="*"/>
|
4
4
|
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
|
5
5
|
<xsl:include href="header_nolink_pdf.xsl"/>
|
6
6
|
<!-- Creates the body of the finding aid.-->
|
7
7
|
<xsl:template match="/ead">
|
8
|
-
<fo:root>
|
8
|
+
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
|
9
9
|
<fo:layout-master-set>
|
10
10
|
<fo:simple-page-master master-name="pages" page-width="21cm" page-height="29.7cm"
|
11
11
|
margin-top="1cm" margin-bottom="1cm"
|
@@ -437,10 +437,10 @@
|
|
437
437
|
<fo:list-item-label end-indent="label-end()">
|
438
438
|
<fo:block font-family="Times">
|
439
439
|
<xsl:variable name="value-attr">
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
440
|
+
<xsl:choose>
|
441
|
+
<xsl:when test="../@start"><xsl:number value="position() + ../@start - 1"/></xsl:when>
|
442
|
+
<xsl:otherwise><xsl:number value="position()"/></xsl:otherwise>
|
443
|
+
</xsl:choose>
|
444
444
|
</xsl:variable>
|
445
445
|
</fo:block>
|
446
446
|
</fo:list-item-label>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<?xml version="1.0" encoding="windows-1252"?>
|
2
|
-
<xsl:stylesheet version="
|
2
|
+
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
3
3
|
|
4
4
|
<xsl:variable name="REC_ID" select="ead/eadheader/eadid/@identifier"/>
|
5
5
|
<xsl:variable name="TITLE_HEADER" select="ead/eadheader[1]/filedesc[1]/titlestmt[1]/titleproper[1]"/>
|
@@ -117,4 +117,4 @@
|
|
117
117
|
</xsl:variable>
|
118
118
|
|
119
119
|
|
120
|
-
</xsl:stylesheet>
|
120
|
+
</xsl:stylesheet>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<?xml version="1.0" encoding="windows-1252"?>
|
2
2
|
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
|
3
|
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="
|
3
|
+
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
|
4
4
|
xmlns:ead="urn:isbn:1-931666-22-9"
|
5
5
|
xmlns:ns2="http://www.w3.org/1999/xlink">
|
6
6
|
<xsl:strip-space elements="*"/>
|