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
66
67
68
69
70
71
72
73
74
|
# File 'lib/libis/format/tool/pdf_to_pdfa.rb', line 28
def run(source, target = nil, options = nil)
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: timeout,
kill_after: timeout * 2
)
raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
raise "#{self.class} failed with error #{result[:status]}: \n#{(result[:out] + result[:err]).join("\n")}" if result[:status] != 0
FileUtils.rm [icc_file, def_filename].compact, force: true
{
command: result,
files: [target]
}
end
|