Prawn PDF支持英语和Japenese /中文/泰语/韩语同样的PDF

时间:2016-04-11 21:37:23

标签: ruby-on-rails pdf fonts localization prawn

我正在使用ROR和Prawn生成PDF。 PDF包括英文(表格标签)和日语或其他有限元语言(用户输入的数据)。

我已经找到了相关的问题,建议使用ipamp.ttf。我安装了那个字体,它打印出日本的精美。麻烦的是,它不支持英语!我需要两个。

如果重要,这就是我安装ipamp的方法。我刚刚在initialize方法中调用了字体:

font("lib/assets/ipamp.ttf")

我发现了Google的Noto字体,但它们采用ttc格式,Prawn无法使用。

我正在寻找一种支持所有欧盟和远东语言的解决方案,同时在一个PDF文档中,没有一堆逻辑来确定我试图显示的文本是欧盟/拉丁语还是远东语(并根据该切换字体)。看起来很脆弱。

字体文件的大小不会引起关注,因为PDF将在服务器上呈现并作为PDF发送到客户端。

谢谢!

1 个答案:

答案 0 :(得分:2)

这是解决方案,从这篇文章(this post)和一些反复试验拼凑而成。

关键是Prawn支持后备字体。你必须将它们下载到你的项目中,然后更新Prawn的字体系列以包含它们,然后包含一个名为“fallback_fonts”的方法供Prawn使用,当它意识到它有一个unicode字符,它不知道如何渲染。

class ResultsPdf < Prawn::Document

  def initialize(device)
    super()
    @device = device
    set_fallback_fonts
    page_title         #typically English
    persons_name       #typically Japanese
  end

 def set_fallback_fonts
    ipamp_path = "lib/assets/ipamp.ttf"
    ipamp_spec  = { file: ipamp_path, font: 'IPAPMincho'}

    #don't use a symbol to define the name of the font!
    font_families.update("ipamp" => {normal: ipamp_spec,
                                    bold: ipamp_spec,
                                    italic: ipamp_spec,
                                    bold_italic: ipamp_spec})
  end

  def fallback_fonts
    ["ipamp"]
  end

  def page_title
    # device name is typically in English
    text "#{@device.name}", :size => 15, :style => :bold, :align => :center
  end

  def persons_name
    # owner name can be in any language, including Japanese
    # you don't have to specify :fallback_font here.  Prawn will use your method.
    text "Name: #{@device.owner_last_name}"
  end

end