Диаграммы ChartKick не отображаются при рендеринге в PDF с использованием Wicked_PDF

Я использую
Rails 4, Wicked_PDF и Chartkick Gem. Для графиков Google я использую:

‹% = Javascript_include_tag" //www.google.com/jsapi "," chartkik "%>

В представлении html есть диаграммы и все, что и ожидалось. Когда я добавляю .pdf к URL-адресу, PDF-документ отображается в браузере, но диаграммы ChartKick не отображаются.
Следующая ошибка появляется там, где должна быть диаграмма:

Ошибка загрузки диаграммы: адаптер не найден

Я нашел следующее в документации PDFKit.

Ресурсы не включены в PDF: изображения, CSS или JavaScript не загружаются правильно в PDF. Это связано с тем, что wkhtmltopdf не знает, где найти эти файлы. Убедитесь, что вы используете абсолютные пути (начинаются с косой черты) к своим ресурсам. Если вы используете PDFKit для создания PDF-файлов из исходного HTML-кода, убедитесь, что вы используете полные пути (либо пути к файлам, либо URL-адреса, включая домен). В ограниченных серверных средах конфигурация root_url может быть тем, что вы ищете, измените свой хост актива.

Я предполагаю, что wkhtmltopdf не находит ссылку на диаграммы, но я не уверен, как это исправить.
Есть ли у кого-нибудь предложения?

Я нашел эту ссылку:
Визуализировать jQuery в wicked_pdf

Где Unixmonkey помогает FattRyan решить эту проблему для Highcharts.

Может ли кто-нибудь помочь, как установить этот wicked_pdf_javascript_include_tag, чтобы Wicket_PDF принимал диаграммы из Chartkick с использованием диаграмм Google?


person user3334207    schedule 13.10.2014    source источник


Ответы (5)


Вы должны указать протокол http или https при ссылке на CDN внутри макета pdf.

Также chartkick обслуживается через конвейер ресурсов, поэтому используйте вместо этого wicked_pdf_javascript_include_tag.

Замените эту строку:

<%= javascript_include_tag "//www.google.com/jsapi", "chartkik" %>

С этим:

<%= javascript_include_tag "https://www.google.com/jsapi" %>
<%= wicked_pdf_javascript_include_tag "chartkick" %>

Вот как я это делаю в своем проекте.

Ваше здоровье.

person thesubroot    schedule 08.11.2014
comment
Большое спасибо за вашу помощь в этом. Ваше предложение решило мою проблему. - person user3334207; 12.11.2014
comment
У кого-нибудь еще была проблема с отображением графиков только с шириной 50% в PDF? - person Alex Villa; 09.03.2015
comment
Чтобы настроить ширину, я указал ее в настройках библиотеки. - person jhoanna; 09.05.2015
comment
мой график не отображался, пока я не указал фиксированную ширину при вызове column_chart - person Lluís; 15.02.2017

Я немного боролся с этим, и другие ответы были для меня лишь частично полезны. Я хотел бы рассказать всем больше подробностей в будущем:

Чтобы исправить это, я сделал четыре основных вещи:

(1) Не использовать подход промежуточного программного обеспечения, а вместо этого использовать встроенные PDF-файлы с рубиновым кодом на основе созданного вами макета PDF.

   #Example layout file
   #app/views/layout/pdf.pdf.rb

   <!DOCTYPE html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <%= wicked_pdf_stylesheet_link_tag "print" %> #print specific stylesheet
        <%= yield :head %>
      </head>
      <body>
        <h1>PDF Report</h1>
        <%= yield %>
      </body>
    </html>

(2) использование помощников ресурсов wicked_pdf для загрузки ТОЛЬКО того javascript, который нам нужен на этих страницах для ресурсов, которые мы храним в приложении (все ресурсы на основе CDN могут быть загружены с помощью обычного javascript_include_tag)

#Example page template for a PDF you're downloading
#app/views/users/profile.pdf.erb

<% content_for :head do %>
  <%= javascript_include_tag "some_cdn.com" %>
  <%= wicked_pdf_javascript_include_tag "chartkick" %>
<% end %>

<p>All your pages content</p>

(3) использование опции javascript_delay

#Use it universally from the initializer or on the specific PDF rendering in the controller
#config/initializers/wicked_pdf.rb
WickedPdf.config = {
  javascript_delay: 3000,
  other_options...
}

(4) передайте опцию «дискретная» ось, иначе мы увидим только ось и не увидим данные для временных диаграмм (линия / область / и т. Д.).

#In the above template, wherever you render your chart
#app/views/users/profile.pdf.erb

<% content_for :head do %>
  <%= javascript_include_tag "some_cdn.com" %>
  <%= wicked_pdf_javascript_include_tag "chartkick" %>
<% end %>

<%= area_chart @data_retriever.time_based_data, discrete: true %>
<%= pie_chart @data_retriever.other_data %> # the default is discrete: false so no need for another option
person Alex Villa    schedule 10.03.2015
comment
Не могли бы вы пояснить? Вы имеете в виду, что вы не могли указать параметр WickedPdf в инициализаторе, только контроллер? Вы перезагружали сервер локально при изменении настроек? Инициализаторы загружаются только при ... инициализации приложения. Конфиги в контроллере будут обновлены при перезагрузке страницы. - person Alex Villa; 11.05.2015
comment
4-й вариант был тем, который сделал это за меня - большое вам спасибо за это! - person mattsch; 07.07.2016

Добавьте следующее в верхнюю часть представления, которое вы пытаетесь преобразовать в PDF:

  <%= wicked_pdf_javascript_include_tag "application", "chartkick" %>
person MKunz    schedule 13.10.2014
comment
Я сделал это, и мне также пришлось добавить javascript_delay на контроллере. Это потому, что я использую Highcharts, и в нем есть небольшая анимация ... Спасибо за помощь! - person Fábio Araújo; 18.12.2018

Я заставил его работать с ответом Алекса Виллы и из ответа на аналогичный вопрос, установив последнюю версию wkhtmltopdf и указав параметр javascript_delay в контроллере на шаге (3):

respond_to do |format|
  format.html
  format.pdf do
    render pdf: "filename",
    javascript_delay: 3000,
    template: 'template_path.pdf.erb',
    layout: 'pdf.html'
  end
end
person jhoanna    schedule 09.05.2015

Если у кого-то возникнет такая же проблема с Rails 4 в 2019 году, попробуйте заморозить версию chartkick на 2.3.5. Потому что из версии 3.0.0 убрали поддержку Rails ‹4.2. См. CHANGELOG.

gem 'chartkick', '2.3.5'

Добавьте это в начало заголовка в вашем файле просмотра pdf:

<%= javascript_include_tag "https://www.google.com/jsapi" %>
<%= wicked_pdf_javascript_include_tag "chartkick" %>

И замените гем wkhtmltopdf-binary на wkhtmltopdf-binary-edge. Я использовал версию 0.12.4.0.

gem 'wkhtmltopdf-binary-edge', '0.12.4.0'

Это все, что я сделал, и это сработало.

person Novarty    schedule 28.03.2019