Rails4 + PDFKit + шрифты + Heroku не работают

Я пытаюсь решить проблему со шрифтом на героку с помощью PDFkit уже несколько дней, и у меня ничего не работает....

Я уже сделал несколько решений, таких как: преобразовать LucidaHW из Squirrel и сделать следующее...

@font-face {
    font-family: 'lucida_handwritingitalic';
    src: url(data:application/x....

или это решение с .font на этом веб-сайте: http://www.mobalean.com/blog/2011/08/02/pdf-generation-and-heroku

или используя:

kit.stylesheets << "#{Rails.root.join("public","stylesheets", "pdf", "pdf.css.scss")}"

Я также переместил свой pdf.css.scss в папку поставщика, в общую папку и ничего...

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


person C404    schedule 13.07.2014    source источник


Ответы (2)


Я столкнулся с похожей проблемой несколько месяцев назад. Это то, что я делаю прямо сейчас, и это отлично работает для меня:

1. Подавать активы в base64:

добавьте этот вспомогательный метод:

def asset_data_base64(path)
  asset = Rails.application.assets.find_asset(path)
  throw "Could not find asset '#{path}'" if asset.nil?

  base64 = Base64.encode64(asset.to_s).gsub(/\s+/, "")
  "data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
end

и в вашем шаблоне включите такие активы: (в примере используется haml)

  = stylesheet_link_tag(asset_data_base64('pdf/pdf.css'))
  = javascript_include_tag(asset_data_base64('pdf/pdf.js'))

2.пользовательские шрифты

переместите все ваши шрифты в папку в вашем проекте. (я поместил свой под vendor/assets/fonts), затем добавьте новый файл инициализатора в свой config/initializers

if Rails.env.production?
  font_dir = File.join(Dir.home, ".fonts")
  Dir.mkdir(font_dir) unless Dir.exists?(font_dir)

  Dir.glob(Rails.root.join("vendor","assets","fonts", "*")).each do |font|
    target = File.join(font_dir, File.basename(font))
    File.symlink(font, target) unless File.exists?(target)
  end
end

замените Rails.root.join("vendor","assets","fonts", "*") на путь к папке, в которую вы поместили все файлы шрифтов.

затем в вашем css не используйте font-face, используйте имя шрифта напрямую, например. font-family: Gotham;

Кроме того, не используйте резервные шрифты! В некоторых версиях wkhtmltopdf всегда используется резервный шрифт, если он предоставлен.

=============================================

  1. Я научился трюку base64 отсюда: https://github.com/mileszs/wicked_pdf/issues/257
  2. Решение для пользовательских шрифтов было найдено здесь: http://www.mobalean.com/blog/2011/08/02/pdf-generation-and-heroku
person Yurui Zhang    schedule 14.07.2014
comment
Спасибо за ваш ответ. Я собираюсь попробовать! - person C404; 15.07.2014
comment
Привет, извините за мой поздний ответ. Первый шаг, похоже, работает нормально, но у меня проблема со ссылкой на шрифт. Если у меня есть файл lucidahw-webfont.ttf, то как мне его вызвать в pdf.css? - person C404; 18.07.2014
comment
Также я подключился к героку, запустив bash, и не вижу папки .fonts, созданной инициализатором. Учитывая, что вы связываете шрифты с базовым именем файла, должно быть, почему это не работает? - person C404; 18.07.2014
comment
Это зависит от имени шрифта... попробуйте открыть файл шрифта с помощью редактора/просмотрщика шрифтов и посмотреть, как он называется. Кроме того, когда вы запускаете bash, он не инициализирует приложение rails, поэтому инициализаторы не выполняются. - person Yurui Zhang; 18.07.2014
comment
Юрий Рэй Чжан, ты сделал мой день ;) Отлично работает (наконец-то)! - person C404; 18.07.2014

Попробуйте поместить шрифт в папку .fonts в корне вашего приложения и отправить его в Heroku — просто обратитесь к шрифту через семейство шрифтов, а не через src. Вот как я использую пользовательские шрифты на Heroku с wkhtmltopdf, и это работает для меня.

person John Beynon    schedule 13.07.2014
comment
Привет, спасибо за ответ. Если я добавлю lucidaHW.ttf в Rails.root/.fonts, я просто назову его семейством шрифтов: 'lucidaHW'? Потому что сейчас он не работает :/ - person C404; 13.07.2014