14

我正在尝试使用 ruby​​ 在 OS X 上使用 Prawn 生成 PDF。我有以下内容:

font 'Arial'

Arial 安装在我的 Mac 上。但是当我尝试生成 PDF 时,出现以下错误:

Prawn::Errors::UnknownFont in ProjectsController#show
Arial is not a known font.

我怎样才能让这种常用字体在 Prawn 中工作?事实上,除了 Helvetica 或 Times New Roman 之外,几乎任何其他东西都会引发同样的错误。这是 Rails 3.2 应用程序的一部分。

如果我尝试直接加载字体 ttf 文件,根据 Ashish 在下面的建议,我会收到一条Bad font family消息:

RuntimeError (Bad font family):
  app/pdfs/quote_sheet_pdf.rb:29:in `page_top'
  app/pdfs/quote_sheet_pdf.rb:12:in `initialize'
  app/controllers/projects_controller.rb:9:in `new'
  app/controllers/projects_controller.rb:9:in `block (2 levels) in show'
  app/controllers/projects_controller.rb:7:in `show'
  config/initializers/quiet_assets.rb:7:in `call_with_quiet_assets'
4

3 回答 3

29

如果您使用:style选项来调用text,例如

text "Hello World", :style => :italic

那么你当时使用的字体需要有一个关联的字体系列,否则你会得到你看到的“Bad font family”错误,例如:

Prawn::Document.generate("output.pdf") do
  font "/Library/Fonts/Arial.ttf"
  text "Hello World", :style => :italic
end

产生:Bad font family (RuntimeError)

解决此问题的一种方法是每次要更改样式时始终指定所需的确切字体文件,例如

font "/Library/Fonts/Arial Italic.ttf"
text "Hello World"

更好的选择是创建具有所需样式的字体系列:

Prawn::Document.generate("output.pdf") do

  font_families.update("Arial" => {
    :normal => "/Library/Fonts/Arial.ttf",
    :italic => "/Library/Fonts/Arial Italic.ttf",
    :bold => "/Library/Fonts/Arial Bold.ttf",
    :bold_italic => "/Library/Fonts/Arial Bold Italic.ttf"
  })

  font "Arial"
  text "Hello World"
  text "Hello World", :style => :italic
  text "Hello World", :style => :bold
  text "Hello World", :style => :bold_italic
end

设置好字体系列后,您可以将Arial其用作字体名称,并且可以轻松使用不同的样式。

于 2012-08-18T20:45:45.540 回答
5

我在尝试加载这样的字体时遇到了同样的问题。

@pdf.font_families.update(
    'Arial' => { :normal => Rails.root.join('public/arial.ttf'),
                 :bold   => Rails.root.join('public/arialbd.ttf') }
)

事实证明 Rails.root.join 没有返回明确的 String 对象。解决方案是在表达式末尾添加 to_s。

@pdf.font_families.update(
  'Arial' => { :normal => Rails.root.join('public/arial.ttf').to_s,
               :bold   => Rails.root.join('public/arialbd.ttf').to_s }
)

由 TheR

于 2013-06-07T10:41:07.867 回答
4

尝试将 arial.ttf 的完整路径传递给字体函数,如下所示 -

Prawn::Document.generate("custom_font_usage.pdf") do
  font "/path/to/fonts/arial.ttf"
  text "this is a test " * 20 
end

另请参阅一些相关的链接 -

  1. Prawn 中有多少种字体可用?
  2. 大虾文档 - http://rubydoc.info/gems/prawn/0.12.0/frames
于 2012-08-14T17:11:24.743 回答