30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/libis/format/tool/pdf_to_pdfa.rb', line 30
def run(source, target = nil, **options)
tmp_target = Tools::TempFile.name(File.basename(source, '.*'), '.pdf')
target ||= tmp_target
metadata = get_metadata(source)
icc_info = icc_options(options[:colorspace])
icc_file = Tools::TempFile.name(icc_info[:icc_name], '.icc')
FileUtils.cp(File.join(Libis::Format::DATA_DIR, "#{icc_info[:icc_name]}.icc"), icc_file)
def_filename = Tools::TempFile.name('PDFA_def', '.ps')
File.open(def_filename, 'w') do |f|
f.puts File.read(File.join(Libis::Format::DATA_DIR, 'PDFA_def.ps'))
.gsub('[**ICC profile**]', icc_file)
.gsub('[**ICC reference**]', icc_info[:icc_ref])
.gsub('[**METADATA**]', metadata)
end
timeout = Libis::Format::Config[:timeouts][:pdf_to_pdfa]
result = Libis::Tools::Command.run(
Libis::Format::Config[:ghostscript_cmd],
'-q',
'-dBATCH', '-dNOPAUSE', '-dNOOUTERSAVE', '-dNOSAFER',
"-sProcessColorModel=#{icc_info[:device]}",
"-sOutputICCProfile=#{icc_file}",
'-dCompatibilityLevel=1.4',
'-sDEVICE=pdfwrite', '-dPDFA=1', '-dPDFACompatibilityPolicy=1',
'-o', File.absolute_path(target),
def_filename,
source,
timeout:,
kill_after: timeout * 2
)
result[:err] << "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
FileUtils.rm [icc_file, def_filename].compact, force: true
result
end
|