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

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

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

问题1:

你知道生成pdf文件的任何字体,包括尽可能多的字符(亚洲,欧洲,符号……)? 理想情况下,gTLD支持的所有字符。

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

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

问题2

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

好的,我自己去回答。 在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”字体,我指定相同的字体为普通,斜体,粗体,bold_italic没有样式。 我是故意这样做的。 从我遇到的gkai00mp字体没有粗体字符或斜体字符。 因此,当斜体/粗体字符被渲染时,它将以正常样式打印(这比完全渲染更好)。

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

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

..并且你尝试渲染风格的字母,它将回落到kai …

  text "址 foo", :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 

然而这可以形成ruby1.9。 Ruby 1.8.x源代码只能处理ASCII(更多内容来自于ruby 1.9的PC演练,但是在Rails中你应该使用I18n(国际化)

注3

Prawn有很棒的文档,只需从github获取git clone prawn并检查./manuals

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