Я пытаюсь создать 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-режима.
Текущий сопровождающий 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
туда вместо использования драгоценного камня.