-->

妖兽PDF +字体+的Heroku + rails3.2(Wicked PDF +fonts+her

2019-07-19 10:19发布

我使用wicked_pdf与轨道3.2.11和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;
} 

其中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在Heroku和网址正确响应与:

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

我怎样才能得到的字体在Heroku上加载?

Answer 1:

wkhtmltopdf ,基本程序wicked_pdf ,是出了名时髦,当它通过CSS来加载字体。 在一些它的工作原理与绝对路径的系统,有时它需要相对路径。 即使你得到正确的路径,它可能会不准确的CSS减速揭去,等有几十如此孤独关于这只是问题。

我发现最好的,最灵活和最便携的soltion是为Base64编码你想使用的字体,并直接包含到CSS文件:

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


Answer 2:

我就遇到了这个问题,并随后阿尔曼^ h概述的建议 - 我转换的字体对于底座64直接在CSS / SCSS文件中引用它。 我跟着步骤的其余部分都非常相似,那些在原来的问题概括。

我把一个完整的描述(用github上链接到源代码)在这里: 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/ 。 基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样式表标签提及 - 在原来的问题解决:

<%# 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']


Answer 3:

让我看看,如果我有这个权利:

服务器1:建立一个PDF,需要的字体,并从URL这dev的本地工作拉他们,而不是在Heroku。

有没有在日志什么? (你看到字体的http请求?)

你说这不加载正确的字体。 它炸掉,或者只是渲染,就好像它从来没有加载的字体(如在字体上取404)。

这是否工作,如果你不拉从Heroku的字体文件? (像使用AWS或从另一个URL一些其它字体只是作为测试)

你是从当前运行在同一个服务器进程拉动? 你有一个以上的测功机或一个以上麒麟工艺可以处理当前进程(建立PDF),以及传入的请求(服务字体文件)

我见过人们只运行一个单一的赛道,但尝试运行两个HTTP事件,以及遇到问题。 如果你只有一个赛道(你不提,否则),再添一个看看会发生什么,或添加其他麒麟过程。



文章来源: Wicked PDF +fonts+heroku+rails3.2