class Pdfgen

Public Class Methods

new(html_or_url) click to toggle source
# File lib/pdfgen.rb, line 15
def initialize(html_or_url)
  if html_or_url =~ /\Ahttp|\Afile/
    @url = html_or_url
    @html = nil
  else
    @url = nil
    @html = html_or_url
  end
  @viewport_options = nil
  @emulate_media = nil
  @launch_options = Hash.new
  @wait_for_timeout = nil
  @debug_time = nil
  @url_options = { waitUntil: 'networkidle0' }
end

Public Instance Methods

debug_mode(debug_time) click to toggle source
# File lib/pdfgen.rb, line 52
def debug_mode(debug_time)
  raise TypeError.new("Timeout must be an integer or respond to #to_i") unless debug_time.kind_of?(Integer) || (debug_time.respond_to?(:to_i) && debug_time.to_i)
  @debug_time = debug_time
  self
end
emulate_media(media_type) click to toggle source
# File lib/pdfgen.rb, line 36
def emulate_media(media_type)
  @emulate_media = media_type
  self
end
launch_options(launch_options) click to toggle source
# File lib/pdfgen.rb, line 41
def launch_options(launch_options)
  @launch_options = launch_options
  self
end
set_viewport(viewport_options) click to toggle source
# File lib/pdfgen.rb, line 31
def set_viewport(viewport_options)
  @viewport_options = viewport_options
  self
end
to_pdf(opts = {}) click to toggle source
# File lib/pdfgen.rb, line 63
def to_pdf(opts = {})
  stdin_options = { pdf_options: opts, current_path: Dir.pwd }
  stdin_options = stdin_options.merge(viewport_options: @viewport_options) if @viewport_options
  stdin_options = stdin_options.merge(emulate_media: @emulate_media) if @emulate_media
  stdin_options = stdin_options.merge(wait_for_timeout: @wait_for_timeout) if @wait_for_timeout
  if @debug_time
    stdin_options = stdin_options.merge(wait_for_timeout: @debug_time)
    stdin_options = stdin_options.merge(launch_options: @launch_options.merge(headless: false))
    stdin_options = stdin_options.merge(debug_mode: true)
  else
    stdin_options = stdin_options.merge(launch_options: @launch_options)
  end

  pdf_output = nil
  error_output = nil
  status = nil
  if @html
    file = Tempfile.new('input_html')
    file.write(@html)
    file.close
    pdf_output, error_output, status = Open3.capture3(MAKE_PDF_COMMAND, file.path, stdin_data: stdin_options.to_json)
    file.unlink
  else
    stdin_options = stdin_options.merge(url: @url)
    stdin_options = stdin_options.merge(url_options: @url_options)
    pdf_output, error_output, status = Open3.capture3(MAKE_PDF_COMMAND, stdin_data: stdin_options.to_json)
  end

  unless status.success?
    raise "This error was encountered running node to create the pdf: #{error_output}"
  end
  unless pdf_output
    raise 'There was an error creating the temporary file used to pass the HTML to node.'
  end
  pdf_output
end
url_options(url_options) click to toggle source
# File lib/pdfgen.rb, line 58
def url_options(url_options)
  @url_options = @url_options.merge(url_options)
  self
end
wait_for_timeout(wait_for_timeout) click to toggle source
# File lib/pdfgen.rb, line 46
def wait_for_timeout(wait_for_timeout)
  raise TypeError.new("Timeout must be an integer or respond to #to_i") unless wait_for_timeout.kind_of?(Integer) || (wait_for_timeout.respond_to?(:to_i) && wait_for_timeout.to_i)
  @wait_for_timeout = wait_for_timeout
  self
end