邪恶的PDF +字体+ heroku + rails3.2

Ste*_*zin 11 fonts heroku wicked-pdf ruby-on-rails-3.2

我正在使用wicked_pdf和rails 3.2.11以及ruby 1.9.3从HTML生成PDF并部署到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;
} 
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

在production.rb我有

config.assets.precompile +=%w(pdf.css)
Run Code Online (Sandbox Code Playgroud)

这在开发中没有问题,但在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) 
Run Code Online (Sandbox Code Playgroud)

我也尝试改变(在pdf.css.scss.erb中):

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

要么

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

字体在inoku assets/fonts中,public/app/font/dosis并且在Heroku上的url响应正确:

..//myapp/app/font/dosis/Dosis-Medium.ttf" and 
..//myapp/assets/Dosis-Medium.ttf 
Run Code Online (Sandbox Code Playgroud)

如何在Heroku上加载字体?

Arm*_*n H 9

wkhtmltopdfwicked_pdf通过CSS加载字体方面,这个程序底层是非常时髦的.在某些系统上,它使用绝对路径,有时需要相对路径.即使你正确地获得了路径,它也可能因不准确的CSS减速等而被抛弃.仅仅在SO上就有很多关于这个的问题.

我发现最好,最灵活,最便携的解决方案是对您尝试使用的字体进行Base64编码,并将其直接包含在CSS文件中:

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


J_M*_*rey 1

让我看看我是否有这个权利:

服务器 1:构建 PDF,需要字体,并从 URL 中提取它们 这可以在 dev 本地运行,但不能在 heroku 上运行。

日志中有什么内容吗?(你看到字体的http请求了吗?)

你说它没有加载正确的字体。它是否会崩溃,或者只是呈现为好像从未加载过字体(例如,字体获取时出现 404)。

如果你不从heroku中提取字体文件,这是否有效?(例如使用 aws 或其他 URL 中的其他字体作为测试)

您是否从当前正在运行的同一服务器进程中提取数据?您是否有多个 dyno 或多个 unicorn 进程可以处理当前进程(构建 pdf)和传入请求(提供字体文件)

我见过人们只运行一个 dyno,但尝试运行两个 http 事件,却遇到了问题。如果您只有一个测功机(您没有提到其他情况),请添加另一个测功机并看看会发生什么,或者添加另一个独角兽进程。