用于生成pdf的任何字体都可以处理中文,西里尔文...?

时间:2012-06-18 10:45:08

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

我在 Ruby on Rails 中使用 Prawn gem创建pdf文档的生成器,我想出了当我有中文,日文和西里尔文字符时的问题它们显示不正确。 我发现它是因为"当我生成字体时我需要指定,pdf文本应该使用" 呈现什么字体。

现在这不是问题,但事实上我的文件将包含gTLD supports所有不同的字符。

问题1:

您是否知道生成pdf文档的任何字体,其中包含尽可能多的字符(亚洲,欧洲,符号......)?理想情况下,gTLD支持的所有字符。

我知道 Prawn 默认情况下包含 gkai00mp.ttf ,但它专注于中国字符,我正在寻找允许将它们全部包含在内(如PokeMon,必须抓住他们;我知道我要求的太多但仍然......)

另一个问题是当客户打开此文档时:

问题2

由Prawn生成的pdf包括我在pdf文件中的字体,所以当其他计算机打开它时,字体会出现吗?这是默认标准吗?或者我需要确保/强制执行此功能?

2 个答案:

答案 0 :(得分:8)

好的,我自己去回答。在SuperUser我问了类似的问题(以更理论的方式关注答案),主要结论是回答:

  

没有一种字体支持整个Unicode。

但幸运的是,pdf支持后备字体,而 prawn 也支持。

这是我的解决方案:

1 /设置您的后备字体

  kai = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf"
  action_man_path = "#{Prawn::BASEDIR}/data/fonts/Action Man.dfont"
  dejavu = "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"

  font_families.update("dejavu" => {
    :normal      => dejavu,
    :italic      => dejavu,
    :bold        => dejavu,
    :bold_italic => dejavu
  })

  #Times is defined in prawn
  font_families.update("times" => {
    :normal => "Times-Roman",
    :italic      => "Times-Italic",
    :bold        => "Times-Bold",
    :bold_italic => "Times-BoldItalic"
  })

  font_families.update("action_man" => {
    :normal      => { :file => action_man_path, :font => "ActionMan" },
    :italic      => { :file => action_man_path, :font => "ActionMan-Italic" },
    :bold        => { :file => action_man_path, :font => "ActionMan-Bold" },
    :bold_italic => { :file => action_man_path, :font => "ActionMan-BoldItalic" }
  })

  font_families.update(
      "kai" => {
        :normal => { :file => kai, :font => "Kai" },
        :bold   => kai,
        :italic => kai,
        :bold_italic => kai
       }
    )

def fallback_fonts
  ["dejavu", "times", 'kai', 'action_man']
end

2 /致电

 font("Helvetica", size: 14) do  #keyword "Helvetica" is specified in Prawn by default
   text "址 foo", :fallback_fonts => fallback_fonts 
 end

现在,我只是默认使用Prawn中包含的字体,但是这样你可以添加几个不同字符集的字体,并将它们指定为后备

例如,您可以将字体放在Rails根目录中的某个位置,然后从那里包含它们

“Kai”字体中的

注意,我指定了相同的字体,正常,斜体,粗体,bold_italic没有样式。我是故意这样做的。从我遇到的 gkai00mp 字体开始,没有粗体字符或斜体字符。因此,当斜体/粗体字符被渲染时,它将以正常样式打印(这比完全渲染更好)。

如果我没有为字体指定粗体/斜体字体(exaple“Kai”)..

  font_families.update(
      "kai" => {
        :normal => { :file => kai, :font => "Kai" }
        }
    )

..并且你尝试渲染风格化的字符,它会回落到kai ...

 text "<b>址 foo</b>", :fallback_fonts => fallback_fonts, :inline_format=>true 

......我会得到

Prawn::Errors::UnknownFont in Foo

  is not a known font. 

注2:如果您想将非ascii字符放入ruby文件,则需要将编码放在文件顶部

# coding: utf-8

class Foo
...
end
然而,这可以形成红宝石1.9。 Ruby 1.8.x源代码只能处理ASCII(ruby 1.9 walkthrough by P.C.中更多内容 但在Rails中你应该使用I18n(国际化)

注3

Prawn有很棒的文档,只是来自github的git clone prawn并检查./manuals

答案 1 :(得分:2)

2014年,谷歌发布了诺托字体(https://www.google.com/get/noto/),其中包括对各种语言的支持。您可以使用ttf,otf字体或嵌入完整的集合ttc来支持您想要的语言。 对于中文,日文和韩文,NotoSansCJK运作良好。