Wicked PDF + шрифты + heroku + rails3.2

Я использую wicked_pdf с рельсами 3.2.11 и ruby ​​1.9.3 для создания PDF файла из HTML и развертывания в Heroku.

Мой файл pdf.css.scss.erb:

<% app_fullhost = Constants["app_fullhost"] %>

@font-face {
  font-family:'DosisMedium'; font-style:normal; font-weight:500;
  src: url(<%=app_fullhost%>/app/font/dosis/Dosis-Medium.ttf) format('woff');
}

*, body {
  font-family: "DosisLight", 'Times New Roman', 'Arial', sans-serif;
} 

где app_fullhost является точным хозяином, в разработке или производстве.

Мой макет PDF включает в себя, среди прочего:

%html{:lang => I18n.locale}
  %head
    %meta{:charset => "utf-8"}
    %title= content_for?(:title) ? yield(:title) : Settings.app_name
    = wicked_pdf_stylesheet_link_tag "pdf"

В production.rb у меня есть

config.assets.precompile +=%w(pdf.css)

Это работает без проблем в разработке, но на Heroku файл pdf не загружает нужный шрифт. Я также пробовал различные решения, такие как добавление их в production.rb:

config.assets.paths << "#{Rails.root}/app/assets/fonts"
config.assets.precompile += %w(*.svg *.eot *.woff *.ttf) 
config.assets.precompile += %w(.svg .eot .woff .ttf) 

и я также попытался изменить (в pdf.css.scss.erb):

@font-face {
  font-family:'Dosis'; font-style:normal; font-weight:500;
  src: url('Dosis-Medium.ttf') format('woff');
}

или

@font-face {
  font-family:'Dosis'; font-style:normal; font-weight:500;
  src: url(<%= asset_path('Dosis-Medium.ttf')%>) format('woff');
}

Шрифты находятся в assets/fonts, а также в public/app/font/dosis, а URL-адрес Heroku правильно отвечает:

..//myapp/app/font/dosis/Dosis-Medium.ttf" and 
..//myapp/assets/Dosis-Medium.ttf 

Как я могу загрузить шрифт на Heroku?

Ответ 1

wkhtmltopdf, программа, лежащая в основе wicked_pdf, является, как известно, фанкой, когда дело доходит до загрузки шрифтов через CSS. В некоторых системах он работает с абсолютными путями, иногда требует относительных путей. Даже если вы правильно определяете пути, это может быть отброшено неточным замедлением CSS и т.д. Есть десятки вопросов, касающихся этого только на SO.

Лучшее, самое гибкое и наиболее портативное решение, которое я нашел, это Base64-кодировать используемый вами шрифт и включать его непосредственно в файл CSS:

@font-face {
    font-family: 'OpenSans';
    src: url(data:font/truetype;charset=utf-8;base64,AAEAAAATAQA...
}

Ответ 2

Я столкнулся с этой проблемой и последовал совету, изложенному Arman H - я преобразовал шрифт в базу 64 и ссылался на него непосредственно в файле CSS/SCSS. Остальные шаги, которые я выполнил, очень похожи на те, которые описаны в исходном вопросе.

Я собрал полное описание (с ссылкой gitub на исходный код) здесь: http://apleroy.com/posts/custom-pdf-fonts-with-wicked_pdf-and-heroku

Сначала я наметил шрифт в каталоге шрифтов.

<%# /fonts/custom_fonts.css.scss.erb %>
@font-face {
    font-family: "SourceSansPro-Light";
    src: url('<%= asset_path("SourceSansPro-Light.otf") %>');
}

Затем, чтобы основать 64 кодировать шрифт, я использовал этот сайт (уже описанный в комментарии выше): http://www.opinionatedgeek.com/dotnet/tools/base64encode/. Вывод с кодировкой base-64 представляет собой случайную строку, состоящую из нескольких сотен строк буквенно-цифровых символов. Я скопировал этот вывод в новый файл pdf.css.scss:

<%# /stylesheets/pdf.css.scss %>
@font-face {
  font-family: 'Source Sans Pro Light';
  src: url(data:font/truetype;charset=utf-8;base64,T1RUTw-----THIS IS HUNDREDS OF LINES LONG -------sGAnBSvO7nBqXQ==)
}

В пределах фактической html-страницы (которая преобразуется в PDF) я сделал ссылку с использованием тега wicked_pdf stylesheet - как описано в исходном вопросе:

<%# views/pdf_pages/show.html.erb %>
<meta charset='utf-8' />
<%= wicked_pdf_stylesheet_link_tag "pdf" %>

Наконец, я предварительно скомпилировал таблицу стилей pdf, чтобы включить ее в конвейер для развертывания на Heroku:

#application.rb
config.assets.precompile += ['pdf.css']

Ответ 3

Позвольте мне убедиться, что я прав:

Сервер 1: построение PDF файла, необходимость в шрифтах и ​​вытягивание их из URL-адреса Это работает локально в dev, но не на герою.

Есть ли что-нибудь в журналах? (вы видите HTTP-запрос для шрифта?)

Вы сказали, что не загружают правильный шрифт. Разве это взорвать или просто сделать так, как будто он никогда не загружал шрифт (например, 404 на выборку шрифта).

Это работает, если вы не вытаскиваете файл шрифта из героку? (например, использовать aws или какой-либо другой шрифт из другого URL-адреса, как тест)

Вы пытаетесь выполнить тот же процесс, который выполняется в настоящий момент? У вас есть несколько динамиков или более одного процесса единорога, которые могут обрабатывать текущий процесс (построение pdf) и входящий запрос (обслуживающий файл шрифта).

Я видел, как люди запускали только один динозавр, но пытались запустить два http-события и столкнулись с проблемами. Если у вас есть только один динамик (вы не упоминали об этом иначе), добавьте еще один и посмотрите, что произойдет, или добавьте еще один процесс единорога.