Pdfkit не создает PDF файлы
У меня есть приложение rails 3.1, которое создает pdf-документы с использованием pdfkit, и все работает как указано, за исключением того факта, что сгенерированные PDF файлы не имеют никакого стиля. Я предполагаю, что wkhtmltopdf не имеет доступа к моим таблицам стилей и что это не большая проблема, чем это. Кто-нибудь подскажет, как вы разрешаете доступ к этим таблицам стилей? Я в основном следил за railscast # 220 по этому вопросу, однако мне пришлось создать новый инициализатор, чтобы получить pdfkit для работы с rails 3.1.
Это инициализатор, который мне пришлось использовать, чтобы pdfkit работал с rails 3.1
ActionController::Base.asset_host = Proc.new { |source, request|
if request.env["REQUEST_PATH"].include? ".pdf"
"file://#{Rails.root.join('public')}"
else
"#{request.protocol}#{request.host_with_port}"
end
}
Ссылка на pdf выглядит так:
<%= link_to 'Download PDF', load_path(@load, :format => "pdf") %>
Это даст мне ссылку на pdf, который не имеет стиля.
В моем приложении .rb я настроил pdfkit как таковой:
config.middleware.use PDFKit::Middleware, :print_media_type => true
Я также добавил это в свой файл layouts/application.html.erb:
<%= stylesheet_link_tag "application", :media => "all" %>
Ответы
Ответ 1
Кража нескольких строк из кода промежуточного программного обеспечения, найденного в https://github.com/pdfkit/pdfkit/blob/master/lib/pdfkit/middleware.rb
Вы можете использовать:
root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/"
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2')
Мой пример:
html = render_to_string #render current action to string
root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/"
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2')
kit = PDFKit.new(html, :print_media_type => true)
Ответ 2
Я столкнулся с этой проблемой, и выяснилось, что когда конвейер активов был добавлен в Rails 3.1, у pdfkit есть проблемы со ссылками на таблицы стилей. См. вопрос GitHub об этой проблеме.
В итоге я перешел на wicked_pdf и очень доволен этим. Они решили эту проблему, и она отлично работает на Rails 3.2.x(не пробовала 3.1.x).
Ответ 3
Для меня это была проблема с установкой для ubuntu. Я просто переустановил из источника:
# first, installing dependencies
sudo aptitude install openssl build-essential xorg libssl-dev
# for 64bits OS
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-amd64.tar.bz2
tar xvjf wkhtmltopdf-0.9.9-static-amd64.tar.bz2
mv wkhtmltopdf-amd64 /usr/local/bin/wkhtmltopdf
chmod +x /usr/local/bin/wkhtmltopdf
# for 32bits OS
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-i386.tar.bz2
tar xvjf wkhtmltopdf-0.9.9-static-i386.tar.bz2
mv wkhtmltopdf-i386 /usr/local/bin/wkhtmltopdf
chmod +x /usr/local/bin/wkhtmltopdf
И теперь все работает для меня. Поэтому мой совет не устанавливает wkhtmltopdf с помощью этой команды sudo apt-get install wkhtmltopdf
и устанавливает его из источников. Полный инструкции
для процесса установки
Ответ 4
Я знаю, что вы ищете решение, которое будет отображать всю страницу, просто напоминание для пользователей Google, что существует проблема без проблем.
class DocumentController < ApplicationController
def show
@document = Document.last
# ... implement your respond_to
kit = PDFKit.new(@document.content, :page_size => 'Letter')
kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/pdf.css"
send_data kit.to_pdf, :filename => "#{@document.title}.pdf", :type => 'application/pdf'
end
end
теперь pdf.css должен быть css, поэтому теоретически, если вам нужно загрузить sass, загрузите его из предварительно скомпилированного public/assets/
Ответ 5
Я использовал gem 'wicked_pdf' и его помощники, чтобы включить CSS в страницы. Внутренне, что помощники просто читают все CSS файлы и включаются в саму страницу. Поэтому, если вы предпочитаете использовать PdfKit, попробуйте исследовать, как включать нестрочные таблицы стилей.
Ответ 6
Я успешно запускаю PDFKit на Rails 3.1. Однако я использовал другую настройку.
Сначала у меня была та же проблема, что и вы, но это потому, что stylesheet_link_tag
имеет значение по умолчанию media => "screen"
; явно указывая media => "all"
.