2014-10-13 3 views
3

Я использую Rails 4, Wicked_PDF и Chartkick драгоценного камня
Для Google Charts я использую:ChartKick графики не показывают при визуализации в формате PDF с использованием Wicked_PDF

<% = 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 не находит ссылку на диаграммы, но я не уверен, как это исправить.
У кого-нибудь есть предложение?

Я нашел эту ссылку:
Render jQuery in wicked_pdf

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

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

ответ

4

Вы должны указать протокол 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" %> 

Вот как я это делаю в проекте шахты.

Cheers.

+0

Большое спасибо за вашу помощь по этому поводу. Ваше предложение решило мою проблему. – user3334207

+0

Рад это знать. – thesubroot

+1

У кого-нибудь еще была проблема с отображением только графиков с шириной 50% в PDF? –

1

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

<%= wicked_pdf_javascript_include_tag "application", "chartkick" %> 
+0

Я сделал, но все еще нет диаграмм и той же ошибки. – user3334207

3

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

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

(1) Не используя промежуточный подход и вместо этого используя один от рубина встроенных PDFs на основе офф макета 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 
+0

На шаге 3 он работал только в контроллере для меня. – jhoanna

+0

Не могли бы вы быть более ясными? Вы имеете в виду, что вы не можете указать параметр WickedPdf в инициализаторе, только контроллер? Вы перезапустили свой сервер локально при изменении настроек? Инициализаторы загружаются только ... инициализации приложения. Конфигурации в контроллере будут обновляться при перезагрузке страницы. –

+0

4-й вариант был тем, который сделал это для меня - большое вам спасибо за это! – mattsch

0

Я получил его на работу с ответом Alex Вильи и от ответа на аналогичный question, установив последнюю версию 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