PDF не удалось создать в рабочей среде с использованием evil_pdf

Я пытаюсь создать PDF-файл и отобразить его на рабочем сервере. На локальном хосте у меня все работает нормально. Никаких ошибок при создании PDF-файла нет. Но в производстве возникает эта ошибка.

RuntimeError (Failed to execute: ["/home/app/vendor/bundle/ruby/2.7.0/gems/wkhtmltopdf-binary-0.12.6.6/bin/wkhtmltopdf", "--page-size", "A4", "file:////tmp/wicked_pdf20240308-1479705-1jl9481.html", "/tmp/wicked_pdf_generated_file20240308-1479705-112vd26.pdf"] Error: PDF could not be generated! Command Error: pid 1483292 exit 1 /home/app/.rbenv/versions/2.7.6/lib/ruby/2.7.0/bundler/spec_set.rb:86:in'block in materialize': Could not find rake-13.0.6 in any of the sources (Bundler::GemNotFound)

В Gemfile я использовал

 gem 'rails', '~> 5.1.4'

 gem 'wicked_pdf', '~> 2.8'
 gem 'wkhtmltopdf-binary', '~> 0.12.6.6'

В контроллере

 respond_to do |format|
        format.pdf do
          render pdf: 'certificate',
                 template: 'payments/ripicle_receipt.html.haml',
                 layout: 'payments/accounting_pdf.html.haml',
                 delete_temporary_files: true,
                 page_size: 'A4'

файл config/initializers/wicked_pdf.rb. У меня нет настроек в этом файле

На сервере: Ruby 2.7.6p219, версия Bundler 2.1.4, Ubuntu 22.4

Я использую Rails c, попробовал создать PDF-файл. Ничего страшного. Но я запрашиваю в браузере, у него ошибка

Обновлять

Я использую «rails» для запуска сервера. Это работает. Но я запускаю сервер с помощью nginx-passenger, появляется эта ошибка

🤔 А знаете ли вы, что...
Ruby on Rails позволяет использовать компоненты фронтенда, такие как AngularJS или React, с помощью API-режима.


205
1

Ответ:

Решено

Текущий сопровождающий WickedPDF и wkhtmltopdf-binary-gem здесь.

/home/app/vendor/bundle/ruby/2.7.0/gems/wkhtmltopdf-binary-0.12.6.6/bin/wkhtmltopdf это это Ruby-скрипт. Он вызывает верхнюю строку !/usr/bin/env ruby, чтобы выяснить, какой именно двоичный файл является частью wkhtmltopdf_binary_gem для выполнения на вашей производственной платформе.

Таким образом, когда ваше приложение Rails вызывает wkhtmltopdf, пользователь, которого оно запускает, часто не имеет той же среды Ruby, что и приложение (ваше приложение работает в среде, управляемой Bundler, но сценарий оболочки не работает без дополнительной настройки, например установка и настройка rbenv для этого пользователя Linux и настройка его для работы в неинтерактивных оболочках.

Один из способов исправить это — убедиться, что на вашем сервере также установлен wkhtmltopdf_binary как системный драгоценный камень, но может быть сложно синхронизировать версию, установленную в системе, с версией, установленной в вашей Gemfile.lock.

Я бы посоветовал вам либо указать путь к необходимому двоичному файлу (а не Ruby binstub), либо распаковать и скопировать правильный двоичный файл в каталог bin/ вашего приложения и изменить конфигурацию WickedPDF следующим образом:

конфигурация/инициализаторы/wicked_pdf.rb

WickedPdf.configure do |config|
  if Rails.env.production?
    # Path to where the actual gem binary is extracted:
    config.exe_path = "#{ENV['GEM_HOME']}/gems/wkhtmltopdf-binary-#{Gem.loaded_specs['wkhtmltopdf-binary'].version}/bin/wkhtmltopdf_debian_10_amd64"

    # Or a copied binary in the /bin/ path:
    config.exe_path = Rails.root.join('bin/wkhtmltopdf_debian_10_amd64').to_s
  end
end

Или вы можете установить системный пакет для wkhtmltopdf (например, apt-get install wkhtmltopdf) и указать exe_path туда вместо использования драгоценного камня.