6

我正在使用Prawn gem 在Ruby on Rails中创建 pdf 文档生成器,但我遇到了一个问题,即当我有中文、日文和西里尔字符时,它们显示不正确。我用谷歌搜索了这是因为“当我生成字体时,我需要指定,应该用什么字体呈现 pdf 文本”

现在这不是问题,而是我的文档将包含gTLD 支持的所有不同可能字符这一事实。

问题一:

您知道任何用于生成包含尽可能多字符(亚洲、欧洲、符号等)的 pdf 文档的字体吗?理想情况下,gTLD 支持的所有字符。

我知道Prawn默认包含gkai00mp.ttf但它专注于中文字符,我正在寻找将它们全部包含在内的许可(就像 PokeMon 一样,必须抓住它们;我知道我要求太多但仍然...... .)

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

问题2

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

4

2 回答 2

8

好的,我自己来回答。在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

于 2012-06-19T08:55:57.997 回答
2

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

于 2015-04-10T18:26:59.580 回答