Class: Libis::Format::Tool::PdfToPdfa

Inherits:
Object
  • Object
show all
Includes:
Tools::Logger
Defined in:
lib/libis/format/tool/pdf_to_pdfa.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.run(source, target = nil, options = {}) ⇒ Object



19
20
21
# File 'lib/libis/format/tool/pdf_to_pdfa.rb', line 19

def self.run(source, target = nil, options = {})
  self.new.run source, target, options
end

Instance Method Details

#run(source, target = nil, options = nil) ⇒ Object

Raises:

  • (RuntimeError)


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
66
# 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_path],
      '-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]
  raise RuntimeError, "#{self.class} errors: #{result[:err].join("\n")}" unless result[:status] == 0 && result[:err].empty?

  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