23
24
25
26
27
28
29
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
|
# File 'lib/libis/format/tool/pdf_to_pdfa.rb', line 23
def run(source, target = nil, options = nil)
tmp_target = Tools::TempFile.name(File.basename(source, '.*'), '.pdf')
target ||= tmp_target
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('[** Fill in ICC profile location **]', icc_file).
gsub('[** Fill in ICC reference name **]', icc_info[:icc_ref])
end
timeout = Libis::Format::Config[:timeouts][:pdf_to_pdfa]
result = Libis::Tools::Command.run(
Libis::Format::Config[:ghostscript_cmd],
'-dBATCH', '-dNOPAUSE', '-dNOOUTERSAVE',
'-sColorConversionStrategy=/UseDeviceIndependentColor',
"-sProcessColorModel=#{icc_info[:device]}",
'-sDEVICE=pdfwrite', '-dPDFA', '-dPDFACompatibilityPolicy=1',
"-sOutputICCProfile=#{icc_file}",
'-o', File.absolute_path(target),
def_filename,
source,
timeout: timeout,
kill_after: timeout * 2
)
raise RuntimeError, "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
FileUtils.rm [icc_file, def_filename].compact, force: true
unless Format::Tool::PdfaValidator.run(target)
result[:status] = -999
result[:err] << 'Failed to validate generated PDF/A file.'
end
result
end
|