6

Ruby on Railsエビの宝石を使ってPDFドキュメントのジェネレーターを作成していますが、中国語、日本語、キリル文字を使用すると、正しく表示されないという問題が発生しました。「フォントを生成するときに指定する必要があるのは、PDFテキストをどのフォントでレンダリングする必要があるか」という理由でグーグルで検索しました。

これは問題ではありませんが、私のドキュメントには、gTLDがサポートする可能性のあるさまざまな文字がすべて含まれているという事実があります。

質問1:

できるだけ多くの文字(アジア、ヨーロッパ、記号など)を含むPDFドキュメントを生成するためのフォントを知っていますか?理想的には、gTLDがサポートするすべての文字。

エビにはデフォルトでgkai00mp.ttfが含まれていることは知っていますが、漢字に焦点を当てており、それらすべてを含めることができるかどうかを探しています(PokeMonのように、すべてをキャッチする必要があります。 。)

もう1つの問題は、クライアントがこのドキュメントを開いたときです。

質問2

pdfはPrawnによって生成され、私のフォントがpdfファイルに含まれているので、他のコンピューターがそれを開くと、フォントが表示されますか?これはデフォルトの標準ですか?または、この機能を確保/強制する必要がありますか?

4

2 に答える 2

8

わかりました、自分で答えるつもりです。スーパーユーザーについて、私は同様の質問をしました(より理論的な方法での回答に焦点を当てています)、そして主な結論は次のように答えることでした:

Unicode全体をサポートする単一のフォントはありません。

しかし幸いなことに、pdfはフォールバックフォントとエビの宝石もサポートしています。

これが私の解決策です:

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」フォントでは、スタイルなしで、通常、斜体、太字、太字の同じフォントを指定しています。私はこれをわざとやっています。私が経験していたことから、 g​​kai00mpフォントには太字の文字や斜体の文字がありません。したがって、斜体/太字の文字がレンダリングされると、通常のスタイルで印刷されます(まったくレンダリングしないよりも優れています)。

フォントに太字/斜体のフォントを指定しない場合(例:「Kai」)。

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

..そしてあなたはkaiにフォールバックするスタイル付きcharをレンダリングしようとします...

 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

ただし、これはruby1.9から機能します。Ruby 1.8.xソースはASCIIのみを処理できます(PCによるruby 1.9ウォークスルーで詳しく説明し ますが、RailsではI18n(国際化)を使用する必要があります

注3

エビには本当に素晴らしいドキュメントがあります。githubからエビのクローンを作成して./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 に答える