如何更改Prawn中的字体

时间:2016-11-17 09:40:38

标签: ruby-on-rails pdf prawn

我要做的是使用Prawn生成PDF,同时使用一些特定于语言的字符。

结果我收到以下错误:

raise Prawn::Errors::IncompatibleStringEncoding,
   "Your document includes text that's not compatible with the  Windows-1252 character set.\n" \
   "If you need full UTF-8 support, use TTF fonts instead of PDF's built-in fonts\n."

所以我尝试通过这样做来改变字体:

# app/models/prawn/change_font_decorator.rb

Prawn::Document.generate("output.pdf") do
  font_families.update("Arial" => {
    :normal => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
    :italic => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
    :bold => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf"),
    :bold_italic => Rails.root.join("app/assets/fonts/OpenSans-Regular.ttf")
  })
  font "Arial"
end

然而,我在尝试生成PDF文件时遇到了同样的错误。

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:20)

prawn manual是一个很好的参考,包括有关字体用法的部分。 “外部字体”部分与您的问题特别相关。

这是一个应该有效的基本案例,虽然它不支持粗体和斜体:

custom-element[style] {
   height:50px !important;
}

要使用粗体和斜体,最好注册与其中一种标准PDF字体不冲突的字体系列:

!important

答案 1 :(得分:2)

如果您使用initialize构建PDF,则只需在initialize方法中更新字体系列,然后设置所需的字体。

class InvoicePdf < Prawn::Document

  def initialize()
    super()
    self.font_families.update("DejaVuSans" => {:normal => "#{Rails.root}/public/DejaVuSans.ttf"})
    font "DejaVuSans"
    business_logo
    invoice_items
    footer
  end

  def business_logo
    ##stuff here
  end

end

答案 2 :(得分:-1)

我实际上进入了gems文件夹并进入了Prawn / font.rb。

我发现了以下功能:

white-space: pre-line

我对其进行了编辑,以包含Arial:

def font_families
  @font_families ||= Hash.new { |h,k| h[k] = {} }.merge!(
    { "Courier"     => { :bold        => "Courier-Bold",
                         :italic      => "Courier-Oblique",
                         :bold_italic => "Courier-BoldOblique",
                         :normal      => "Courier" },

      "Times-Roman" => { :bold         => "Times-Bold",
                         :italic       => "Times-Italic",
                         :bold_italic  => "Times-BoldItalic",
                         :normal       => "Times-Roman" },

      "Helvetica"   => { :bold         => "Helvetica-Bold",
                         :italic       => "Helvetica-Oblique",
                         :bold_italic  => "Helvetica-BoldOblique",
                         :normal       => "Helvetica" }              
    })
end

和中提琴!它起作用了!