Class: DocverterServer::Runner::PDF

Inherits:
Base
  • Object
show all
Defined in:
lib/docverter-server/runner/pdf.rb

Defined Under Namespace

Classes: UserAgent

Instance Attribute Summary

Attributes inherited from Base

#directory, #input_filename, #options

Instance Method Summary collapse

Methods inherited from Base

#generate_output_filename, #initialize, #run_command, #with_manifest

Constructor Details

This class inherits a constructor from DocverterServer::Runner::Base

Instance Method Details

#build_renderer(dom) ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/docverter-server/runner/pdf.rb', line 28

def build_renderer(dom)
  renderer = ITextRenderer.new
  agent = UserAgent.new(renderer.output_device)
  agent.shared_context = renderer.shared_context
  renderer.shared_context.user_agent_callback = agent
  renderer.set_document(dom, path_to_url(directory))
  renderer.layout
  renderer
end

#create_java_dom(html) ⇒ Object



18
19
20
21
22
23
24
25
26
# File 'lib/docverter-server/runner/pdf.rb', line 18

def create_java_dom(html)
  cleaner = HtmlCleaner.new(ConfigFileTagProvider.new(java.io.File.new(File.expand_path('../../jars/tag_config.xml', __FILE__))))
  props = cleaner.get_properties
  props.setTranslateSpecialEntities(true)
  props.setAdvancedXmlEscape(true)
  props.setRecognizeUnicodeChars(true)
  node = cleaner.clean(html)
  DomSerializer.new(props, true).createDOM(node)
end

#encrypt_pdf(io, manifest) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/docverter-server/runner/pdf.rb', line 63

def encrypt_pdf(io, manifest)
  temp = Tempfile.new('temp')
  temp.write io.string
  temp.flush
  temp.rewind
  out = StringIO.new
  reader = PdfReader.new(temp.to_inputstream)
  stamper = PdfStamper.new(reader, out.to_outputstream)
  stamper.setEncryption(PdfEncryption::STANDARD_ENCRYPTION_40, manifest['pdf_username'], manifest['pdf_password'], 1)
  stamper.close
  out
end

#path_to_url(path) ⇒ Object



38
39
40
# File 'lib/docverter-server/runner/pdf.rb', line 38

def path_to_url(path)
  java.io.File.new(path).to_uri.to_url.to_string
end

#runObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/docverter-server/runner/pdf.rb', line 42

def run
  with_manifest do |manifest|

    io = StringIO.new
    dom = create_java_dom(File.open(input_filename).read)

    renderer = build_renderer(dom)
    renderer.create_pdf(io.to_outputstream)

    if manifest['pdf_username'] && manifest['pdf_password']
      io = encrypt_pdf(io, manifest)
    end

    @output = generate_output_filename('pdf')
    File.open(@output, "w+") do |f|
      f.write(io.string)
    end
  end
  @output
end