Closed9

フォントについての知見のはきだめと、GoogleフォントがPDF作成に使えない問題のメモ

Kyohei FukudaKyohei Fukuda

次世代のフォント技術バリアブルフォントの世界: https://ics.media/entry/201008/

この問題を解決するため、今度はMicrosoftとAdobeが手を組んでOpenTypeフォントを開発します。TrueTypeをベースにPostScriptフォント形式をサポートしたもので、拡張子が複数パターン存在します。PostScript形式のものは.otf形式、TrueType形式のものは主に.ttfとなります。少しややこしいですが、.ttf形式のOpenTypeフォントは「TrueType形式のOpenTypeフォント」と呼んだりします。この違いは、TrueTypeフォントとPostScriptフォントのアウトラインの計算方法の違いに由来しています。

Kyohei FukudaKyohei Fukuda

そもそもなぜフォントについて調べる必要があるのかというと
下記の問題に悩まされている。
https://github.com/pdfme/pdfme/issues/124

Googleフォントから落としたフォントでPDF作成したらフォントがちゃんとレンダリングできない。

おそらく大元の原因はこれらのissueから問題を把握することができる?
とにかくNoto系のフォントで問題が発生している

説明がややこしいがpdfmeはpdf-libを使ってpdf作成処理を行なっているが、pdf-lib内で使われているフォント関連の処理が上記のライブラリをフォークして作っていたりするのでそれが問題なのかも。

もしかするとライブラリをアップデートしたりすれば治る可能性は0ではないが、現状は回避方法があり
というNoto(源ノ角)をttfに変換した下記のフォントファイルを使えばちゃんとフォントがレンダリングされる

醤ノ角ゴシック / 醤ノ明朝
https://github.com/3846masa/sauce-han-fonts

Kyohei FukudaKyohei Fukuda

フォントファイルについて知識があった方がデバッグやパターンが分析しやすそうなので調べているという所存。

とりあえずGoogle fontでもちゃんとPDFでフォントが表示されるようにしたい

Kyohei FukudaKyohei Fukuda
Kyohei FukudaKyohei Fukuda

あまり確信がないのだがうまく行った上記で説明した
https://github.com/pdfme/pdfme/issues/124
のIssueでうまく表示されなかったフォントをレンダリングできるようになった。

どのようにやったか
試したフォントは https://fonts.google.com/specimen/Zen+Kurenaido?subset=japanese&noto.script=Jpan

  1. https://glyphsapp.com/ をダウンロードしてうまく表示できないフォントファイルを読み込む
  2. export でttfとしてエクスポートする(うまくいかない場合はこちらのトラブルシューティングを試す)
  1. 生成したフォントならうまくレンダリングできる
Kyohei FukudaKyohei Fukuda

なにが起こっているのか確信はないのだが、https://3846masa.hatenablog.jp/entry/2017/10/25/183205 にあるように OpenType がうまく使えないソフトウェアがあったりする
その中に devongovett/pdfkit があり、それは自分が依存しているソフトである。

おそらく OpenType フォント特性 がうまく読み取れないのではないかと思う

そのため TypeTrue フォントに変換する必要があるのでやったら動いた
フォント作成ソフトはいろいろあるんだが、なんとなく良さそうなGlyphsを使って変換した

日本語フォントの場合はデータが巨大すぎるので カーニングペアが多すぎるか、大きなカーニンググループと多くのグループ例外と例外グループカーニングペアを持つカーニングをしている などが原因なのではないかという仮説

Kyohei FukudaKyohei Fukuda

ちょっと曖昧すぎるが、一旦問題が少しわかったので一旦クローズする

Kyohei FukudaKyohei Fukuda

NotoSansJP-Regular.otfとNotoSerifJP-Regular.otfをGoogle fontからダウンロードして Glyphs 3でttf変換しようとした。

  • NotoSerifJP-Regularはエクスポート時のオプションでエラーになったがすんなりと変換できた。
  • NotoSansJP-Regularはエクスポート時にエラーはでないがアルファベットの文字幅が広がる問題にあたった
    • FontForgeで生成した日本語TrueTypeフォント文字幅広すぎ対策 を見てttxでxAvgCharWidthをチェックしたがおかしい部分はなかった
    • 日本語フォントの場合はデータが巨大すぎるので カーニングペアが多すぎるか、大きなカーニンググループと多くのグループ例外と例外グループカーニングペアを持つカーニングをしている などが原因なのではないかという仮説 があったが エラーメッセージなどは特にないのだが、トラブルシューティングを実施してみた。font features の markを無効化した。
    • するとアルファベットの文字幅が広がる問題は解決された
Kyohei FukudaKyohei Fukuda

https://fonts.google.com/specimen/Zen+Kurenaido?subset=japanese&noto.script=Jpan
について追記。
ダウンロードするとZenKurenaido-Regular.ttf とそもそもttfとして返却されるが、これはttfだけどうまくレンダリングできない。ただ拡張の問題というよりもフォント作成ソフト上でなにかおかしくなっているケースもあるということ。

自分はGlyphs3を使ってttf->ttf変換をエラーを解消しながらしている。
厄介なのが実際にpdfを作成するまでフォントがレンダリングできているかわからないところ。

このスクラップは2023/01/17にクローズされました