好的,我自己来回答。在SuperUser上,我问了类似的问题(以更理论的方式关注答案),主要结论是:
没有一种字体可以支持整个 Unicode。
但幸运的是 pdf 支持后备字体,也支持prawn gem。
这是我的解决方案:
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”字体中,我为普通、斜体、粗体、粗体指定了相同的字体,没有样式。我是故意这样做的。根据我所遇到 的 gkai00mp字体没有粗体字符或斜体字符。因此,当斜体/粗体字符被渲染时,它将以正常样式打印(总比不渲染好)。
如果我没有为字体指定粗体/斜体字体(例如“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
然而,这适用于 ruby 1.9。Ruby 1.8.x 源代码只能处理 ASCII(更多信息请参见ruby 1.9 的 PC 演练,
但在 Rails 中您应该使用 I18n(国际化)
注3
Prawn 有非常棒的文档,只需从 github git clone prawn 并检查 ./manuals