diff --git a/lib/chromium/pdf.rb b/lib/chromium/pdf.rb index 3fca3fd..7e4f9b5 100644 --- a/lib/chromium/pdf.rb +++ b/lib/chromium/pdf.rb @@ -8,30 +8,39 @@ module Chromium module Pdf extend ActiveSupport::Concern + DEFAULT_CHROME_ARGUMENTS = [ + '--headless', + '--disable-gpu', + '--no-pdf-header-footer', + '--run-all-compositor-stages-before-draw', + '--no-sandbox', + '--disable-dev-shm-usage', + '--disable-background-networking' + ].freeze + ## # @param unescaped_filename [String] The filename to save the PDF as. # @param print_url [String] The URL of the page you want to be processed. # @param arguments [Array] An array of arguments to pass to the Chrome binary. # @yield [file, filename] Yields the file object and the filename to the block. # - def generate_pdf!(unescaped_filename, print_url, arguments: ['--headless --disable-gpu']) + def generate_pdf!(unescaped_filename, print_url, arguments: DEFAULT_CHROME_ARGUMENTS, &block) chrome_path = ENV.fetch('GOOGLE_CHROME_BIN', nil) filename = unescaped_filename.gsub('&', 'and') Dir.mktmpdir do |path| filepath = "#{path}/#{filename}" - - chrome_print chrome_path, print_url, filename, filepath, arguments + chrome_print chrome_path, print_url, filename, filepath, arguments, &block end end protected - def chrome_print(chrome_path, print_url, filename, filepath, arguments) - system("LD_PRELOAD='' #{chrome_path} --print-to-pdf='#{filepath}' #{arguments.join(' ')} #{print_url}") + def chrome_print(chrome_path, print_url, filename, filepath, arguments, &block) + Kernel.system("LD_PRELOAD='' #{chrome_path} --print-to-pdf='#{filepath}' #{arguments.join(' ')} #{print_url}") File.open(filepath) do |file| - yield file, filename + block&.call(file, filename) end end end diff --git a/lib/generators/chromium/pdf/install/templates/app/jobs/generate_pdf_job.rb b/lib/generators/chromium/pdf/install/templates/app/jobs/generate_pdf_job.rb index 0b75bdf..b49cc2e 100644 --- a/lib/generators/chromium/pdf/install/templates/app/jobs/generate_pdf_job.rb +++ b/lib/generators/chromium/pdf/install/templates/app/jobs/generate_pdf_job.rb @@ -12,7 +12,7 @@ class GeneratePdfJob < ApplicationJob good_job_control_concurrency_with( enqueue_limit: 1, perform_limit: 1, - key: arguments.first.id + key: -> { "generate_pdf_#{arguments.first.id}" } ) around_perform do |_job, block| diff --git a/test/chromium/test_pdf.rb b/test/chromium/test_pdf.rb index ca67338..6e2f214 100644 --- a/test/chromium/test_pdf.rb +++ b/test/chromium/test_pdf.rb @@ -17,11 +17,24 @@ def test_generate_pdf_calls_chrome_print def test_chrome_print_calls_file_open job = TestGeneratePdfJob.new - File.stub :open, :ran do - result = job.send(:chrome_print, 'chrome', 'url', 'name', 'path', ['argument']) do |_file, filename| - assert_equal 'name', filename + Kernel.stub :system, true do + File.stub :open, :ran do + result = job.send(:chrome_print, 'chrome', 'url', 'name', 'path', ['argument']) do |_file, filename| + assert_equal 'name', filename + end + assert_equal :ran, result + end + end + end + + def test_generate_pdf_yields_to_block + job = TestGeneratePdfJob.new + Kernel.stub :system, true do + File.stub :open, :ran do + job.generate_pdf!('filename', 'url') do |_file, filename| + assert_equal 'filename', filename + end end - assert_equal :ran, result end end end